mturk 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -0
  4. data/.gemtest +0 -0
  5. data/History.md +105 -0
  6. data/LICENSE.txt +202 -0
  7. data/Manifest.txt +72 -0
  8. data/NOTICE.txt +4 -0
  9. data/README.md +100 -0
  10. data/Rakefile +33 -0
  11. data/bin/mturk +9 -0
  12. data/lib/amazon/util.rb +10 -0
  13. data/lib/amazon/util/binder.rb +48 -0
  14. data/lib/amazon/util/data_reader.rb +169 -0
  15. data/lib/amazon/util/filter_chain.rb +79 -0
  16. data/lib/amazon/util/hash_nesting.rb +93 -0
  17. data/lib/amazon/util/lazy_results.rb +59 -0
  18. data/lib/amazon/util/logging.rb +23 -0
  19. data/lib/amazon/util/paginated_iterator.rb +70 -0
  20. data/lib/amazon/util/proactive_results.rb +116 -0
  21. data/lib/amazon/util/threadpool.rb +129 -0
  22. data/lib/amazon/util/user_data_store.rb +100 -0
  23. data/lib/amazon/webservices/mechanical_turk.rb +123 -0
  24. data/lib/amazon/webservices/mechanical_turk_requester.rb +285 -0
  25. data/lib/amazon/webservices/mturk/mechanical_turk_error_handler.rb +153 -0
  26. data/lib/amazon/webservices/mturk/question_generator.rb +58 -0
  27. data/lib/amazon/webservices/util/amazon_authentication_relay.rb +72 -0
  28. data/lib/amazon/webservices/util/command_line.rb +155 -0
  29. data/lib/amazon/webservices/util/convenience_wrapper.rb +90 -0
  30. data/lib/amazon/webservices/util/filter_proxy.rb +45 -0
  31. data/lib/amazon/webservices/util/mock_transport.rb +70 -0
  32. data/lib/amazon/webservices/util/request_signer.rb +42 -0
  33. data/lib/amazon/webservices/util/rest_transport.rb +120 -0
  34. data/lib/amazon/webservices/util/soap_simplifier.rb +48 -0
  35. data/lib/amazon/webservices/util/soap_transport.rb +20 -0
  36. data/lib/amazon/webservices/util/soap_transport_header_handler.rb +27 -0
  37. data/lib/amazon/webservices/util/unknown_result_exception.rb +27 -0
  38. data/lib/amazon/webservices/util/validation_exception.rb +55 -0
  39. data/lib/amazon/webservices/util/xml_simplifier.rb +61 -0
  40. data/lib/mturk.rb +19 -0
  41. data/lib/mturk/version.rb +6 -0
  42. data/run_rcov.sh +1 -0
  43. data/samples/best_image/BestImage.rb +61 -0
  44. data/samples/best_image/best_image.properties +39 -0
  45. data/samples/best_image/best_image.question +82 -0
  46. data/samples/blank_slate/BlankSlate.rb +63 -0
  47. data/samples/blank_slate/BlankSlate_multithreaded.rb +67 -0
  48. data/samples/helloworld/MTurkHelloWorld.rb +56 -0
  49. data/samples/helloworld/mturk.yml +8 -0
  50. data/samples/review_policy/ReviewPolicy.rb +139 -0
  51. data/samples/review_policy/review_policy.question +30 -0
  52. data/samples/reviewer/Reviewer.rb +103 -0
  53. data/samples/reviewer/mturk.yml +8 -0
  54. data/samples/simple_survey/SimpleSurvey.rb +98 -0
  55. data/samples/simple_survey/simple_survey.question +30 -0
  56. data/samples/site_category/SiteCategory.rb +87 -0
  57. data/samples/site_category/externalpage.htm +71 -0
  58. data/samples/site_category/site_category.input +6 -0
  59. data/samples/site_category/site_category.properties +56 -0
  60. data/samples/site_category/site_category.question +9 -0
  61. data/test/mturk/test_changehittypeofhit.rb +130 -0
  62. data/test/mturk/test_error_handler.rb +403 -0
  63. data/test/mturk/test_mechanical_turk_requester.rb +178 -0
  64. data/test/mturk/test_mock_mechanical_turk_requester.rb +205 -0
  65. data/test/test_mturk.rb +21 -0
  66. data/test/unit/test_binder.rb +89 -0
  67. data/test/unit/test_data_reader.rb +135 -0
  68. data/test/unit/test_exceptions.rb +32 -0
  69. data/test/unit/test_hash_nesting.rb +99 -0
  70. data/test/unit/test_lazy_results.rb +89 -0
  71. data/test/unit/test_mock_transport.rb +132 -0
  72. data/test/unit/test_paginated_iterator.rb +58 -0
  73. data/test/unit/test_proactive_results.rb +108 -0
  74. data/test/unit/test_question_generator.rb +55 -0
  75. data/test/unit/test_threadpool.rb +50 -0
  76. data/test/unit/test_user_data_store.rb +80 -0
  77. metadata +225 -0
  78. metadata.gz.sig +0 -0
