bandsintown 0.1.4 → 0.2.0

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.
@@ -112,7 +112,7 @@ describe Bandsintown::Artist do
112
112
  end
113
113
  it "should request and parse a call to the BIT artist events API method and the artist's api name" do
114
114
  @artist.should_receive(:api_name).and_return('Little%20Brother')
115
- Bandsintown::Artist.should_receive(:request_and_parse).with("Little%20Brother/events").and_return([])
115
+ Bandsintown::Artist.should_receive(:request_and_parse).with(:get, "Little%20Brother/events").and_return([])
116
116
  @artist.events
117
117
  end
118
118
  it "should return an Array of Bandsintown::Event objects built from the response" do
@@ -157,7 +157,7 @@ describe Bandsintown::Artist do
157
157
  Bandsintown::Artist.get(@options)
158
158
  end
159
159
  it "should request and parse a call to the BIT artists - get API method using api_name" do
160
- Bandsintown::Artist.should_receive(:request_and_parse).with(@artist.api_name).and_return('json')
160
+ Bandsintown::Artist.should_receive(:request_and_parse).with(:get, @artist.api_name).and_return('json')
161
161
  Bandsintown::Artist.get(@options)
162
162
  end
163
163
  it "should return the result of Bandsintown::Artist.build_from_json with the response data" do
@@ -11,21 +11,37 @@ describe Bandsintown::Base do
11
11
  end
12
12
  end
13
13
 
14
- describe ".request(api_method, args={})" do
15
- it "should make a request to the connection url" do
16
- resource_path = "events"
17
- method = "search"
18
- args = { :arg => "value" }
19
- Bandsintown::Base.stub!(:resource_path).and_return(resource_path)
20
- Bandsintown::Base.connection.should_receive(:request).with(resource_path, method, args)
21
- Bandsintown::Base.request(method, args)
14
+ describe ".request(http_method, api_method, params={})" do
15
+ before(:each) do
16
+ Bandsintown::Base.stub!(:resource_path).and_return("events")
17
+ end
18
+ it "should make a GET request to the connection url using api_method and params when http_method == :get" do
19
+ http_method = :get
20
+ api_method = "search"
21
+ params = { :arg => "value" }
22
+ Bandsintown::Base.stub!(:resource_path).and_return("events")
23
+ Bandsintown::Base.connection.should_receive(:get).with("events", api_method, params).and_return("response")
24
+ Bandsintown::Base.request(http_method, api_method, params).should == "response"
25
+ end
26
+ it "should make a POST request to the connection url using api_method and params when http_method == :post" do
27
+ http_method = :post
28
+ api_method = "create"
29
+ params = { :arg => "value" }
30
+ Bandsintown::Base.connection.should_receive(:post).with("events", api_method, params).and_return("response")
31
+ Bandsintown::Base.request(http_method, api_method, params).should == "response"
32
+ end
33
+ it "should raise an error if http_method is not :get or :post" do
34
+ http_method = :delete
35
+ api_method = "search"
36
+ params = { :arg => "value" }
37
+ lambda { Bandsintown::Base.request(http_method, api_method, params) }.should raise_error(ArgumentError, "only :get and :post requests are supported")
22
38
  end
23
39
  end
24
40
 
25
41
  describe ".parse(response)" do
26
42
  it "should check the response for errors" do
27
43
  response = "response"
28
- parsed = mock("parsed json")
44
+ parsed = mock("parsed json")
29
45
  JSON.stub!(:parse).and_return(parsed)
30
46
  Bandsintown::Base.should_receive(:check_for_errors).with(parsed)
31
47
  Bandsintown::Base.parse(response)
@@ -36,23 +52,23 @@ describe Bandsintown::Base do
36
52
  end
37
53
  end
38
54
 
39
- describe ".request_and_parse(api_method, args={})" do
55
+ describe ".request_and_parse(http_method, api_method, params={})" do
40
56
  before(:each) do
