7digital 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. data/README.rdoc +7 -0
  2. data/lib/peachy_patchy.rb +14 -0
  3. data/lib/sevendigital.rb +53 -0
  4. data/lib/sevendigital/api_operator.rb +31 -0
  5. data/lib/sevendigital/api_operator_cached.rb +23 -0
  6. data/lib/sevendigital/api_request.rb +24 -0
  7. data/lib/sevendigital/client.rb +124 -0
  8. data/lib/sevendigital/default_configuration.yml +2 -0
  9. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +52 -0
  10. data/lib/sevendigital/digestion_tract/artist_digestor.rb +31 -0
  11. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +27 -0
  12. data/lib/sevendigital/digestion_tract/digestor.rb +66 -0
  13. data/lib/sevendigital/digestion_tract/format_digestor.rb +21 -0
  14. data/lib/sevendigital/digestion_tract/label_digestor.rb +20 -0
  15. data/lib/sevendigital/digestion_tract/pager_digestor.rb +23 -0
  16. data/lib/sevendigital/digestion_tract/price_digestor.rb +25 -0
  17. data/lib/sevendigital/digestion_tract/release_digestor.rb +52 -0
  18. data/lib/sevendigital/digestion_tract/track_digestor.rb +37 -0
  19. data/lib/sevendigital/management/artist_manager.rb +39 -0
  20. data/lib/sevendigital/management/manager.rb +11 -0
  21. data/lib/sevendigital/management/release_manager.rb +51 -0
  22. data/lib/sevendigital/management/track_manager.rb +18 -0
  23. data/lib/sevendigital/model/api_response.rb +13 -0
  24. data/lib/sevendigital/model/artist.rb +37 -0
  25. data/lib/sevendigital/model/chart_item.rb +9 -0
  26. data/lib/sevendigital/model/format.rb +9 -0
  27. data/lib/sevendigital/model/label.rb +9 -0
  28. data/lib/sevendigital/model/price.rb +11 -0
  29. data/lib/sevendigital/model/release.rb +34 -0
  30. data/lib/sevendigital/model/sevendigital_error.rb +3 -0
  31. data/lib/sevendigital/model/sevendigital_object.rb +51 -0
  32. data/lib/sevendigital/model/track.rb +8 -0
  33. data/lib/sevendigital/pager.rb +17 -0
  34. data/lib/sevendigital/proxy_police.rb +24 -0
  35. data/lib/sevendigital/version.rb +3 -0
  36. data/spec/api_operator_cached_spec.rb +47 -0
  37. data/spec/api_operator_spec.rb +108 -0
  38. data/spec/api_request_spec.rb +27 -0
  39. data/spec/client_spec.rb +46 -0
  40. data/spec/data/config/sevendigital.yml +5 -0
  41. data/spec/data/configuration_env_override.yml +5 -0
  42. data/spec/data/configuration_override.yml +1 -0
  43. data/spec/digestion_tract/api_response_digestor_spec.rb +74 -0
  44. data/spec/digestion_tract/artist_digestor_spec.rb +83 -0
  45. data/spec/digestion_tract/chart_digestor_spec.rb +54 -0
  46. data/spec/digestion_tract/format_digestor_spec.rb +40 -0
  47. data/spec/digestion_tract/label_digestor_spec.rb +35 -0
  48. data/spec/digestion_tract/pager_digestor_spec.rb +52 -0
  49. data/spec/digestion_tract/price_digestor_spec.rb +57 -0
  50. data/spec/digestion_tract/release_digestor_spec.rb +102 -0
  51. data/spec/digestion_tract/track_digestor_spec.rb +107 -0
  52. data/spec/management/artist_manager_spec.rb +108 -0
  53. data/spec/management/release_manager_spec.rb +178 -0
  54. data/spec/management/track_manager_spec.rb +52 -0
  55. data/spec/model/api_response_spec.rb +32 -0
  56. data/spec/model/artist_spec.rb +122 -0
  57. data/spec/model/release_spec.rb +111 -0
  58. data/spec/pager_spec.rb +8 -0
  59. data/spec/proxy_police_spec.rb +49 -0
  60. data/spec/spec_helper.rb +48 -0
  61. data/spec/test-xml/methods/artist/byTag/top.xml +51 -0
  62. data/spec/test-xml/methods/artist/details.xml +10 -0
  63. data/spec/test-xml/methods/artist/releases.xml +545 -0
  64. data/spec/test-xml/methods/artist/similar.xml +40 -0
  65. data/spec/test-xml/methods/artist/toptracks.xml +280 -0
  66. data/spec/test-xml/methods/release/bydate.xml +174 -0
  67. data/spec/test-xml/methods/release/bytag/top.xml +151 -0
  68. data/spec/test-xml/methods/release/chart.xml +182 -0
  69. data/spec/test-xml/methods/release/details.xml +49 -0
  70. data/spec/test-xml/methods/release/recommend.xml +90 -0
  71. data/spec/test-xml/methods/release/tracks.xml +29 -0
  72. data/spec/test-xml/methods/track/chart.xml +150 -0
  73. data/spec/test-xml/methods/track/details.xml +31 -0
  74. data/spec/test-xml/objects/artist.xml +7 -0
  75. data/spec/test-xml/objects/artist_chart_item.xml +8 -0
  76. data/spec/test-xml/objects/artist_list.xml +23 -0
  77. data/spec/test-xml/objects/artist_list_empty.xml +5 -0
  78. data/spec/test-xml/objects/price.xml +8 -0
  79. data/spec/test-xml/objects/release.xml +40 -0
  80. data/spec/test-xml/objects/release_chart_item.xml +34 -0
  81. data/spec/test-xml/objects/release_list.xml +19 -0
  82. data/spec/test-xml/objects/release_list_empty.xml +5 -0
  83. data/spec/test-xml/objects/track.xml +34 -0
  84. data/spec/test-xml/objects/track_chart_item.xml +28 -0
  85. metadata +151 -0
