mturk 1.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -0
- data/.gemtest +0 -0
- data/History.md +105 -0
- data/LICENSE.txt +202 -0
- data/Manifest.txt +72 -0
- data/NOTICE.txt +4 -0
- data/README.md +100 -0
- data/Rakefile +33 -0
- data/bin/mturk +9 -0
- data/lib/amazon/util.rb +10 -0
- data/lib/amazon/util/binder.rb +48 -0
- data/lib/amazon/util/data_reader.rb +169 -0
- data/lib/amazon/util/filter_chain.rb +79 -0
- data/lib/amazon/util/hash_nesting.rb +93 -0
- data/lib/amazon/util/lazy_results.rb +59 -0
- data/lib/amazon/util/logging.rb +23 -0
- data/lib/amazon/util/paginated_iterator.rb +70 -0
- data/lib/amazon/util/proactive_results.rb +116 -0
- data/lib/amazon/util/threadpool.rb +129 -0
- data/lib/amazon/util/user_data_store.rb +100 -0
- data/lib/amazon/webservices/mechanical_turk.rb +123 -0
- data/lib/amazon/webservices/mechanical_turk_requester.rb +285 -0
- data/lib/amazon/webservices/mturk/mechanical_turk_error_handler.rb +153 -0
- data/lib/amazon/webservices/mturk/question_generator.rb +58 -0
- data/lib/amazon/webservices/util/amazon_authentication_relay.rb +72 -0
- data/lib/amazon/webservices/util/command_line.rb +155 -0
- data/lib/amazon/webservices/util/convenience_wrapper.rb +90 -0
- data/lib/amazon/webservices/util/filter_proxy.rb +45 -0
- data/lib/amazon/webservices/util/mock_transport.rb +70 -0
- data/lib/amazon/webservices/util/request_signer.rb +42 -0
- data/lib/amazon/webservices/util/rest_transport.rb +120 -0
- data/lib/amazon/webservices/util/soap_simplifier.rb +48 -0
- data/lib/amazon/webservices/util/soap_transport.rb +20 -0
- data/lib/amazon/webservices/util/soap_transport_header_handler.rb +27 -0
- data/lib/amazon/webservices/util/unknown_result_exception.rb +27 -0
- data/lib/amazon/webservices/util/validation_exception.rb +55 -0
- data/lib/amazon/webservices/util/xml_simplifier.rb +61 -0
- data/lib/mturk.rb +19 -0
- data/lib/mturk/version.rb +6 -0
- data/run_rcov.sh +1 -0
- data/samples/best_image/BestImage.rb +61 -0
- data/samples/best_image/best_image.properties +39 -0
- data/samples/best_image/best_image.question +82 -0
- data/samples/blank_slate/BlankSlate.rb +63 -0
- data/samples/blank_slate/BlankSlate_multithreaded.rb +67 -0
- data/samples/helloworld/MTurkHelloWorld.rb +56 -0
- data/samples/helloworld/mturk.yml +8 -0
- data/samples/review_policy/ReviewPolicy.rb +139 -0
- data/samples/review_policy/review_policy.question +30 -0
- data/samples/reviewer/Reviewer.rb +103 -0
- data/samples/reviewer/mturk.yml +8 -0
- data/samples/simple_survey/SimpleSurvey.rb +98 -0
- data/samples/simple_survey/simple_survey.question +30 -0
- data/samples/site_category/SiteCategory.rb +87 -0
- data/samples/site_category/externalpage.htm +71 -0
- data/samples/site_category/site_category.input +6 -0
- data/samples/site_category/site_category.properties +56 -0
- data/samples/site_category/site_category.question +9 -0
- data/test/mturk/test_changehittypeofhit.rb +130 -0
- data/test/mturk/test_error_handler.rb +403 -0
- data/test/mturk/test_mechanical_turk_requester.rb +178 -0
- data/test/mturk/test_mock_mechanical_turk_requester.rb +205 -0
- data/test/test_mturk.rb +21 -0
- data/test/unit/test_binder.rb +89 -0
- data/test/unit/test_data_reader.rb +135 -0
- data/test/unit/test_exceptions.rb +32 -0
- data/test/unit/test_hash_nesting.rb +99 -0
- data/test/unit/test_lazy_results.rb +89 -0
- data/test/unit/test_mock_transport.rb +132 -0
- data/test/unit/test_paginated_iterator.rb +58 -0
- data/test/unit/test_proactive_results.rb +108 -0
- data/test/unit/test_question_generator.rb +55 -0
- data/test/unit/test_threadpool.rb +50 -0
- data/test/unit/test_user_data_store.rb +80 -0
- metadata +225 -0
- 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
|
data/test/test_mturk.rb
ADDED
@@ -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
|