41
- @resource_path = "events"
42
- @method = "search"
43
- @args = { :arg => "value" }
44
- Bandsintown::Base.stub!(:resource_path).and_return(@resource_path)
45
- @response = mock("WWW::Mechanize response")
57
+ @http_method = :get
58
+ @api_method = "search"
59
+ @params = { :arg => "value" }
60
+ Bandsintown::Base.stub!(:resource_path).and_return("events")
61
+ @response = mock("HTTP response body")
46
62
  end
47
- it "should make a request" do
48
- Bandsintown::Base.should_receive(:request).with(@method, @args).and_return(@response)
63
+ it "should make a request with the http method, api method, and params" do
64
+ Bandsintown::Base.should_receive(:request).with(@http_method, @api_method, @params).and_return(@response)
49
65
  Bandsintown::Base.stub!(:parse)
50
- Bandsintown::Base.request_and_parse(@method, @args)
66
+ Bandsintown::Base.request_and_parse(@http_method, @api_method, @params)
51
67
  end
52
68
  it "should parse the response" do
53
69
  Bandsintown::Base.stub!(:request).and_return(@response)
54
70
  Bandsintown::Base.should_receive(:parse).with(@response)
55
- Bandsintown::Base.request_and_parse(@method, @args)
71
+ Bandsintown::Base.request_and_parse(@http_method, @api_method, @params)
56
72
  end
57
73
  end
58
74
 
@@ -67,4 +83,15 @@ describe Bandsintown::Base do
67
83
  end
68
84
  end
69
85
 
86
+
87
+ describe "#to_hash" do
88
+ it "should return a hash from non-blank instance variables" do
89
+ class Bandsintown::TestObject < Bandsintown::Base; attr_accessor :one, :two, :three; end
90
+ test_object = Bandsintown::TestObject.new
91
+ test_object.one = '1'
92
+ test_object.two = 2
93
+ test_object.three = ''
94
+ test_object.to_hash.should == { :one => '1', :two => 2 }
95
+ end
96
+ end
70
97
  end
@@ -7,79 +7,102 @@ describe Bandsintown::Connection do
7
7
  end
8
8
 
9
9
  describe ".initialize(base_url)" do
10
+ before(:each) do
11
+ @connection = Bandsintown::Connection.new(@base_url)
12
+ end
10
13
  it "should set the base_url for the Connection" do
11
- Bandsintown::Connection.new(@base_url).base_url.should == @base_url
14
+ @connection.base_url.should == @base_url
12
15
  end
13
16
  end
14
17
 
15
- describe ".request(url_path, args = {}, method = :get)" do
18
+ describe ".get(resource_path, method_path, params = {})" do
16
19
  before(:each) do
17
20
  @connection = Bandsintown::Connection.new(@base_url)
18
- @response = StringIO.new("response")
19
- @connection.stub!(:open).and_return(@response)
21
+ RestClient.stub!(:get).and_return("response")
20
22
  @api_resource = "events"
21
23
  @api_method = "search"
22
24
  end
23
- it "should convert args to url parameters when making a request" do
24
- args = { :artists => ["Little Brother", "Joe Scudda"], :location => "Boston, MA", :radius => 10 }
25
- request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&artists%5B%5D=Little+Brother&artists%5B%5D=Joe+Scudda&format=json&location=Boston%2C+MA&radius=10"
26
- @connection.should_receive(:open).with(request_url).and_return(@response)
27
- @connection.request(@api_resource, @api_method, args)
25
+ it "should make a get request to the url constructed with resource path, method path, and encoded params" do
26
+ params = { :artists => ["Little Brother", "Joe Scudda"], :location => "Boston, MA", :radius => 10 }
27
+ request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&artists%5B%5D=Little+Brother&artists%5B%5D=Joe+Scudda&format=json&location=Boston%2C+MA&radius=10"
28
+ @connection.should_receive(:encode).with(params).and_return("app_id=YOUR_APP_ID&artists%5B%5D=Little+Brother&artists%5B%5D=Joe+Scudda&format=json&location=Boston%2C+MA&radius=10")
29
+ RestClient.should_receive(:get).with(request_url).and_return("response")
30
+ @connection.get(@api_resource, @api_method, params).should == "response"
28
31
  end