@@ -0,0 +1,3 @@
1
+ module Sevendigital
2
+ class SevendigitalError < StandardError; end
3
+ end
@@ -0,0 +1,51 @@
1
+ class Class
2
+
3
+ def sevendigital_basic_property(*properties)
4
+ @basic_properties = []
5
+ properties.each do |property|
6
+ @basic_properties << "@#{property}".to_sym
7
+ sevendigital_extended_property property, :get_details
8
+ end
9
+ end
10
+
11
+ def sevendigital_extended_property(accessor, get_method = nil)
12
+
13
+ get_method ||= "get_#{accessor.to_s}".to_sym
14
+ demand_method = "demand_#{accessor.to_s}".to_sym
15
+
16
+ define_method(demand_method) do |*options|
17
+ if instance_variable_get("@#{accessor}") == nil then
18
+ value = send(get_method, *options)
19
+ instance_variable_set("@#{accessor}", value) if get_method != :get_details
20
+ end
21
+ end
22
+
23
+ define_method("#{accessor}") do |*options|
24
+ send(demand_method, *options) if instance_variable_get("@#{accessor}").nil? && @api_client.configuration.lazy_load?
25
+ instance_variable_get("@#{accessor}")
26
+ end
27
+
28
+ define_method("#{accessor}=") do |val|
29
+ instance_variable_set("@#{accessor}",val)
30
+ end
31
+ end
32
+ end
33
+
34
+ module Sevendigital
35
+
36
+ class SevendigitalObject
37
+
38
+ def initialize(api_client)
39
+ @api_client = api_client
40
+ end
41
+
42
+ def copy_basic_properties_from(other_object)
43
+ self.class.instance_variable_get(:@basic_properties).each do |property|
44
+ instance_variable_set(property, other_object.instance_variable_get(property))
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
@@ -0,0 +1,8 @@
1
+ module Sevendigital
2
+
3
+ class Track < SevendigitalObject
4
+ attr_accessor :id, :title, :version, :artist, :track_number,
5
+ :duration, :explicit_content, :isrc, :release, :url, :price
6
+
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ require "will_paginate/collection"
2
+
3
+ module Sevendigital
4
+
5
+ class Pager
6
+ attr_accessor :page, :page_size, :total_items
7
+
8
+ def paginate_list(list)
9
+ paged_list = WillPaginate::Collection.create(@page, @page_size, @total_items) do |pager|
10
+ pager.replace(list)
11
+ end
12
+ return paged_list
13
+ end
14
+
15
+ end
16
+
17
+ end
@@ -0,0 +1,24 @@
1
+ module Sevendigital
2
+ class ProxyPolice
3
+
4
+ def ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name)
5
+ if xml_or_proxy.kind_of? Peachy::Proxy then
6
+ return xml_or_proxy
7
+ else
8
+ return ProxyPolice.create_release_proxy(xml_or_proxy, element_name)
9
+ end
10
+ end
11
+
12
+ def ProxyPolice.create_release_proxy(xml, element_name)
13
+ #TODO don't use eval
14
+ parent_proxy = Peachy::Proxy.new(xml)
15
+ if element_name
16
+ # parent_proxy.send(element_name)
17
+ eval "parent_proxy.#{element_name.to_s}"
18
+ else
19
+ parent_proxy
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,3 @@
1
+ module Sevendigital
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,47 @@
1
+ require "spec"
2
+ require 'sevendigital'
3
+ require 'ostruct'
4
+
5
+ describe "ApiOperatorCached" do
6
+
7
+ before do
8
+ @client = stub(Sevendigital::Client)
9
+ @cache = stub(Hash)
10
+ @cached_operator = Sevendigital::ApiOperatorCached.new(@client, @cache)
11
+ end
12
+
13
+ it "should not make an http request if response already in cache " do
14
+ @cached_operator.stub(:create_request_uri).and_return("key")
15
+ @cache.stub!(:get).with("key").and_return(:something)
16
+ @cached_operator.should_not_receive(:make_http_request_and_digest)
17
+ @cached_operator.call_api(@stub_api_request)
18
+ end
19
+
20
+ it "should make an http request if response not yet in cache and return the result " do
21
+ api_response = fake_api_response()
22
+
23
+ @cached_operator.stub(:create_request_uri).and_return("key")
24
+ @cache.stub!(:get).with("key").and_return(nil)
25
+ @cache.stub!(:set).and_return(nil)
26
+ @cached_operator.should_receive(:make_http_request_and_digest).with("key").and_return(api_response)
27
+
28
+ response = @cached_operator.call_api(@stub_api_request)
29
+ response.should == api_response
30
+ end
31
+
32
+ it "should cache uncached api response" do
33
+ api_response = fake_api_response()
34
+
35
+ @cached_operator.stub(:create_request_uri).and_return("key")
36
+ @cache.stub!(:get).with("key").and_return(nil)
37
+ @cached_operator.stub!(:make_http_request_and_digest).and_return(api_response)
38
+
39
+ @cache.should_receive(:set).with("key", api_response).and_return(nil)
40
+ response = @cached_operator.call_api(@stub_api_request)
41
+ end
42
+
43
+ def fake_api_response
44
+ return Net::HTTP.new("1.1", 200, "response_body")
45
+ end
46
+
47
+ end
@@ -0,0 +1,108 @@
1
+ require "spec"
2
+ require 'sevendigital'
3
+ require 'ostruct'
4
+
5
+ describe "ApiOperator" do
6
+
7
+ before do
8
+ response_digestor = stub(Sevendigital::ApiResponseDigestor)
9
+ response_digestor.stub!(:from_http_response).and_return(fake_digested_response)
10
+
11
+ stub_api_client(test_configuration, response_digestor)
12
+
13
+ Net::HTTP.stub!(:get_response).and_return(fake_api_response)
14
+
15
+ @api_operator = Sevendigital::ApiOperator.new(@client)
16
+
17
+ @stub_api_request = stub_api_request()
18
+
19
+ end
20
+
21
+ it "should create request URI based on api method and client configuration" do
22
+
23
+ api_request = Sevendigital::ApiRequest.new("api/method", {:param1 => "value", :paramTwo => 2})
24
+
25
+ uri = @api_operator.create_request_uri(api_request)
26
+
27
+ uri.kind_of?(URI).should == true
28
+ uri.to_s.should == "http://base.api.url/version/api/method?oauth_consumer_key=oauth_consumer_key&param1=value&paramTwo=2&country=sk"
29
+
30
+ end
31
+
32
+ it "should make sure country is set before making request" do
33
+ @client.stub!(:country).and_return("sk")
34
+
35
+ @stub_api_request.should_receive(:ensure_country_is_set).with("sk")
36
+
37
+ @api_operator.call_api(@stub_api_request)
38
+
39
+ end
40
+
41
+ it "should make HTTP request and get response" do
42
+
43
+ Net::HTTP.should_receive(:get_response).with(@api_operator.create_request_uri(@stub_api_request))
44
+
45
+ @api_operator.call_api(@stub_api_request)
46
+
47
+ end
48
+
49
+ it "should digest the HTTP response and get it out" do
50
+
51
+ http_response = fake_api_response
52
+
53
+ Net::HTTP.stub!(:get_response).and_return(http_response)
54
+
55
+ @client.api_response_digestor.should_receive(:from_http_response).with(http_response).and_return(fake_digested_response)
56
+
57
+ response = @api_operator.call_api(@stub_api_request)
58
+
59
+ response.kind_of?(Peachy::Proxy).should == true
60
+ response.to_s.should == fake_digested_response.to_s
61
+
62
+ end
63
+
64
+ it "should throw an exception if response is not ok" do
65
+
66
+ Net::HTTP.stub(:get_response).and_return(fake_api_response)
67
+ failed_response = fake_digested_response(false)
68
+ @client.api_response_digestor.stub!(:from_http_response).and_return(failed_response)
69
+
70
+ running { @api_operator.call_api(@stub_api_request) }.should raise_error Sevendigital::SevendigitalError
71
+
72
+ end
73
+
74
+ def test_configuration
75
+ configuration = OpenStruct.new
76
+ configuration.api_url = "base.api.url"
77
+ configuration.api_version = "version"
78
+ configuration.oauth_consumer_key = "oauth_consumer_key"
79
+ return configuration
80
+ end
81
+
82
+ def fake_api_response(code = 200, body = "response_body")
83
+ return Net::HTTP.new("1.1", code, body)
84
+ end
85
+
86
+ def fake_digested_response(is_ok = true)
87
+ proxy = Peachy::Proxy.new('<response status="ok"><content>test</content></response>')
88
+ proxy.stub!(:ok?).and_return(is_ok)
89
+ proxy
90
+ end
91
+
92
+ def stub_api_client(configuration, response_digestor)
93
+ @client = stub(Sevendigital::Client)
94
+ @client.stub!(:configuration).and_return(configuration)
95
+ @client.stub!(:api_response_digestor).and_return(response_digestor)
96
+ @client.stub!(:country).and_return("sk")
97
+ end
98
+
99
+ def stub_api_request
100
+ api_request = stub(Sevendigital::ApiRequest)
101
+
102
+ api_request.stub!(:parameters).and_return({})
103
+ api_request.stub!(:api_method).and_return("m")
104
+ api_request.stub!(:ensure_country_is_set)
105
+ return api_request
106
+ end
107
+
108
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec'
2
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
3
+
4
+ describe "ApiRequest" do
5
+
6
+ it "should merge method parameters and options with parameters taking preference" do
7
+
8
+ parameters = {:trackId => 123, :releaseId => 456, :country => "CU"}
9
+ options = {:page => 1, :country => "US", :trackId => "SS"}
10
+ request = Sevendigital::ApiRequest.new('method', parameters, options)
11
+ request.parameters[:trackId].should == 123
12
+ request.parameters[:releaseId].should == 456
13
+ request.parameters[:country].should == "CU"
14
+ request.parameters[:page].should == 1
15
+ request.parameters.keys.size.should == 4 # page_size == null
16
+
17
+ end
18
+
19
+ it "should provide paging parameters in 7digital API format" do
20
+
21
+ request = Sevendigital::ApiRequest.new('method', {}, {:page => 5, :per_page => 3 })
22
+ request.parameters[:page].should == 5
23
+ request.parameters[:pageSize].should == 3
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,46 @@
1
+ require "spec"
2
+ require File.join(File.dirname(__FILE__), %w[spec_helper])
3
+ require 'sevendigital'
4
+
5
+ describe "Client" do
6
+
7
+ it "should load default configuration" do
8
+ client = Sevendigital::Client.new
9
+ client.configuration.api_url.should == 'api.7digital.com'
10
+ end
11
+
12
+ it "should override default configuration with configuration hash" do
13
+ client = Sevendigital::Client.new(:api_url => "test-hash.7digital.com")
14
+ client.configuration.api_url.should == 'test-hash.7digital.com'
15
+ end
16
+
17
+ it "should override default configuration with configuration class" do
18
+ client = Sevendigital::Client.new(OpenStruct.new(:api_url => "test-openstruct.7digital.com"))
19
+ client.configuration.api_url.should == 'test-openstruct.7digital.com'
20
+ end
21
+
22
+ it "should use simple configuration file" do
23
+ client = Sevendigital::Client.new(File.join(File.dirname(__FILE__),"data", "configuration_override.yml"))
24
+ client.configuration.api_url.should == 'test-yml-simple.7digital.com'
25
+ end
26
+
27
+ it "should use environment specific configuration file" do
28
+ client = Sevendigital::Client.new(File.join(File.dirname(__FILE__),"data", "configuration_env_override.yml"))
29
+ client.configuration.api_url.should == 'test-yml-common.7digital.com'
30
+ end
31
+
32
+ it "should use environment specific configuration file with environment specific settings" do
33
+ Object.const_set(:RAILS_ENV, "development")
34
+ client = Sevendigital::Client.new(File.join(File.dirname(__FILE__),"data", "configuration_env_override.yml"))
35
+ client.configuration.api_url.should == 'test-yml-development.7digital.com'
36
+ Object.instance_eval{ remove_const :RAILS_ENV }
37
+ end
38
+
39
+ it "should use rails/config/sevendigital configuration as default rails settings" do
40
+ Object.const_set(:RAILS_ROOT, File.join(File.dirname(__FILE__),"data"))
41
+ client = Sevendigital::Client.new()
42
+ client.configuration.api_url.should == 'test-yml-rails-common.7digital.com'
43
+ Object.instance_eval{ remove_const :RAILS_ROOT }
44
+ end
45
+
46
+ end
@@ -0,0 +1,5 @@
1
+ common:
2
+ api_url: test-yml-rails-common.7digital.com
3
+
4
+ development:
5
+ api_url: test-yml-development.7digital.com
@@ -0,0 +1,5 @@
1
+ common:
2
+ api_url: test-yml-common.7digital.com
3
+
4
+ development:
5
+ api_url: test-yml-development.7digital.com
@@ -0,0 +1 @@
1
+ api_url: test-yml-simple.7digital.com
@@ -0,0 +1,74 @@
1
+ require 'spec'
2
+ require File.join(File.dirname(__FILE__), %w[../spec_helper])
3
+
4
+
5
+ describe "ApiResponseDigestor" do
6
+
7
+ before do
8
+ @api_response_digestor = Sevendigital::ApiResponseDigestor.new(nil)
9
+ end
10
+
11
+ it "should create a response with body from http ok response" do
12
+
13
+ stub_http_response = stub(Net::HTTPSuccess)
14
+ stub_http_response.stub!(:is_a?).with(Net::HTTPSuccess).and_return(true)
15
+ stub_http_response.stub!(:body).and_return('<response status="ok"></response>')
16
+
17
+ response = @api_response_digestor.from_http_response(stub_http_response)
18
+ response.error_code.should == 0
19
+ end
20
+
21
+ it "should create an error response from http non-ok response" do
22
+ expected_message = 'Authorisation failed'
23
+ expected_error_code = 401
24
+
25
+ stub_http_response = stub(Net::HTTPSuccess)
26
+ stub_http_response.stub!(:is_a?).with(Net::HTTPSuccess).and_return(false)
27
+ stub_http_response.stub!(:code).and_return(expected_error_code.to_s)
28
+ stub_http_response.stub!(:body).and_return(expected_message)
29
+
30
+ response = @api_response_digestor.from_http_response(stub_http_response)
31
+ response.error_code.should == 401
32
+ response.error_message.should == expected_message
33
+
34
+ end
35
+
36
+
37
+
38
+ it "should create a response with body from xml ok response" do
39
+
40
+ xml_response = <<XML
41
+ <response status="ok"><test></test></response>
42
+ XML
43
+ response = @api_response_digestor.from_xml(xml_response)
44
+ response.error_code.should == 0
45
+ response.content.test.should_not == nil
46
+ response.content.nothing.should == nil
47
+ end
48
+
49
+
50
+ it "should create a response with error details from xml error response" do
51
+
52
+ xml_response = '<response status="error"><error code="1000"><errorMessage>expected error message</errorMessage></error></response>'
53
+ response = @api_response_digestor.from_xml(xml_response)
54
+ response.error_code.should == 1000
55
+ response.error_message.should == 'expected error message'
56
+ end
57
+
58
+ it "should create a response with error details from invalid xml response" do
59
+
60
+ xml_response = '<wrongresponse status="ok"><test /></wrongresponse>'
61
+ response = @api_response_digestor.from_xml(xml_response)
62
+ response.error_code.should == 10000
63
+ response.error_message.should == 'Invalid 7digital API response'
64
+ end
65
+
66
+ it "should create a response with error details from valid xml response with invalid status" do
67
+
68
+ xml_response = '<response status="unkown"><test></test></response>'
69
+ response = @api_response_digestor.from_xml(xml_response)
70
+ response.error_code.should == 10000
71
+ response.error_message.should == 'Invalid 7digital API response'
72
+ end
73
+
74
+ end
@@ -0,0 +1,83 @@
1
+ require "spec"
2
+ require "sevendigital"
3
+
4
+ describe "ArtistDigestor" do
5
+
6
+ before do
7
+ @artist_digestor = Sevendigital::ArtistDigestor.new(Sevendigital::Client.new(nil))
8
+ end
9
+
10
+ it "should not digest from invalid xml but throw up (exception)" do
11
+
12
+ xml_response = <<XML
13
+ <release id="123">
14
+ <name>expected artist name</name>
15
+ </release>
16
+ XML
17
+
18
+ running {@artist_digestor.from_xml(xml_response)}.should raise_error Sevendigital::DigestiveProblem
19
+
20
+ end
21
+
22
+ it "should digest artist xml and populate minimum available properties" do
23
+
24
+ xml_response = <<XML
25
+ <artist id="123">
26
+ <name>expected artist name</name>
27
+ </artist>
28
+ XML
29
+
30
+ artist = @artist_digestor.from_xml(xml_response)
31
+ artist.id.should == 123
32
+ artist.name.should == "expected artist name"
33
+ end
34
+
35
+ it "should digest artist xml and populate all available properties" do
36
+
37
+ xml_response = load_sample_object_xml("artist")
38
+
39
+ artist = @artist_digestor.from_xml(xml_response)
40
+ artist.id.should == 123
41
+ artist.name.should == "The Expected Artist"
42
+ artist.sort_name.should == "Expected Artist, The"
43
+ artist.appears_as.should == "The E.A."
44
+ artist.image.should == "http://somewhere.com/tea.jpg"
45
+ artist.url.should == "http://7digital.com/artists/tea?partner=1"
46
+ end
47
+
48
+ it "should digest xml containing list of artists and return a paginated array" do
49
+
50
+ xml_response = load_sample_object_xml("artist_list")
51
+
52
+ artists = @artist_digestor.list_from_xml(xml_response, :artists)
53
+ artists[0].id.should == 14
54
+ artists[1].id.should == 20
55
+ artists[2].id.should == 106
56
+ artists.size.should == 3
57
+ artists.total_entries.should == 26
58
+
59
+ end
60
+
61
+ it "should digest xml containing empty list of releases and return an empty paginated array" do
62
+
63
+ xml_response = load_sample_object_xml("artist_list_empty")
64
+
65
+ artists = @artist_digestor.list_from_xml(xml_response, :artists)
66
+ artists.size.should == 0
67
+ artists.total_entries.should == 0
68
+
69
+ end
70
+
71
+ it "should not digest list from invalid xml but throw up (exception)" do
72
+
73
+ xml_response = <<XML
74
+ <release id="123">
75
+ <name>expected artist name</name>
76
+ </release>
77
+ XML
78
+
79
+ running {@artist_digestor.list_from_xml(xml_response)}.should raise_error Sevendigital::DigestiveProblem
80
+
81
+ end
82
+
83
+ end