@@ -0,0 +1,178 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'test/unit/testcase'
5
+ require 'mturk'
6
+ require 'amazon/webservices/mturk/question_generator'
7
+ require 'amazon/webservices/util/soap_transport'
8
+ require 'amazon/webservices/util/rest_transport'
9
+
10
+ # Allow user to skip these tests by setting the DISABLE_MTURK_SANDBOX_TEST environment variable
11
+ if ENV['DISABLE_MTURK_SANDBOX_TEST'].nil?
12
+
13
+ class TestMechanicalTurkRequester < Test::Unit::TestCase
14
+ include Amazon::WebServices
15
+
16
+ def setup
17
+ # Setting up the default requester interface.
18
+ # This will default to running against Sandbox, but we'll the host explicitly for safety.
19
+ # Access Key ID and Secret Access Key will be loaded from user preference file
20
+ # If not found, the user will be interatively queried for their authentication information.
21
+ @@mturk ||= MechanicalTurkRequester.new( :Host => :Sandbox )
22
+
23
+ # utilize the SOAP transport, if we can
24
+ @@mturk_soap ||= MechanicalTurkRequester.new( :Host => :Sandbox, :Transport => :SOAP ) if Util::SOAPTransport.canSOAP?
25
+ # utilize the REST transport with default HTTP method
26
+ @@mturk_rest ||= MechanicalTurkRequester.new( :Host => :Sandbox, :Transport => :REST )
27
+ # utilize the REST transport via Get
28
+ @@mturk_rest_get ||= MechanicalTurkRequester.new( :Host => :Sandbox, :Transport => :REST, :RestStyle => :Get )
29
+ # utilize the REST transport via Post, if we can
30
+ @@mturk_rest_post ||= MechanicalTurkRequester.new( :Host => :Sandbox, :Transport => :REST, :RestStyle => :Post ) if Util::RESTTransport.canPost?
31
+ end
32
+
33
+ def testAvailableFunds
34
+ funds = @@mturk.availableFunds
35
+ assert_equal 10000.0, funds, "Sandbox should always show 10k available funds"
36
+ end
37
+
38
+ def testCreateHIT
39
+ question = MTurk::QuestionGenerator.build { |q| q.ask 'Have you tried Ruby?' }
40
+ result = @@mturk.createHIT :Title => 'Ruby SDK Test Hit',
41
+ :Description => 'Autogenerated hit from mturk test cases',
42
+ :Keywords => 'Ruby, test, SDK',
43
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
44
+ :Question => question
45
+ assert_not_nil( result[:HITId] )
46
+ @@mturk.forceExpireHIT( :HITId => result[:HITId] )
47
+ @@mturk.disposeHIT( :HITId => result[:HITId] )
48
+ end
49
+
50
+ def testCreateHITFailure
51
+ begin
52
+ @@mturk.createHIT :Title => 'Ruby SDK Test Hit',
53
+ :Description => 'Autogenerated hit from mturk test cases',
54
+ :Keywords => 'Ruby, test, SDK',
55
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
56
+ :Question => "Invalid Question"
57
+ fail "Mechanical Turk should have thrown an exception"
58
+ rescue => e
59
+ raise e unless e.is_a?( Util::ValidationException )
60
+ assert_equal "AWS.MechanicalTurk.XMLParseError", e.message
61
+ end
62
+ end
63
+
64
+ if Util::SOAPTransport.canSOAP?
65
+
66
+ def testSOAPCreateHIT
67
+ question = MTurk::QuestionGenerator.build { |q| q.ask 'Have you tried Ruby?' }
68
+ result = @@mturk_soap.createHIT :Title => 'Ruby SDK Test Hit',
69
+ :Description => 'Autogenerated hit from mturk test cases',
70
+ :Keywords => 'Ruby, test, SDK',
71
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
72
+ :Question => question
73
+ assert_not_nil( result[:HITId] )
74
+ @@mturk_soap.forceExpireHIT( :HITId => result[:HITId] )
75
+ @@mturk_soap.disposeHIT( :HITId => result[:HITId] )
76
+ end
77
+
78
+ def testSOAPCreateHITFailure
79
+ begin
80
+ @@mturk_soap.createHIT :Title => 'Ruby SDK Test Hit',
81
+ :Description => 'Autogenerated hit from mturk test cases',
82
+ :Keywords => 'Ruby, test, SDK',
83
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
84
+ :Question => "Invalid Question"
85
+ fail "Mechanical Turk should have thrown an exception"
86
+ rescue => e
87
+ raise e unless e.is_a?( Util::ValidationException )
88
+ assert_equal "AWS.MechanicalTurk.XMLParseError", e.message
89
+ end
90
+ end
91
+
92
+ end # if Util::SOAPTransport.canSOAP?
93
+
94
+ def testRESTCreateHIT
95
+ question = MTurk::QuestionGenerator.build { |q| q.ask 'Have you tried Ruby?' }
96
+ result = @@mturk_rest.createHIT :Title => 'Ruby SDK Test Hit',
97
+ :Description => 'Autogenerated hit from mturk test cases',
98
+ :Keywords => 'Ruby, test, SDK',
99
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
100
+ :Question => question
101
+ assert_not_nil( result[:HITId] )
102
+ @@mturk_rest.forceExpireHIT( :HITId => result[:HITId] )
103
+ @@mturk_rest.disposeHIT( :HITId => result[:HITId] )
104
+ end
105
+
106
+ def testRESTCreateHITFailure
107
+ begin
108
+ @@mturk_rest.createHIT :Title => 'Ruby SDK Test Hit',
109
+ :Description => 'Autogenerated hit from mturk test cases',
110
+ :Keywords => 'Ruby, test, SDK',
111
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
112
+ :Question => "Invalid Question"
113
+ fail "Mechanical Turk should have thrown an exception"
114
+ rescue => e
115
+ raise e unless e.is_a?( Util::ValidationException )
116
+ assert_equal "AWS.MechanicalTurk.XMLParseError", e.message
117
+ end
118
+ end
119
+
120
+ def testGetRESTCreateHIT
121
+ question = MTurk::QuestionGenerator.build { |q| q.ask 'Have you tried Ruby?' }
122
+ result = @@mturk_rest_get.createHIT :Title => 'Ruby SDK Test Hit',
123
+ :Description => 'Autogenerated hit from mturk test cases',
124
+ :Keywords => 'Ruby, test, SDK',
125
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
126
+ :Question => question
127
+ assert_not_nil( result[:HITId] )
128
+ @@mturk_rest_get.forceExpireHIT( :HITId => result[:HITId] )
129
+ @@mturk_rest_get.disposeHIT( :HITId => result[:HITId] )
130
+ end
131
+
132
+ def testGetRESTCreateHITFailure
133
+ begin
134
+ @@mturk_rest_get.createHIT :Title => 'Ruby SDK Test Hit',
135
+ :Description => 'Autogenerated hit from mturk test cases',
136
+ :Keywords => 'Ruby, test, SDK',
137
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
138
+ :Question => "Invalid Question"
139
+ fail "Mechanical Turk should have thrown an exception"
140
+ rescue => e
141
+ raise e unless e.is_a?( Util::ValidationException )
142
+ assert_equal "AWS.MechanicalTurk.XMLParseError", e.message
143
+ end
144
+ end
145
+
146
+ if Util::RESTTransport.canPost?
147
+
148
+ def testPostRESTCreateHIT
149
+ question = MTurk::QuestionGenerator.build { |q| q.ask 'Have you tried Ruby?' }
150
+ result = @@mturk_rest_post.createHIT :Title => 'Ruby SDK Test Hit',
151
+ :Description => 'Autogenerated hit from mturk test cases',
152
+ :Keywords => 'Ruby, test, SDK',
153
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
154
+ :Question => question
155
+ assert_not_nil( result[:HITId] )
156
+ @@mturk_rest_post.forceExpireHIT( :HITId => result[:HITId] )
157
+ @@mturk_rest_post.disposeHIT( :HITId => result[:HITId] )
158
+ end
159
+
160
+ def testPostRESTCreateHITFailure
161
+ begin
162
+ @@mturk_rest_post.createHIT :Title => 'Ruby SDK Test Hit',
163
+ :Description => 'Autogenerated hit from mturk test cases',
164
+ :Keywords => 'Ruby, test, SDK',
165
+ :Reward => { :Amount => 23.44, :CurrencyCode => 'USD' },
166
+ :Question => "Invalid Question"
167
+ fail "Mechanical Turk should have thrown an exception"
168
+ rescue => e
169
+ raise e unless e.is_a?( Util::ValidationException )
170
+ assert_equal "AWS.MechanicalTurk.XMLParseError", e.message
171
+ end
172
+ end
173
+
174
+ end # if Util::RESTTransport.canPost?
175
+
176
+ end
177
+
178
+ end # if not DISABLE_MTURK_SANDBOX_TEST
@@ -0,0 +1,205 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'test/unit/testcase'
5
+ require 'mturk'
6
+ require 'amazon/webservices/util/mock_transport'
7
+
8
+ class TestMockMechanicalTurkRequester < Test::Unit::TestCase
9
+
10
+ def setup
11
+ @mock = Amazon::WebServices::Util::MockTransport.new
12
+ @mturk = Amazon::WebServices::MechanicalTurkRequester.new( :Transport => @mock, :AWSAccessKey => 'bogus', :AWSAccessKeyId => 'fake' )
13
+ end
14
+
15
+ def testGetAccountBalance
16
+ res = @mturk.getAccountBalance # using the convenience layer method
17
+ assert_equal nil, res
18
+ res = @mturk.getAccountBalanceRaw({}) # using the raw method ( no default parameters )
19
+ assert_equal nil, res
20
+ res = @mturk.GetAccountBalance # using pass-through method ( no convenience processing )
21
+ assert_equal true, res[:MockResult][:Mock]
22
+
23
+ assert_equal 3, @mock.call_buffer.size
24
+ @mock.each do |request|
25
+ assert_equal :GetAccountBalance, request.name
26
+ assert request.args
27
+ [:AWSAccessKeyId, :Signature, :Timestamp, :Request].each { |key| assert request.args[key]}
28
+ assert_equal( {}, request.request )
29
+ end
30
+ end
31
+
32
+ def testCreateHIT
33
+ res = @mturk.createHIT # convenience layer, will auto-populate some default parameters
34
+ res = @mturk.createHITRaw({}) # raw method, no default parameters
35
+ res = @mturk.CreateHIT # pass-through method ( no convenience processing )
36
+
37
+ assert_equal 3, @mock.call_buffer.size
38
+
39
+ default_call = @mock.next # request from convenience layer
40
+ request = default_call.request
41
+ assert !request.keys.empty?
42
+ expected = [:MaxAssignments, :AssignmentDurationInSeconds, :AutoApprovalDelayInSeconds, :LifetimeInSeconds]
43
+ assert_equal [], request.keys - expected, 'Convenience layer should not populate unexpected arguments'
44
+ assert_equal [], expected - request.keys, 'Convenience layer should populate all expected arguments'
45
+
46
+ @mock.each do |call|
47
+ # both remaining calls should have no arguments
48
+ assert_equal( {}, call.request, 'Raw calls should not auto-populate arguments')
49
+ end
50
+ end
51
+
52
+ def testCreateHITs
53
+ @mock.listen do |call|
54
+ {:RegisterHITTypeResult => {:HITTypeId => 'specialType', :Request => {}} } if call.name == :RegisterHITType
55
+ end
56
+
57
+ template = { :Arg1 => 'Param2', :RequesterAnnotation => 'blub' }
58
+ question_template = "blarg <%= @zip %> foo"
59
+ data_set = [ { :zip => 'poodle' }, { :zip => 'fizz' } ]
60
+
61
+ result = @mturk.createHITs( template, question_template, data_set )
62
+
63
+ assert_equal 2, result[:Created].size
64
+ assert_equal 0, result[:Failed].size
65
+
66
+ register_call = @mock.next
67
+ assert_equal :RegisterHITType, register_call.name
68
+ assert_equal(
69
+ { :AssignmentDurationInSeconds=>3600, # default
70
+ :AutoApprovalDelayInSeconds=>604800, # default
71
+ :Arg1=>"Param2" # there's our arg!
72
+ },
73
+ register_call.request )
74
+ expected_questions = [ "blarg poodle foo", "blarg fizz foo" ]
75
+ @mock.each do |call|
76
+ assert_equal :CreateHIT, call.name
77
+ assert_equal 'specialType', call.request[:HITTypeId]
78
+ assert_equal call.request[:Question], expected_questions.delete( call.request[:Question] )
79
+ end
80
+ end
81
+
82
+ def testCreateHITsWithMaxAssignment
83
+ @mock.listen do |call|
84
+ case call.name
85
+ when :RegisterHITType
86
+ {:RegisterHITTypeResult => {:HITTypeId => 'mockHITType', :Request => {} } }
87
+ else
88
+ {}
89
+ end
90
+ end
91
+
92
+ template = { :Description => 'foo bar', :MaxAssignments => 2, :RequesterAnnotation => "Funky <%= @jazz %>" }
93
+ question = "who what <%= @where %>"
94
+ data_set = [ { :jazz => "LaLa", :where => 1}, {:jazz => nil, :where => 2, :MaxAssignments => 1}, {:jazz => "Poodle", :where => nil} ]
95
+
96
+ results = @mturk.createHITs( template, question, data_set )
97
+
98
+ assert_equal [], results[:Failed]
99
+ assert_equal 3, results[:Created].size
100
+
101
+ ht = @mock.next
102
+ assert_equal :RegisterHITType, ht.name
103
+ assert_equal 'foo bar', ht.request[:Description]
104
+ assert_equal nil, ht.request[:MaxAssignments]
105
+
106
+ 3.times do
107
+ hit = @mock.next
108
+ assert_equal :CreateHIT, hit.name
109
+ assert_equal 'mockHITType', hit.request[:HITTypeId]
110
+ case hit.request[:Question]
111
+ when 'who what 1'
112
+ assert_equal 2, hit.request[:MaxAssignments]
113
+ assert_equal 'Funky LaLa', hit.request[:RequesterAnnotation]
114
+ when 'who what 2'
115
+ assert_equal 1, hit.request[:MaxAssignments]
116
+ assert_equal 'Funky ', hit.request[:RequesterAnnotation]
117
+ when 'who what '
118
+ assert_equal 2, hit.request[:MaxAssignments]
119
+ assert_equal 'Funky Poodle', hit.request[:RequesterAnnotation]
120
+ else
121
+ fail 'generated an unexpected Question'
122
+ end
123
+ end
124
+
125
+ assert_equal nil, @mock.next
126
+ end
127
+
128
+ def testCreatHITsWithFailure
129
+ @mock.listen do |call|
130
+ raise "Mock hates you" if call.request[:Question] and call.request[:Question] =~ /poodle/
131
+ {:RegisterHITTypeResult => {:HITTypeId => 'specialType', :Request => {}} } if call.name == :RegisterHITType
132
+ end
133
+
134
+ template = { :Arg1 => 'Param2', :RequesterAnnotation => 'blub' }
135
+ question_template = "blarg <%= @zip %> foo"
136
+ data_set = [ { :zip => 'poodle' }, { :zip => 'fizz' } ]
137
+
138
+ result = @mturk.createHITs( template, question_template, data_set )
139
+
140
+ assert_equal 1, result[:Created].size
141
+ assert_equal 1, result[:Failed].size
142
+
143
+ assert_equal "Mock hates you", result[:Failed].first[:Error]
144
+ end
145
+
146
+ def testGetHITResults
147
+ # need to set up a listener to feed back hit and assignment attributes for testing results and work with pagination
148
+ assignments_per_hit = 31
149
+ @mock.mock_reply = {:OperationRequest => {}}
150
+ @mock.listen do |call|
151
+ case call.name
152
+ when :GetHIT
153
+ {:HIT => { :HITId => call.request[:HITId], :MockHITAttribute => 'amazing', :Request => {} } }
154
+ when :GetAssignmentsForHIT
155
+ size = call.request[:PageSize]
156
+ num = call.request[:PageNumber]
157
+ index = size * (num-1)
158
+ max = ( assignments_per_hit > index+size ) ? index+size : assignments_per_hit
159
+ res = []
160
+ index.upto(max-1) do |i|
161
+ res << { :HITId => call.request[:HITId], :AssignmentId => i, :MockAssignmentAttribute => 'stunning' }
162
+ end
163
+ { :GetAssignmentsForHITResult => { :Assignment => res, :Request => {} } }
164
+ else
165
+ nil
166
+ end
167
+ end
168
+
169
+ list = %w( hitid1 hitid2 amazinghit3 lamehit4 ).collect {|id| { :HITId => id } }
170
+ results = @mturk.getHITResults( list )
171
+
172
+ assert_equal assignments_per_hit*list.size, results.size
173
+ results.each { |item|
174
+ assert_not_nil item[:HITId]
175
+ assert_equal 'amazing', item[:MockHITAttribute]
176
+ assert_not_nil item[:AssignmentId]
177
+ assert_equal 'stunning', item[:MockAssignmentAttribute]
178
+ }
179
+
180
+ end
181
+
182
+ def testAvailableFunds
183
+ # TODO
184
+ end
185
+
186
+ def testSimplifyAnswer
187
+ rawAnswer = <<EOF
188
+ <?xml version="1.0" encoding="UTF-8"?>
189
+ <QuestionFormAnswers xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2005-10-01/QuestionFormAnswers.xsd">
190
+ <Answer>
191
+ <QuestionIdentifier>1</QuestionIdentifier>
192
+ <FreeText>yes, sir</FreeText>
193
+ </Answer>
194
+ <Answer>
195
+ <QuestionIdentifier>pudding</QuestionIdentifier>
196
+ <SelectionIdentifier>B+</SelectionIdentifier>
197
+ </Answer>
198
+ </QuestionFormAnswers>
199
+ EOF
200
+ expected = { 1 => 'yes, sir', 'pudding' => 'B+' }
201
+ result = @mturk.simplifyAnswer( rawAnswer )
202
+ assert_equal expected, result
203
+ end
204
+
205
+ end
@@ -0,0 +1,21 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'test/unit'
5
+ require 'mturk'
6
+
7
+ class TestMTurk < Test::Unit::TestCase
8
+
9
+ VERSION_NUMBER_PATTERN = '\d+\.\d+\.\d+(\.[a-zA-Z\d]+)*'
10
+
11
+ def testVersion
12
+ assert( MTurk::VERSION =~ /^#{VERSION_NUMBER_PATTERN}$/ , "MTurk::VERSION is incorrectly formatted")
13
+ end
14
+
15
+ def testAgent
16
+ assert( MTurk.agent =~ /^ruby-mturk\/#{VERSION_NUMBER_PATTERN}$/ )
17
+ assert( MTurk.agent('Tester') =~ /^ruby-mturk\/#{VERSION_NUMBER_PATTERN} Tester$/ )
18
+ end
19
+
20
+ end
21
+
@@ -0,0 +1,89 @@
1
+ # Copyright:: Copyright (c) 2007 Amazon Technologies, Inc.
2
+ # License:: Apache License, Version 2.0
3
+
4
+ require 'test/unit/testcase'
5
+ require 'amazon/util/binder'
6
+
7
+ class TestBinder < Test::Unit::TestCase
8
+ include Amazon::Util
9
+
10
+ SAMPLE_VARS = { :a => 'pudding', :b => 'pie', :c => 'cheesecake' }
11
+
12
+ SAMPLE_TEMPLATE = "I love <%= @b %> (especially with <%= @a %>), but I love <%= @c %> even more!"
13
+
14
+ SAMPLE_EXPECTED = "I love pie (especially with pudding), but I love cheesecake even more!"
15
+
16
+ def testConstructorConfig
17
+ b = Binder.new( SAMPLE_VARS )
18
+ result = b.erb_eval( SAMPLE_TEMPLATE )
19
+ assert_equal SAMPLE_EXPECTED, result
20
+ end
21
+
22
+ def testBuilderConfig
23
+ b = Binder.new { |bb| SAMPLE_VARS.each {|k,v| bb.set( k, v ) } }
24
+ result = b.erb_eval( SAMPLE_TEMPLATE )
25
+ assert_equal SAMPLE_EXPECTED, result
26
+ end
27
+
28
+ def testInstanceConfig
29
+ b = Binder.new
30
+ SAMPLE_VARS.each { |k,v| b.set( k, v ) }
31
+ result = b.erb_eval( SAMPLE_TEMPLATE )
32
+ assert_equal SAMPLE_EXPECTED, result
33
+ end
34
+
35
+ def testMergeConfig
36
+ b = Binder.new
37
+ b.merge SAMPLE_VARS
38
+ result = b.erb_eval( SAMPLE_TEMPLATE )
39
+ assert_equal SAMPLE_EXPECTED, result
40
+ end
41
+
42
+ def testCombinedConfig
43
+ keys = SAMPLE_VARS.keys
44
+ b = Binder.new( keys[0] => SAMPLE_VARS[ keys[0] ] ) { |bb|
45
+ bb.set( keys[1], SAMPLE_VARS[ keys[1] ] ) }
46
+ b.set( keys[2], SAMPLE_VARS[ keys[2] ] )
47
+ result = b.erb_eval( SAMPLE_TEMPLATE )
48
+ assert_equal SAMPLE_EXPECTED, result
49
+ end
50
+
51
+ def testConfigPrecedence
52
+ b = Binder.new( SAMPLE_VARS ) { |bb|
53
+ bb.merge( 'a' => 'rhubarb', 'c'=> 'gelato' ) }
54
+ b.merge( :c => 'jello' )
55
+ result = b.erb_eval( SAMPLE_TEMPLATE )
56
+ assert_equal "I love pie (especially with rhubarb), but I love jello even more!", result
57
+ end
58
+
59
+ def testMissingVar
60
+ b = Binder.new
61
+ result = silently { b.erb_eval( "Going to the <%=@blue%> moon" ) }
62
+ assert_equal "Going to the moon", result
63
+ end
64
+
65
+ def testScopeCaller
66
+ b = Binder.new
67
+ @arg = "ocean"
68
+ result = silently { b.erb_eval( "swim in the <%= @arg %> seas" ) }
69
+ assert_equal "swim in the seas", result
70
+ end
71
+
72
+ def testScopeBoth
73
+ @zip = '--zip--'
74
+ b = Binder.new( :zip => '++zap++' )
75
+ result = b.erb_eval( "The line went <%= @zip %>" )
76
+ assert_equal "The line went ++zap++", result
77
+ end
78
+
79
+ private
80
+
81
+ def silently( &block )
82
+ warn_level = $VERBOSE
83
+ $VERBOSE = nil
84
+ result = block.call
85
+ $VERBOSE = warn_level
86
+ result
87
+ end
88
+
89
+ end