29
- it "should convert args[:start_date] and args[:end_date] to a single args[:date] parameter when making a request" do
30
- args = { :start_date => "2009-01-01", :end_date => "2009-02-01" }
31
- request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=2009-01-01%2C2009-02-01&format=json"
32
- @connection.should_receive(:open).with(request_url).and_return(@response)
33
- @connection.request(@api_resource, @api_method, args)
32
+
33
+ it "should return the API error message instead of raising an error if there was a problem with the request (404 response)" do
34
+ error = RestClient::ResourceNotFound.new; error.response = "error message"
35
+ RestClient.stub!(:get).and_raise(error)
36
+ lambda { @connection.get("", "", {}) }.should_not raise_error
37
+ @connection.get("", "", {}).should == "error message"
34
38
  end
35
- it "should allow date to be a Time object" do
36
- args = { :date => Time.now.beginning_of_day }
37
- request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=#{Time.now.beginning_of_day.strftime("%Y-%m-%d")}&format=json"
38
- @connection.should_receive(:open).with(request_url).and_return(@response)
39
- @connection.request(@api_resource, @api_method, args)
39
+ end
40
+
41
+ describe ".post(resource_path, method_path, body = {})" do
42
+ before(:each) do
43
+ @connection = Bandsintown::Connection.new(@base_url)
44
+ RestClient.stub!(:post).and_return("response")
45
+ @api_resource = "events"
46
+ @api_method = "create"
47
+ @body_params = {
48
+ :event => {
49
+ :artists => [{ :name => "Little Brother" }],
50
+ :datetime => "2010-06-01T19:30:00",
51
+ :venue => { :id => 123 }
52
+ }
53
+ }
54
+ end
55
+ it "should make a post request to the url constructed with resource path, method path, default encoded params, body converted to json, and application/json request headers" do
56
+ expected_url = "http://api.bandsintown.com/events/create?app_id=YOUR_APP_ID&format=json"
57
+ expected_body = @body_params.to_json
58
+ expected_headers = { :content_type => :json, :accept => :json }
59
+ @connection.should_receive(:encode).with({}).and_return("app_id=YOUR_APP_ID&format=json")
60
+ RestClient.should_receive(:post).with(expected_url, expected_body, expected_headers).and_return("response")
61
+ @connection.post(@api_resource, @api_method, @body_params).should == "response"
62
+ end
63
+
64
+ it "should return the API error message instead of raising an error if there was a problem with the request (404 response)" do
65
+ error = RestClient::ResourceNotFound.new; error.response = "error message"
66
+ RestClient.stub!(:post).and_raise(error)
67
+ lambda { @connection.post(@api_resource, @api_method, @body_params) }.should_not raise_error
68
+ @connection.post(@api_resource, @api_method, @body_params).should == "error message"
69
+ end
70
+ end
71
+
72
+ describe ".encode(params={})" do
73
+ before(:each) do
74
+ @connection = Bandsintown::Connection.new(@base_url)
40
75
  end
41
- it "should allow date to be a Date object" do
42
- args = { :date => Date.today }
43
- request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=#{Date.today.strftime("%Y-%m-%d")}&format=json"
44
- @connection.should_receive(:open).with(request_url).and_return(@response)
45
- @connection.request(@api_resource, @api_method, args)
76
+ it "should return a query param string including :app_id and :format => json without the user having to specify them" do
77
+ @connection.encode({}).should == "app_id=#{Bandsintown.app_id}&format=json"
46
78
  end
