thrillcall-api 0.0.3

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.
@@ -0,0 +1,3 @@
1
+ module ThrillcallAPI
2
+ VERSION = "0.0.3"
3
+ end
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # USAGE:
4
+ # INSTALL FIRST! : You must have the Python Pygments lib installed
5
+ # before this will run. See : http://pygments.org/docs/installation/
6
+ #
7
+ # Install with:
8
+ #
9
+ # sudo easy_install Pygments
10
+ #
11
+ # Run me with : 'bundle install' and 'cd script' and 'bundle exec ruby convert_readme.rb'
12
+
13
+ require 'rubygems'
14
+ require 'bundler'
15
+ Bundler.setup
16
+ Bundler.require(:development)
17
+
18
+ css = "
19
+ <style type='text/css'>
20
+ .highlight .hll { background-color: #ffffcc }
21
+ .highlight { background: #dddddd; }
22
+ .highlight .c { color: #408080; font-style: italic } /* Comment */
23
+ .highlight .err { border: 1px solid #FF0000 } /* Error */
24
+ .highlight .k { color: #008000; font-weight: bold } /* Keyword */
25
+ .highlight .o { color: #666666 } /* Operator */
26
+ .highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */
27
+ .highlight .cp { color: #BC7A00 } /* Comment.Preproc */
28
+ .highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */
29
+ .highlight .cs { color: #408080; font-style: italic } /* Comment.Special */
30
+ .highlight .gd { color: #A00000 } /* Generic.Deleted */
31
+ .highlight .ge { font-style: italic } /* Generic.Emph */
32
+ .highlight .gr { color: #FF0000 } /* Generic.Error */
33
+ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
34
+ .highlight .gi { color: #00A000 } /* Generic.Inserted */
35
+ .highlight .go { color: #808080 } /* Generic.Output */
36
+ .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
37
+ .highlight .gs { font-weight: bold } /* Generic.Strong */
38
+ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
39
+ .highlight .gt { color: #0040D0 } /* Generic.Traceback */
40
+ .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
41
+ .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
42
+ .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
43
+ .highlight .kp { color: #008000 } /* Keyword.Pseudo */
44
+ .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
45
+ .highlight .kt { color: #B00040 } /* Keyword.Type */
46
+ .highlight .m { color: #666666 } /* Literal.Number */
47
+ .highlight .s { color: #BA2121 } /* Literal.String */
48
+ .highlight .na { color: #7D9029 } /* Name.Attribute */
49
+ .highlight .nb { color: #008000 } /* Name.Builtin */
50
+ .highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */
51
+ .highlight .no { color: #880000 } /* Name.Constant */
52
+ .highlight .nd { color: #AA22FF } /* Name.Decorator */
53
+ .highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */
54
+ .highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
55
+ .highlight .nf { color: #0000FF } /* Name.Function */
56
+ .highlight .nl { color: #A0A000 } /* Name.Label */
57
+ .highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
58
+ .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
59
+ .highlight .nv { color: #19177C } /* Name.Variable */
60
+ .highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
61
+ .highlight .w { color: #bbbbbb } /* Text.Whitespace */
62
+ .highlight .mf { color: #666666 } /* Literal.Number.Float */
63
+ .highlight .mh { color: #666666 } /* Literal.Number.Hex */
64
+ .highlight .mi { color: #666666 } /* Literal.Number.Integer */
65
+ .highlight .mo { color: #666666 } /* Literal.Number.Oct */
66
+ .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
67
+ .highlight .sc { color: #BA2121 } /* Literal.String.Char */
68
+ .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
69
+ .highlight .s2 { color: #BA2121 } /* Literal.String.Double */
70
+ .highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
71
+ .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
72
+ .highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
73
+ .highlight .sx { color: #008000 } /* Literal.String.Other */
74
+ .highlight .sr { color: #BB6688 } /* Literal.String.Regex */
75
+ .highlight .s1 { color: #BA2121 } /* Literal.String.Single */
76
+ .highlight .ss { color: #19177C } /* Literal.String.Symbol */
77
+ .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
78
+ .highlight .vc { color: #19177C } /* Name.Variable.Class */
79
+ .highlight .vg { color: #19177C } /* Name.Variable.Global */
80
+ .highlight .vi { color: #19177C } /* Name.Variable.Instance */
81
+ .highlight .il { color: #666666 } /* Literal.Number.Integer.Long */
82
+ </style>
83
+ "
84
+
85
+ puts "Combining API.md and WRAPPER.md"
86
+
87
+ api = File.open(File.expand_path("../../docs/API.md", __FILE__)).read
88
+ wrapper = File.open(File.expand_path("../../docs/WRAPPER.md", __FILE__)).read
89
+ combined = wrapper + "\n\n" + api
90
+
91
+ File.open(File.expand_path("../../README.md", __FILE__),"w+") { |f|
92
+ f.write(combined)
93
+ }
94
+
95
+ convert = {
96
+ "API" => api,
97
+ "WRAPPER" => wrapper,
98
+ "README" => combined
99
+ }
100
+
101
+ convert.each do |name, doc|
102
+ rc = Redcarpet.new(doc, :fenced_code, :space_header, :gh_blockcode)
103
+
104
+ rc = css + rc.to_html
105
+
106
+ doc = Nokogiri::HTML.fragment(rc)
107
+
108
+ doc.search('pre').each do |node|
109
+ next unless lang = node['lang']
110
+ html = Albino.colorize(node.inner_text, lang)
111
+ node.replace(html)
112
+ end
113
+
114
+ File.open(File.expand_path("../../docs/#{name}.html", __FILE__),"w+") { |f|
115
+ f.write(doc.to_s)
116
+ }
117
+ end
118
+
119
+ puts "Done"
@@ -0,0 +1,11 @@
1
+ require 'rspec'
2
+ require 'yaml'
3
+
4
+ # Requires supporting ruby files with custom matchers and macros, etc,
5
+ # in spec/support/ and its subdirectories.
6
+ #Dir["spec/support/**/*.rb"].each {|f| require f}
7
+
8
+ RSpec.configure do |c|
9
+ c.fail_fast = true
10
+ # ....
11
+ end
@@ -0,0 +1,477 @@
1
+ require 'spec_helper'
2
+ require 'thrillcall-api'
3
+ require 'ap'
4
+ require 'faker'
5
+
6
+ # Set to one of :development, :staging, :production
7
+ TEST_ENV = :development
8
+
9
+ # For the environment specified in TEST_ENV, you must have set a few system environment variables.
10
+ # For example, if your TEST_ENV is :development, you need:
11
+ # TC_DEVELOPMENT_API_KEY : your API key
12
+ # TC_DEVELOPMENT_LOGIN : the login (email address) for the test account if testing the Person endpoint
13
+ # TC_DEVELOPMENT_PASSWORD : the password for the test account if testing the Person endpoint
14
+
15
+ # Place something like this in your bash_login script:
16
+ # export TC_DEVELOPMENT_API_KEY="1234567890abcdef"
17
+ # export TC_DEVELOPMENT_LOGIN="some_account@thrillcall.com"
18
+ # export TC_DEVELOPMENT_PASSWORD="some_password"
19
+
20
+ # You should not have to edit anything below this line.
21
+ #####################################################################
22
+
23
+ env_prefix = TEST_ENV.to_s.upcase
24
+
25
+ TEST_KEY = ENV["TC_#{env_prefix}_API_KEY"]
26
+ PERSON_LOGIN = ENV["TC_#{env_prefix}_LOGIN"]
27
+ PERSON_PASSWORD = ENV["TC_#{env_prefix}_PASSWORD"]
28
+
29
+ HOST = "http://localhost:3000/api/" if TEST_ENV == :development
30
+ HOST = "https://secure-zion.thrillcall.com:443/api/" if TEST_ENV == :staging # SSL!
31
+ HOST = "https://api.thrillcall.com:443/api/" if TEST_ENV == :production # SSL!
32
+
33
+ LIMIT = 14
34
+ TINY_LIMIT = 3
35
+
36
+ POSTAL_CODE = "94108"
37
+
38
+ PERSON_CREATE_FIRSTNAME = Faker::Name.first_name
39
+ PERSON_CREATE_EMAIL = Faker::Internet.email
40
+ PERSON_CREATE_PASSWORD = Faker::Lorem.words(2).join('')
41
+ PERSON_CREATE_POSTALCODE = POSTAL_CODE
42
+
43
+ FLUSH_CACHE = true # false
44
+
45
+ describe "ThrillcallAPI" do
46
+
47
+ def setup_key
48
+ @tc = ThrillcallAPI.new(TEST_KEY, :base_url => HOST)
49
+
50
+ @tc_permissions = @tc.api_key.permissions
51
+ @tc_permissions.length
52
+ @tc_permissions = @tc_permissions.data
53
+
54
+ # api_auth permission allows you to access the Person endpoints.
55
+ # api_read permission allows you to access all other endpoints.
56
+ end
57
+
58
+ def has_permission?(p=:api_read)
59
+ (@tc_permissions.include? p.to_s)
60
+ end
61
+
62
+ def mark_pending_if_no_permission(p = :api_read)
63
+ unless has_permission? p
64
+ pending "TEST_KEY permissions #{@tc_permissions} do not include #{p}"
65
+ end
66
+ end
67
+
68
+ def setup_read
69
+ if has_permission? :api_read
70
+ day_buffer = 0
71
+ range = 365
72
+
73
+ @min_date = (Time.now - 60*60*24*(range+day_buffer)).to_date.to_s
74
+ @max_date = (Time.now - 60*60*24*day_buffer).to_date.to_s
75
+
76
+ event_finder = {
77
+ :must_have_tickets => true,
78
+ :postalcode => POSTAL_CODE,
79
+ :radius => 10,
80
+ :limit => TINY_LIMIT
81
+ }
82
+
83
+ events = @tc.events(event_finder)
84
+ events.length
85
+
86
+ @event = events.first
87
+ @event_id = @event["id"]
88
+
89
+ @ticket = @tc.event(@event_id).tickets.first
90
+ @artist = @tc.event(@event_id).artists.first
91
+ @venue = @tc.event(@event_id).venue
92
+
93
+ @artist_id = @artist["id"]
94
+ @artist_norm_name = @artist["name"]
95
+
96
+ @venue_id = @venue["id"]
97
+ @venue_norm_name = @venue["name"]
98
+ @venue_zip = @venue["postalcode"]
99
+
100
+ @event_zip = @venue_zip
101
+
102
+ @ticket_id = @ticket["id"]
103
+
104
+ @lat = @venue["latitude"]
105
+ @long = @venue["longitude"]
106
+
107
+ @genre_id = @artist["primary_genre_id"]
108
+ @metro_area_id = @venue["metro_area_id"]
109
+
110
+ puts "Using Thrillcall objects:"
111
+ puts "Event: #{@event_id}"
112
+ puts "Artist: #{@artist_id} #{@artist_norm_name}"
113
+ puts "Venue: #{@venue_id} #{@venue_norm_name}"
114
+ puts "Ticket: #{@ticket_id}"
115
+ puts "Metro: #{@metro_area_id}"
116
+ puts "Genre: #{@genre_id}"
117
+ end
118
+ end
119
+
120
+ # Flush memcache results
121
+ before :all do
122
+ if TEST_ENV == :development
123
+ if FLUSH_CACHE
124
+ fork do
125
+ exec "echo 'flush_all' | nc localhost 11211"
126
+ end
127
+
128
+ Process.wait
129
+ end
130
+ end
131
+ end
132
+
133
+ it "the test suite should be able to retrieve the environment variables correctly" do
134
+ TEST_KEY.should_not be_nil
135
+ end
136
+
137
+ it "should initialize properly with faraday" do
138
+ tc = nil
139
+ lambda { tc = ThrillcallAPI.new(TEST_KEY, :base_url => HOST) }.should_not raise_error
140
+ puts tc.inspect
141
+ tc.conn.class.should == Faraday::Connection
142
+ end
143
+
144
+ it "should be able to retrieve the permissions for the api key" do
145
+ tc = ThrillcallAPI.new(TEST_KEY, :base_url => HOST)
146
+ tc_permissions = tc.api_key.permissions
147
+ tc_permissions.length
148
+ tc_permissions = tc_permissions.data
149
+ tc_permissions.class.should == Array
150
+ end
151
+
152
+ context "an authenticated user with get permission" do
153
+
154
+ before :all do
155
+ setup_key
156
+ setup_read
157
+ end
158
+
159
+ before :each do
160
+ mark_pending_if_no_permission(:api_read)
161
+ end
162
+
163
+ it "should be able to handle a method with a block used on fresh data" do
164
+ e = @tc.events(:limit => LIMIT)
165
+ c = 0
166
+ e.each do |ev|
167
+ c += 1
168
+ end
169
+ c.should == e.length
170
+ end
171
+
172
+ it "should be able to make multiple requests after initialization" do
173
+ a = @tc.artist(@artist_id)
174
+ b = @tc.events(:limit => LIMIT)
175
+ a["id"].should == @artist_id
176
+ b.length.should == LIMIT
177
+ end
178
+
179
+ # This is the only remaining limitation of the wrapper
180
+ it "should not be able to make an additional request after using the data from an intermediate request" do
181
+ a = @tc.artist(@artist_id)
182
+ a["id"].should == @artist_id
183
+ lambda { e = a.events }.should raise_error
184
+ end
185
+
186
+ # This behavior cannot be iterated due to the previous limitation
187
+ it "should be able to build a nested request from a preexisting intermediate unfetched request" do
188
+ venue_intermediate_request = @tc.event(@event_id)
189
+ v = venue_intermediate_request.venue
190
+ v["id"].should == @venue_id
191
+ end
192
+
193
+ it "should fetch data when responding to an array or a hash method" do
194
+ a = @tc.artists(:limit => LIMIT)
195
+ r = a.pop
196
+ r["id"].should_not be_nil
197
+
198
+ e = @tc.artist(r["id"])
199
+ (e.has_key? "genre_tags").should be_true
200
+ end
201
+
202
+ it "should raise NoMethodError when given a method the data doesn't respond to after fetched" do
203
+ a = @tc.artists(:limit => LIMIT)
204
+ a.length.should == LIMIT
205
+ lambda { a.bazooka }.should raise_error NoMethodError
206
+ end
207
+
208
+ it "should not return filtered attributes" do
209
+ v = @tc.venue(@venue_id)
210
+ v["alt_city"].should be_nil
211
+ end
212
+
213
+ context "accessing the event endpoint" do
214
+ it "should get a list of events" do
215
+ # This call sets up the Result object and returns an instance of ThrillcallAPI
216
+ e = @tc.events(:limit => LIMIT)
217
+
218
+ # This call executes fetch_data because @data responds_to .length
219
+ e.length.should == LIMIT
220
+
221
+ # Now e behaves as a hash
222
+ end
223
+
224
+ it "should get a specific event" do
225
+ e = @tc.event(@event_id)
226
+ e["id"].should == @event_id
227
+ end
228
+
229
+ it "should get tickets for a specific event" do
230
+ e = @tc.event(@event_id).tickets
231
+ # FIXME: "product" here should be "ticket"
232
+ e.first["id"].should == @ticket_id
233
+ end
234
+
235
+ it "should get artists for a specific event" do
236
+ e = @tc.event(@event_id).artists
237
+ e.first["id"].should == @artist_id
238
+ end
239
+
240
+ it "should get the venue for a specific event" do
241
+ e = @tc.event(@event_id).venue
242
+ e["id"].should == @venue_id
243
+ end
244
+
245
+ it "should verify the behavior of the min_date param" do
246
+ e = @tc.events(:limit => TINY_LIMIT, :min_date => @min_date)
247
+ e.length.should == TINY_LIMIT
248
+ e.each do |ev|
249
+ DateTime.parse(ev["start_date"]).should >= DateTime.parse(@min_date)
250
+ end
251
+ end
252
+
253
+ it "should verify the behavior of the max_date param" do
254
+ e = @tc.events(:limit => TINY_LIMIT, :min_date => @min_date, :max_date => @max_date)
255
+ e.length.should == TINY_LIMIT
256
+ e.each do |ev|
257
+ DateTime.parse(ev["start_date"]).should < (DateTime.parse(@max_date) + 1)
258
+ end
259
+ end
260
+
261
+ it "should verify the behavior of the page param" do
262
+ offset = 1
263
+ e = @tc.events(:limit => TINY_LIMIT * 2)
264
+ o = @tc.events(:limit => TINY_LIMIT, :page => 1)
265
+ e.length.should == TINY_LIMIT * 2
266
+ o.length.should == TINY_LIMIT
267
+ (e - o).length.should == TINY_LIMIT
268
+ end
269
+
270
+ it "should verify the behavior of the confirmed_events_only param" do
271
+ e = @tc.events(:limit => LIMIT, :confirmed_events_only => true)
272
+ e.each do |ev|
273
+ ev["unconfirmed_location"].should == 0
274
+ end
275
+ end
276
+
277
+ it "should verify the behavior of the must_have_tickets param" do
278
+ e = @tc.events(:limit => TINY_LIMIT, :must_have_tickets => true)
279
+ e.length.should == TINY_LIMIT
280
+ e.each do |ev|
281
+ t = @tc.event(ev["id"]).tickets
282
+ t.length.should_not == 0
283
+ end
284
+ end
285
+
286
+ it "should verify the behavior of the lat long params" do
287
+ e = @tc.events(:limit => TINY_LIMIT, :lat => @lat, :long => @long, :radius => 0)
288
+ e.each do |ev|
289
+ (@tc.event(ev["id"]).venue["latitude"].to_f - @lat).should <= 1.0
290
+ (@tc.event(ev["id"]).venue["longitude"].to_f - @long).should <= 1.0
291
+ end
292
+ end
293
+
294
+ it "should verify the behavior of the postalcode param" do
295
+ pending "Need to be able to access the ZipCodes table externally from Rails"
296
+ e = @tc.events(:limit => TINY_LIMIT, :postalcode => POSTAL_CODE)
297
+ e.length.should <= TINY_LIMIT
298
+ e.each do |ev|
299
+ ev["venue_id"].should_not be_nil
300
+ v = @tc.venue(ev["venue_id"])
301
+
302
+ v["postalcode"].should == POSTAL_CODE
303
+ end
304
+ end
305
+
306
+ it "should verify the behavior of the radius param" do
307
+ pending
308
+ end
309
+
310
+ #############
311
+ # Can't verify the behavior below without more access to data on the Rails side
312
+ it "should verify the behavior of the ticket_type param" do
313
+ pending "Need to be able to access the Merchants table externally from Rails"
314
+ e = @tc.events(:limit => TINY_LIMIT, :must_have_tickets => true)
315
+ e.length.should == TINY_LIMIT
316
+ e.each do |ev|
317
+ t = @tc.event(ev["id"]).tickets(:ticket_type => "primary")
318
+ t.each do |ticket|
319
+ ticket
320
+ end
321
+ t.length.should be_empty
322
+ end
323
+ end
324
+ #################
325
+
326
+ end
327
+
328
+ context "accessing the artist endpoint" do
329
+ it "should get a list of artists" do
330
+ a = @tc.artists(:limit => LIMIT)
331
+ a.length.should == LIMIT
332
+ end
333
+
334
+ it "should get a specific artist" do
335
+ a = @tc.artist(@artist_id)
336
+ a["id"].should == @artist_id
337
+ end
338
+
339
+ it "should get a list of events for a specific artist" do
340
+ a = @tc.artist(@artist_id).events
341
+ found = false
342
+ a.each do |event|
343
+ found = found || (event["id"] == @event_id)
344
+ break if found
345
+ end
346
+ found.should be_true
347
+ end
348
+ end
349
+
350
+ context "accessing the venue endpoint" do
351
+ it "should get a list of venues" do
352
+ v = @tc.venues(:limit => LIMIT)
353
+ v.length.should == LIMIT
354
+ end
355
+
356
+ it "should get a specific venue" do
357
+ v = @tc.venue(@venue_id)
358
+ v["id"].should == @venue_id
359
+ end
360
+
361
+ it "should directly return a postalcode" do
362
+ v = @tc.venue(@venue_id)
363
+ v["postalcode"].should == @venue_zip
364
+ end
365
+
366
+ it "should return a list of events for a specific venue" do
367
+ e = @tc.venue(@venue_id).events
368
+ e.length.should > 0
369
+ end
370
+
371
+ end
372
+
373
+ context "accessing the ticket endpoint" do
374
+ it "should get a list of tickets" do
375
+ p = @tc.tickets(:limit => LIMIT)
376
+ p.length.should == LIMIT
377
+ end
378
+
379
+ it "should get a specific ticket" do
380
+ p = @tc.ticket(@ticket_id)
381
+ p["id"].should == @ticket_id
382
+ end
383
+ end
384
+
385
+ context "searching for an object with a term" do
386
+ it "should find the right artists" do
387
+ a = @tc.search.artists(@artist_norm_name)
388
+ found = false
389
+ a.each do |artist|
390
+ if artist["id"] == @artist_id
391
+ found = true
392
+ break
393
+ end
394
+ end
395
+ found.should be_true
396
+ end
397
+
398
+ it "should find the right venues" do
399
+ v = @tc.search.venues(@venue_norm_name)
400
+ found = false
401
+ v.each do |venue|
402
+ if venue["id"] == @venue_id
403
+ found = true
404
+ break
405
+ end
406
+ end
407
+ found.should be_true
408
+ end
409
+
410
+ end
411
+
412
+ context "accessing the metro area endpoint" do
413
+ it "should get a specific metro area" do
414
+ m = @tc.metro_area(@metro_area_id)
415
+ m["id"].should == @metro_area_id
416
+ end
417
+
418
+ it "should get a list of metro areas" do
419
+ m = @tc.metro_areas(:limit => LIMIT)
420
+ m.length.should == LIMIT
421
+ end
422
+
423
+ it "should get a list of events for a specific metro" do
424
+ e = @tc.metro_area(@metro_area_id).events
425
+ cur_venue_id = e.first["venue_id"]
426
+
427
+ @tc.venue(cur_venue_id)["metro_area_id"].should == @metro_area_id
428
+ end
429
+ end
430
+
431
+ context "accesing the genre endpoint" do
432
+ it "should get a specific genre" do
433
+ g = @tc.genre(@genre_id)
434
+ g["id"].should == @genre_id
435
+ end
436
+
437
+ it "should get a list of genres" do
438
+ g = @tc.genres(:limit => LIMIT)
439
+ g.length.should == LIMIT
440
+ end
441
+
442
+ it "should get a list of artists for a specific genre" do
443
+ g = @tc.genre(@genre_id).artists
444
+ g.first["primary_genre_id"].should == @genre_id
445
+ end
446
+ end
447
+
448
+ end
449
+
450
+ context "an authenticated user with api_auth permission" do
451
+ before :all do
452
+ setup_key
453
+ end
454
+
455
+ before :each do
456
+ mark_pending_if_no_permission(:api_auth)
457
+ end
458
+
459
+ context "accesing the person endpoint" do
460
+ it "should be able to login a person" do
461
+ # Don't forget to change the credentials in your environment variables
462
+ p = @tc.person.signin.post(:login => PERSON_LOGIN, :password => PERSON_PASSWORD)
463
+ p["login"].should == PERSON_LOGIN
464
+ end
465
+
466
+ it "should be able to create a person" do
467
+ p = @tc.person.signup.post(:first_name => PERSON_CREATE_FIRSTNAME,
468
+ :email => PERSON_CREATE_EMAIL,
469
+ :password => PERSON_CREATE_PASSWORD,
470
+ :postalcode => PERSON_CREATE_POSTALCODE,
471
+ :test => true)
472
+ p["login"].should == PERSON_CREATE_EMAIL
473
+ end
474
+ end
475
+ end
476
+
477
+ end