47
- it "should allow date to be a String object" do
48
- args = { :date => "2009-01-01" }
49
- request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=2009-01-01&format=json"
50
- @connection.should_receive(:open).with(request_url).and_return(@response)
51
- @connection.request(@api_resource, @api_method, args)
79
+ it "should convert params[:start_date] and params[:end_date] to a single params[:date] parameter" do
80
+ params = { :start_date => "2009-01-01", :end_date => "2009-02-01" }
81
+ @connection.encode(params).should == "app_id=#{Bandsintown.app_id}&date=2009-01-01%2C2009-02-01&format=json"
52
82
  end
53
- it "should allow start date and end date to be Time objects" do
54
- args = { :start_date => 1.week.ago, :end_date => 1.week.from_now }
55
- request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=#{1.week.ago.strftime('%Y-%m-%d')}%2C#{1.week.from_now.strftime('%Y-%m-%d')}&format=json"
56
- @connection.should_receive(:open).with(request_url).and_return(@response)
57
- @connection.request(@api_resource, @api_method, args)
83
+ it "should allow :date to be a Time object" do
84
+ params = { :date => Time.now.beginning_of_day }
85
+ @connection.encode(params).should == "app_id=#{Bandsintown.app_id}&date=#{Time.now.strftime("%Y-%m-%d")}&format=json"
58
86
  end
59
- it "should allow start date and end date to be Date objects" do
60
- args = { :start_date => 1.week.ago.to_date, :end_date => 1.week.from_now.to_date }
61
- request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=#{1.week.ago.to_date.strftime('%Y-%m-%d')}%2C#{1.week.from_now.to_date.strftime('%Y-%m-%d')}&format=json"
62
- @connection.should_receive(:open).with(request_url).and_return(@response)
63
- @connection.request(@api_resource, @api_method, args)
87
+ it "should allow :date to be a Date object" do
88
+ params = { :date => Date.today }
89
+ @connection.encode(params).should == "app_id=#{Bandsintown.app_id}&date=#{Date.today}&format=json"
64
90
  end
65
- it "should allow start date and end date to be String objects" do
66
- args = { :start_date => "2009-01-01", :end_date => "2009-02-01" }
67
- request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=2009-01-01%2C2009-02-01&format=json"
68
- @connection.should_receive(:open).with(request_url).and_return(@response)
69
- @connection.request(@api_resource, @api_method, args)
91
+ it "should allow :date to be a String object" do
92
+ params = { :date => "2009-01-01" }
93
+ @connection.encode(params).should == "app_id=#{Bandsintown.app_id}&date=2009-01-01&format=json"
70
94
  end
71
- it "should return the API error message instead of raising an error if there was a problem with the request (404 response)" do
72
- error = OpenURI::HTTPError.new('404', StringIO.new('error message'))
73
- @connection.stub!(:open).and_raise(error)
74
- lambda { @connection.request("", "", {}) }.should_not raise_error
75
- error.io.rewind
76
- @connection.request("", "", {}).should == 'error message'
95
+ it "should allow :start_date and :end_date to be Time objects" do
96
+ params = { :start_date => 1.week.ago, :end_date => 1.week.from_now }
97
+ @connection.encode(params).should == "app_id=#{Bandsintown.app_id}&date=#{1.week.ago.strftime("%Y-%m-%d")}%2C#{1.week.from_now.strftime("%Y-%m-%d")}&format=json"
98
+ end
99
+ it "should allow :start_date and :end_date to be Date objects" do
100
+ params = { :start_date => 1.week.ago.to_date, :end_date => 1.week.from_now.to_date }
101
+ @connection.encode(params).should == "app_id=#{Bandsintown.app_id}&date=#{1.week.ago.strftime("%Y-%m-%d")}%2C#{1.week.from_now.strftime("%Y-%m-%d")}&format=json"
77
102
  end
78
- it "should set the format to json and the send app id without the user having to specify them" do
79
- request_url = "http://api.bandsintown.com/events/search?app_id=#{Bandsintown.app_id}&format=json"
80
- @connection.should_receive(:open).with(request_url).and_return(@response)
81
- @connection.request(@api_resource, @api_method, {})
103
+ it "should allow :start_date and :end_date to be String objects" do
104
+ params = { :start_date => "2009-01-01", :end_date => "2009-02-01" }
105
+ @connection.encode(params).should == "app_id=#{Bandsintown.app_id}&date=2009-01-01%2C2009-02-01&format=json"
82
106
  end
83
107
  end
84
-
85
108
  end
@@ -0,0 +1,102 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Bandsintown::Event::CreationHelpers do
4
+ before(:each) do
5
+ class Bandsintown::ExtendedClass; include Bandsintown::Event::CreationHelpers; end
6
+ end
7
+ describe ".parse_datetime(datetime)" do
8
+ it "should return datetime when given a String object" do
9
+ datetime = "2010-06-01T20:30:00"
10
+ expected = datetime
11
+ Bandsintown::ExtendedClass.parse_datetime(datetime).should == expected
12
+ end
13
+ it "should return datetime formatted to ISO 8601 if given a Time object" do
14
+ datetime = Time.parse("2010-06-01 20:30")
15
+ expected = "2010-06-01T20:30:00"
16
+ Bandsintown::ExtendedClass.parse_datetime(datetime).should == expected
17
+ end
18
+ it "should return datetime formatted to ISO 8601 if given a DateTime object" do
19
+ datetime = DateTime.parse("2010-06-01 20:30")
20
+ expected = "2010-06-01T20:30:00"
21
+ Bandsintown::ExtendedClass.parse_datetime(datetime).should == expected
22
+ end
23
+ it "should return datetime formatted to ISO 8601 at 19:00 if given a Date object" do
24
+ datetime = Date.parse("2010-06-01")
25
+ expected = "2010-06-01T19:00:00"
26
+ Bandsintown::ExtendedClass.parse_datetime(datetime).should == expected
27
+ end
28
+ end
29
+
30
+ describe ".parse_venue(venue_data)" do
31
+ describe "venue_data given as a hash" do
32
+ before(:each) do
33
+ @venue_data = {
34
+ :name => "Paradise",
35
+ :address => "967 Commonwealth Ave",
36
+ :city => "Boston",
37
+ :region => "MA",
38
+ :postalcode => "02215",
39
+ :country => "United States",
40
+ :latitude => '',
41
+ :longitude => ''
42
+ }
43
+ end
44
+ it "should return a hash with non-blank location data if venue_data is given as a hash without bandsintown id" do
45
+ Bandsintown::ExtendedClass.parse_venue(@venue_data).should == {
46
+ :name => "Paradise",
47
+ :address => "967 Commonwealth Ave",
48
+ :city => "Boston",
49
+ :region => "MA",
50
+ :postalcode => "02215",
51
+ :country => "United States"
52
+ }
53
+ end
54
+ it "should return a hash with bandsintown id and no location data if venue_data is given as a hash with bandsintown id" do
55
+ @venue_data[:bandsintown_id] = 1700
56
+ Bandsintown::ExtendedClass.parse_venue(@venue_data).should == { :id => 1700 }
57
+ end
58
+ end
59
+ describe "venue_data given as a Bandsintown::Venue" do
60
+ before(:each) do
61
+ @venue = Bandsintown::Venue.new(1700)
62
+ @venue.name = "Paradise"
63
+ @venue.address = "967 Commonwealth Ave"
64
+ @venue.city = "Boston"
65
+ @venue.region = "MA"
66
+ @venue.country = "United States"
67
+ end
68
+ it "should return a hash with non-blank location data if venue_data is given as a Bandsintown::Venue without bandsintown id" do
69
+ @venue.bandsintown_id = ''
70
+ Bandsintown::ExtendedClass.parse_venue(@venue).should == {
71
+ :name => "Paradise",
72
+ :address => "967 Commonwealth Ave",
73
+ :city => "Boston",
74
+ :region => "MA",
75
+ :country => "United States"
76
+ }
77
+ end
78
+ it "should return a hash with bandsintown id if venue_data is given as a Bandsintown::Venue with bandsintown id" do
79
+ Bandsintown::ExtendedClass.parse_venue(@venue).should == { :id => 1700 }
80
+ end
81
+ end
82
+ end
83
+
84
+ describe ".parse_artists(artist_data)" do
85
+ it "should return an array of { :name => name } when given strings" do
86
+ artist_data = ["Evidence", "Alchemist"]
87
+ Bandsintown::Event.parse_artists(artist_data).should == [{ :name => "Evidence" }, { :name => "Alchemist" }]
88
+ end
89
+ it "should return an array of { :name => name } when given Bandsintown::Artist instances without mbid" do
90
+ artist_data = [Bandsintown::Artist.new(:name => "Evidence"), Bandsintown::Artist.new(:name => "Alchemist")]
91
+ Bandsintown::Event.parse_artists(artist_data).should == [{ :name => "Evidence" }, { :name => "Alchemist" }]
92
+ end
93
+ it "should return an array of { :mbid => mbid } when given Bandsintown::Artist instance with mbid" do
94
+ artist_data = [Bandsintown::Artist.new(:mbid => "123"), Bandsintown::Artist.new(:mbid => "456")]
95
+ Bandsintown::Event.parse_artists(artist_data).should == [{ :mbid => "123" }, { :mbid => "456" }]
96
+ end
97
+ it "should work with different data types given" do
98
+ artist_data = ["Evidence", Bandsintown::Artist.new(:name => "Alchemist"), Bandsintown::Artist.new(:mbid => "123")]
99
+ Bandsintown::Event.parse_artists(artist_data).should == [{ :name => "Evidence" }, { :name => "Alchemist" }, { :mbid => "123" }]
100
+ end
101
+ end
102
+ end
@@ -1,6 +1,9 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper.rb'
2
2
 
3
3
  describe Bandsintown::Event do
4
+ it "should include the Bandsintown::Event::CreationHelpers module" do
5
+ Bandsintown::Event.included_modules.should include(Bandsintown::Event::CreationHelpers)
6
+ end
4
7
 
5
8
  describe ".resource_path" do
6
9
  it "should return the relative path to Event requests" do
@@ -13,7 +16,7 @@ describe Bandsintown::Event do
13
16
  @args = { :location => "Boston, MA", :date => "2009-01-01" }
14
17
  end
15
18
  it "should request and parse a call to the BIT events search api method" do
16
- Bandsintown::Event.should_receive(:request_and_parse).with("search", @args).and_return([])
19
+ Bandsintown::Event.should_receive(:request_and_parse).with(:get, "search", @args).and_return([])
17
20
  Bandsintown::Event.search(@args)
18
21
  end
19
22
  it "should return an Array of Bandsintown::Event objects built from the response" do
@@ -32,7 +35,7 @@ describe Bandsintown::Event do
32
35
  @args = { :location => "Boston, MA", :date => "2009-01-01" }
33
36
  end
34
37
  it "should request and parse a call to the BIT recommended events api method" do
35
- Bandsintown::Event.should_receive(:request_and_parse).with("recommended", @args).and_return([])
38
+ Bandsintown::Event.should_receive(:request_and_parse).with(:get, "recommended", @args).and_return([])
36
39
  Bandsintown::Event.recommended(@args)
37
40
  end
38
41
  it "should return an Array of Bandsintown::Event objects built from the response" do
@@ -48,7 +51,7 @@ describe Bandsintown::Event do
48
51
 
49
52
  describe ".daily" do
50
53
  it "should request and parse a call to the BIT daily events api method" do
51
- Bandsintown::Event.should_receive(:request_and_parse).with("daily").and_return([])
54
+ Bandsintown::Event.should_receive(:request_and_parse).with(:get, "daily").and_return([])
52
55
  Bandsintown::Event.daily
53
56
  end
54
57
  it "should return an array of Bandsintown::Events built from the response" do
@@ -64,7 +67,7 @@ describe Bandsintown::Event do
64
67
  @args = { :location => "Boston, MA", :radius => 50, :date => "2010-03-02" }
65
68
  end
66
69
  it "should request and parse a call to the BIT on sale soon api method" do
67
- Bandsintown::Event.should_receive(:request_and_parse).with("on_sale_soon", @args).and_return([])
70
+ Bandsintown::Event.should_receive(:request_and_parse).with(:get, "on_sale_soon", @args).and_return([])
68
71
  Bandsintown::Event.on_sale_soon(@args)
69
72
  end
70
73
  it "should return an array of Bandsintown::Events built from the response" do
@@ -111,7 +114,7 @@ describe Bandsintown::Event do
111
114
  @built_event = Bandsintown::Event.build_from_json(@event_hash)
112
115
  end
113
116
  it "should return a built Event" do
114
- @built_event.class.should == Bandsintown::Event
117
+ @built_event.should be_instance_of(Bandsintown::Event)
115
118
  end
116
119
  it "should set the Event id" do
117
120
  @built_event.bandsintown_id.should == @event_id
@@ -139,18 +142,31 @@ describe Bandsintown::Event do
139
142
  Bandsintown::Event.build_from_json(@event_hash).on_sale_datetime.should be_nil
140
143
  end
141
144
  it "should set the Event's Venue" do
142
- built_venue = mock(Bandsintown::Venue)
143
- Bandsintown::Venue.should_receive(:new).with(@venue_hash).and_return(built_venue)
144
- @built_event = Bandsintown::Event.build_from_json(@event_hash)
145
- @built_event.venue.should == built_venue
145
+ venue = @built_event.venue
146
+ venue.should be_instance_of(Bandsintown::Venue)
147
+ venue.bandsintown_id.should == 327987
148
+ venue.bandsintown_url.should == "http://www.bandsintown.com/venue/327987"
149
+ venue.region.should == "MA"
150
+ venue.city.should == "Boston"
151
+ venue.name.should == "Paradise Rock Club"
152
+ venue.country.should == "United States"
153
+ venue.latitude.should == 42.37
154
+ venue.longitude.should == 71.03
146
155
  end
147
156
  it "should set the Event's Artists" do
148
- built_artist_1 = mock(Bandsintown::Artist)
149
- built_artist_2 = mock(Bandsintown::Artist)
150
- Bandsintown::Artist.should_receive(:new).with(:name => @artist_1["name"], :url => @artist_1["url"], :mbid => @artist_1["mbid"]).and_return(built_artist_1)
151
- Bandsintown::Artist.should_receive(:new).with(:name => @artist_2["name"], :url => @artist_2["url"], :mbid => @artist_2["mbid"]).and_return(built_artist_2)
152
- @built_event = Bandsintown::Event.build_from_json(@event_hash)
153
- @built_event.artists.should == [built_artist_1, built_artist_2]
157
+ artists = @built_event.artists
158
+ artists.should be_instance_of(Array)
159
+ artists.size.should == 2
160
+
161
+ artists.first.should be_instance_of(Bandsintown::Artist)
162
+ artists.first.name.should == "Little Brother"
163
+ artists.first.bandsintown_url.should == "http://www.bandsintown.com/LittleBrother"
164
+ artists.first.mbid.should == "b929c0c9-5de0-4d87-8eb9-365ad1725629"
165
+
166
+ artists.last.should be_instance_of(Bandsintown::Artist)
167
+ artists.last.name.should == "Joe Scudda"
168
+ artists.last.bandsintown_url.should == "http://www.bandsintown.com/JoeScudda"
169
+ artists.last.mbid.should be_nil
154
170
  end
155
171
  end
156
172
 
@@ -166,4 +182,65 @@ describe Bandsintown::Event do
166
182
  event.tickets_available?.should be_false
167
183
  end
168
184
  end
169
- end
185
+
186
+ describe ".create(options = {})" do
187
+ before(:each) do
188
+ @options = { :artists => [], :venue => {}, :datetime => '' }
189
+ @response = { "message" => "Event successfully submitted (pending approval)" }
190
+ Bandsintown::Event.stub!(:request_and_parse).and_return(@response)
191
+ end
192
+ it "should request and parse a call to the BIT events - create API mehod" do
193
+ Bandsintown::Event.should_receive(:request_and_parse).with(:post, "create", anything).and_return(@response)
194
+ Bandsintown::Event.create(@options)
195
+ end
196
+ it "should return the response message if an event was successfully submitted using a non-trusted app_id" do
197
+ Bandsintown::Event.should_not_receive(:build_from_json)
198
+ Bandsintown::Event.create(@options).should == @response["message"]
199
+ end
200
+ it "should return a Bandsintown::Event build from the response if an event was sucessfully submitted using a trusted app_id" do
201
+ Bandsintown::Event.stub!(:request_and_parse).and_return({ "event" => "data" })
202
+ event = mock(Bandsintown::Event)
203
+ Bandsintown::Event.should_receive(:build_from_json).with("data").and_return(event)
204
+ Bandsintown::Event.create(@options).should == event
205
+ end
206
+ describe "event options" do
207
+ before(:each) do
208
+ Bandsintown::Event.stub!(:parse_artists)
209
+ Bandsintown::Event.stub!(:parse_datetime)
210
+ Bandsintown::Event.stub!(:parse_venue)
211
+ end
212
+
213
+ it "should parse the artists using parse_artists" do
214
+ @options = { :artists => ["Evidence", "Alchemist"] }
215
+ Bandsintown::Event.should_receive(:parse_artists).with(@options[:artists]).and_return('parsed')
216
+ expected_event_params = { :artists => 'parsed' }
217
+ Bandsintown::Event.should_receive(:request_and_parse).with(:post, "create", :event => hash_including(expected_event_params))
218
+ end
219
+
220
+ it "should parse the datetime using parse_datetime" do
221
+ @options = { :datetime => "2010-06-01T20:30:00" }
222
+ Bandsintown::Event.should_receive(:parse_datetime).with(@options[:datetime]).and_return('parsed')
223
+ expected_event_params = { :datetime => "parsed" }
224
+ Bandsintown::Event.should_receive(:request_and_parse).with(:post, "create", :event => hash_including(expected_event_params))
225
+ end
226
+
227
+ it "should parse the on_sale_datetime using parse_datetime" do
228
+ @options = { :on_sale_datetime => "2010-06-01T20:30:00" }
229
+ Bandsintown::Event.should_receive(:parse_datetime).with(@options[:on_sale_datetime]).and_return('parsed')
230
+ expected_event_params = { :on_sale_datetime => "parsed" }
231
+ Bandsintown::Event.should_receive(:request_and_parse).with(:post, "create", :event => hash_including(expected_event_params))
232
+ end
233
+
234
+ it "should parse the venue using parse_venue" do
235
+ @options = { :venue => "data" }
236
+ Bandsintown::Event.should_receive(:parse_venue).with("data").and_return("venue")
237
+ expected_event_params = { :venue => "venue" }
238
+ Bandsintown::Event.should_receive(:request_and_parse).with(:post, "create", :event => hash_including(expected_event_params))
239
+ end
240
+
241
+ after(:each) do
242
+ Bandsintown::Event.create(@options)
243
+ end
244
+ end
245
+ end
246
+ end