barker 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.simplecov +7 -0
  6. data/Gemfile +6 -0
  7. data/Gemfile.lock +50 -0
  8. data/LICENSE +22 -0
  9. data/README.md +204 -0
  10. data/Rakefile +12 -0
  11. data/barker.gemspec +29 -0
  12. data/ci/run +20 -0
  13. data/lib/barker/answer.rb +11 -0
  14. data/lib/barker/api/base.rb +145 -0
  15. data/lib/barker/api/response/base.rb +25 -0
  16. data/lib/barker/api/response/candidate.rb +38 -0
  17. data/lib/barker/api/response/candidate_answer.rb +23 -0
  18. data/lib/barker/api/response/candidate_joker.rb +21 -0
  19. data/lib/barker/api/response/candidate_question.rb +51 -0
  20. data/lib/barker/api/response/error.rb +17 -0
  21. data/lib/barker/api/response/game_show.rb +43 -0
  22. data/lib/barker/api/response/round.rb +21 -0
  23. data/lib/barker/api/response.rb +15 -0
  24. data/lib/barker/api.rb +7 -0
  25. data/lib/barker/candidate.rb +52 -0
  26. data/lib/barker/candidate_answer.rb +42 -0
  27. data/lib/barker/candidate_joker.rb +30 -0
  28. data/lib/barker/candidate_question.rb +116 -0
  29. data/lib/barker/candidate_round.rb +32 -0
  30. data/lib/barker/entity.rb +15 -0
  31. data/lib/barker/game_show.rb +176 -0
  32. data/lib/barker/guideline/base.rb +33 -0
  33. data/lib/barker/guideline/llmcquiz/questions.yaml +300 -0
  34. data/lib/barker/guideline/llmcquiz.rb +28 -0
  35. data/lib/barker/guideline/mock.rb +17 -0
  36. data/lib/barker/guideline.rb +8 -0
  37. data/lib/barker/import/yaml.rb +22 -0
  38. data/lib/barker/import.rb +6 -0
  39. data/lib/barker/joker.rb +28 -0
  40. data/lib/barker/question.rb +12 -0
  41. data/lib/barker/quiz.rb +19 -0
  42. data/lib/barker/repo/memory/game_show.rb +38 -0
  43. data/lib/barker/repo/memory.rb +8 -0
  44. data/lib/barker/repo.rb +6 -0
  45. data/lib/barker/round.rb +68 -0
  46. data/lib/barker/stage.rb +38 -0
  47. data/lib/barker/store/memory.rb +158 -0
  48. data/lib/barker/store.rb +6 -0
  49. data/lib/barker/validations.rb +14 -0
  50. data/lib/barker/version.rb +3 -0
  51. data/lib/barker.rb +45 -0
  52. data/test/factories/answer.rb +21 -0
  53. data/test/factories/candidate.rb +23 -0
  54. data/test/factories/candidate_answer.rb +12 -0
  55. data/test/factories/candidate_joker.rb +8 -0
  56. data/test/factories/candidate_question.rb +16 -0
  57. data/test/factories/candidate_round.rb +8 -0
  58. data/test/factories/game_show.rb +12 -0
  59. data/test/factories/joker.rb +5 -0
  60. data/test/factories/question.rb +13 -0
  61. data/test/factories/quiz.rb +11 -0
  62. data/test/factories/round.rb +12 -0
  63. data/test/factories/stage.rb +12 -0
  64. data/test/fixtures/questions.yaml +20 -0
  65. data/test/test_helper.rb +72 -0
  66. data/test/test_mocks.rb +21 -0
  67. data/test/unit/answer_test.rb +49 -0
  68. data/test/unit/api/base_test.rb +207 -0
  69. data/test/unit/api/response/base_test.rb +35 -0
  70. data/test/unit/api/response/candidate_answer_test.rb +64 -0
  71. data/test/unit/api/response/candidate_joker_test.rb +60 -0
  72. data/test/unit/api/response/candidate_question_test.rb +99 -0
  73. data/test/unit/api/response/candidate_test.rb +82 -0
  74. data/test/unit/api/response/game_show_test.rb +105 -0
  75. data/test/unit/api/response/round_test.rb +49 -0
  76. data/test/unit/candidate_answer_test.rb +66 -0
  77. data/test/unit/candidate_question_test.rb +277 -0
  78. data/test/unit/candidate_round_test.rb +64 -0
  79. data/test/unit/candidate_test.rb +76 -0
  80. data/test/unit/game_show_test.rb +372 -0
  81. data/test/unit/guideline/base_test.rb +34 -0
  82. data/test/unit/guideline/llmcquiz_test.rb +35 -0
  83. data/test/unit/guideline/mock_test.rb +33 -0
  84. data/test/unit/import/yaml_test.rb +41 -0
  85. data/test/unit/joker_test.rb +32 -0
  86. data/test/unit/question_test.rb +55 -0
  87. data/test/unit/quiz_test.rb +37 -0
  88. data/test/unit/repo/memory/game_show_test.rb +54 -0
  89. data/test/unit/round_test.rb +167 -0
  90. data/test/unit/stage_test.rb +53 -0
  91. metadata +283 -0
@@ -0,0 +1,66 @@
1
+ require 'test_helper'
2
+
3
+ module Barker
4
+ class CandidateAnswerTest < Spec
5
+
6
+ test "interface" do
7
+ Barker::CandidateAnswer.new(candidate, answer)
8
+ end
9
+
10
+ test "valid factory" do
11
+ assert FactoryGirl.build(:candidate_answer).valid?
12
+ end
13
+
14
+ test "invalid factory" do
15
+ refute FactoryGirl.build(:candidate_answer, :invalid).valid?
16
+ end
17
+
18
+ test "invalid if answer is invalid" do
19
+ refute FactoryGirl.build(:candidate_answer, :answer => FactoryGirl.build(:answer, :invalid)).valid?
20
+ end
21
+
22
+ test "candidate" do
23
+ assert_equal candidate, FactoryGirl.build(:candidate_answer, :candidate => candidate).candidate
24
+ end
25
+
26
+ test "answer" do
27
+ assert_equal answer, FactoryGirl.build(:candidate_answer, :answer => answer).answer
28
+ end
29
+
30
+ test "reveal" do
31
+ answer = FactoryGirl.build(:candidate_answer)
32
+
33
+ refute answer.revealed?
34
+ answer.reveal
35
+ assert answer.revealed?
36
+ end
37
+
38
+ test "answer_id" do
39
+ answer = FactoryGirl.build(:answer)
40
+ assert_equal answer.id, FactoryGirl.build(:candidate_answer, :answer => answer).answer_id
41
+ end
42
+
43
+ test "candidate_id" do
44
+ candidate = FactoryGirl.build(:candidate)
45
+ assert_equal candidate.id, FactoryGirl.build(:candidate_answer, :candidate => candidate).candidate_id
46
+ end
47
+
48
+ test "label fallback to en if candidate locale is missing" do
49
+ candidate = FactoryGirl.build(:candidate, :locale => 'wookie')
50
+ answer = FactoryGirl.build(:candidate_answer, :candidate => candidate, :answer => FactoryGirl.build(:answer, :label => {'en' => 'answer in en'}))
51
+ assert_equal 'answer in en', answer.label
52
+ end
53
+
54
+ test "translate label in candidate locale" do
55
+ candidate = FactoryGirl.build(:candidate, :locale => 'wookie')
56
+ answer = FactoryGirl.build(:candidate_answer, :candidate => candidate, :answer => FactoryGirl.build(:answer, :label => {'en' => 'answer in en', 'wookie' => 'woo arrr uuur'}))
57
+ assert_equal 'woo arrr uuur', answer.label
58
+ end
59
+
60
+ test "delegate correct? to answer" do
61
+ answer = FactoryGirl.build(:candidate_answer, :answer => FactoryGirl.build(:answer, :correct))
62
+ assert answer.correct?
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,277 @@
1
+ require 'test_helper'
2
+
3
+ module Barker
4
+ class CandidateQuestionTest < Spec
5
+
6
+ test "interface" do
7
+ Barker::CandidateQuestion.new(candidate, question)
8
+ end
9
+
10
+ test "valid factory" do
11
+ FactoryGirl.build(:candidate_question, :valid).valid?
12
+ end
13
+
14
+ test "invalid factory" do
15
+ refute FactoryGirl.build(:candidate_question).valid?
16
+ refute FactoryGirl.build(:candidate_question, :invalid).valid?
17
+ end
18
+
19
+ test "valid?" do
20
+ refute FactoryGirl.build(:candidate_question, :asked_at => Time.now, :answered_at => Time.now + 1, :question => FactoryGirl.build(:question, :invalid)).valid?
21
+ refute FactoryGirl.build(:candidate_question, :asked_at => Time.now + 1, :answered_at => Time.now).valid?
22
+ end
23
+
24
+ test "id alias question_id" do
25
+ assert_equal question.id, FactoryGirl.build(:candidate_question, :question => question).id
26
+ end
27
+
28
+ test "question" do
29
+ assert_equal question, FactoryGirl.build(:candidate_question, :question => question).question
30
+ end
31
+
32
+ test "question_id" do
33
+ assert_equal question.id, FactoryGirl.build(:candidate_question, :question => question).question_id
34
+ end
35
+
36
+ test "candidate" do
37
+ assert_equal candidate, FactoryGirl.build(:candidate_question, :candidate => candidate).candidate
38
+ end
39
+
40
+ test "candidate_id" do
41
+ assert_equal candidate.id, FactoryGirl.build(:candidate_question, :candidate => candidate).candidate_id
42
+ end
43
+
44
+ test "ask return self" do
45
+ question = FactoryGirl.build(:candidate_question)
46
+ assert_equal question, question.ask
47
+ end
48
+
49
+ test "ask set asked_at to now" do
50
+ asked_at = Time.now
51
+ Time.stubs(:now).returns(asked_at)
52
+
53
+ question = FactoryGirl.build(:candidate_question)
54
+
55
+ assert_nil question.asked_at
56
+ question.ask
57
+ assert_equal asked_at, question.asked_at
58
+ end
59
+
60
+ test "ask set asked_at only once" do
61
+ asked_at = Time.now
62
+ asked_again_at = Time.now + 100
63
+ Time.stubs(:now).returns(asked_at)
64
+
65
+ question = FactoryGirl.build(:candidate_question)
66
+
67
+ assert_nil question.asked_at
68
+ question.ask
69
+ assert_equal asked_at, question.asked_at
70
+
71
+ Time.stubs(:now).returns(asked_again_at)
72
+ question.ask
73
+ assert_equal asked_at, question.asked_at
74
+ end
75
+
76
+ test "ask set state from open to asked" do
77
+ question = FactoryGirl.build(:candidate_question)
78
+
79
+ assert_equal :open, question.state
80
+ question.ask
81
+ assert_equal :asked, question.state
82
+ end
83
+
84
+ test "answer return given answer" do
85
+ question = FactoryGirl.build(:candidate_question)
86
+ answer_id = question.answers[0].id
87
+ question.ask
88
+ assert_equal question.answers[0], question.answer(answer_id)
89
+ end
90
+
91
+ test "given answer" do
92
+ question = FactoryGirl.build(:candidate_question)
93
+ answer_id = question.answers[0].id
94
+
95
+ question.ask
96
+ question.answer(answer_id)
97
+
98
+ assert_equal question.answers[0], question.given_answer
99
+ end
100
+
101
+ test "answer set answered_at to now" do
102
+ answered_at = Time.now
103
+ Time.stubs(:now).returns(answered_at)
104
+
105
+ question = FactoryGirl.build(:candidate_question)
106
+ answer_id = question.answers[0].id
107
+
108
+ assert_nil question.answered_at
109
+ question.ask
110
+ question.answer(answer_id)
111
+ assert_equal answered_at, question.answered_at
112
+ end
113
+
114
+ test "answer set given answer" do
115
+ question = FactoryGirl.build(:candidate_question)
116
+ answer_id = question.answers[0].id
117
+
118
+ question.ask
119
+ question.answer(answer_id)
120
+ assert_equal question.answers[0], question.given_answer
121
+ end
122
+
123
+ test "answer set state from asked to wrong" do
124
+ answers = [
125
+ FactoryGirl.build(:answer, :correct => false),
126
+ FactoryGirl.build(:answer, :correct => true)
127
+ ]
128
+
129
+ question = FactoryGirl.build(:candidate_question, :question => FactoryGirl.build(:question, :answers => answers))
130
+ answer_id = question.answers[0].id
131
+
132
+ assert_equal :open, question.state
133
+ question.ask
134
+ question.answer(answer_id)
135
+ assert_equal :wrong, question.state
136
+ end
137
+
138
+ test "answer set state from asked to correct" do
139
+ answers = [
140
+ FactoryGirl.build(:answer, :correct => false),
141
+ FactoryGirl.build(:answer, :correct => true)
142
+ ]
143
+
144
+ question = FactoryGirl.build(:candidate_question, :question => FactoryGirl.build(:question, :answers => answers))
145
+ answer_id = question.answers[1].id
146
+
147
+ assert_equal :open, question.state
148
+ question.ask
149
+ question.answer(answer_id)
150
+ assert_equal :correct, question.state
151
+ end
152
+
153
+ test "answer raise error if question already answered" do
154
+ question = FactoryGirl.build(:candidate_question)
155
+ answer_id = question.answers[0].id
156
+
157
+ question.ask
158
+ question.answer(answer_id)
159
+
160
+ assert_raises Barker::Errors::AlreadyAnsweredError do
161
+ question.answer(answer_id)
162
+ end
163
+ end
164
+
165
+ test "answer raise error if answer could not be found" do
166
+ question = FactoryGirl.build(:candidate_question)
167
+
168
+ question.ask
169
+
170
+ assert_raises Barker::Errors::AnswerNotFoundError do
171
+ question.answer(Time.now.to_i)
172
+ end
173
+ end
174
+
175
+ test "open?" do
176
+ assert FactoryGirl.build(:candidate_question).open?
177
+ end
178
+
179
+ test "asked?" do
180
+ assert FactoryGirl.build(:candidate_question, :asked_at => Time.now).asked?
181
+ end
182
+
183
+ test "answered?" do
184
+ assert FactoryGirl.build(:candidate_question, :answered_at => Time.now).answered?
185
+ end
186
+
187
+ test "correct?" do
188
+ answers = [
189
+ FactoryGirl.build(:answer, :correct => false),
190
+ FactoryGirl.build(:answer, :correct => true)
191
+ ]
192
+
193
+ question = FactoryGirl.build(:candidate_question, :question => FactoryGirl.build(:question, :answers => answers))
194
+ answer_id = question.answers[1].id
195
+
196
+ question.ask
197
+ question.answer(answer_id)
198
+
199
+ assert question.correct?
200
+ refute question.wrong?
201
+ end
202
+
203
+ test "wrong?" do
204
+ answers = [
205
+ FactoryGirl.build(:answer, :correct => false),
206
+ FactoryGirl.build(:answer, :correct => true)
207
+ ]
208
+
209
+ question = FactoryGirl.build(:candidate_question, :question => FactoryGirl.build(:question, :answers => answers))
210
+ answer_id = question.answers[0].id
211
+
212
+ question.ask
213
+ question.answer(answer_id)
214
+
215
+ refute question.correct?
216
+ assert question.wrong?
217
+ end
218
+
219
+ test "label fallback to en if candidate locale is missing" do
220
+ candidate = FactoryGirl.build(:candidate, :locale => 'wookie')
221
+ question = FactoryGirl.build(:candidate_question, :candidate => candidate, :question => FactoryGirl.build(:question, :label => {'en' => 'question in en'}))
222
+ assert_equal 'question in en', question.label
223
+ end
224
+
225
+ test "translate label in candidate locale" do
226
+ candidate = FactoryGirl.build(:candidate, :locale => 'wookie')
227
+ question = FactoryGirl.build(:candidate_question, :candidate => candidate, :question => FactoryGirl.build(:question, :label => {'en' => 'question in en', 'wookie' => 'woo arrr uuur'}))
228
+ assert_equal 'woo arrr uuur', question.label
229
+ end
230
+
231
+ test "timer nil by default" do
232
+ question = FactoryGirl.build(:candidate_question)
233
+ assert_equal nil, question.timer
234
+ refute question.timeout?
235
+ end
236
+
237
+ test "optional timer" do
238
+ question = FactoryGirl.build(:candidate_question, :timer => 20)
239
+ assert_equal 20, question.timer
240
+ refute question.timeout?
241
+ end
242
+
243
+ test "timeout?" do
244
+ answers = [
245
+ FactoryGirl.build(:answer, :correct => false),
246
+ FactoryGirl.build(:answer, :correct => true)
247
+ ]
248
+
249
+ question = FactoryGirl.build(:candidate_question, :question => FactoryGirl.build(:question, :answers => answers), :timer => 20)
250
+ answer_id = question.answers[0].id
251
+
252
+ asked_at = Time.now
253
+ Time.stubs(:now).returns(asked_at)
254
+
255
+ assert_equal 20, question.time_left
256
+ refute question.timeout?
257
+
258
+ question.ask
259
+
260
+ assert_equal 20, question.time_left
261
+ refute question.timeout?
262
+
263
+ answered_at = asked_at + 22
264
+ Time.stubs(:now).returns(answered_at)
265
+ question.answer(answer_id)
266
+
267
+ assert_equal 0, question.time_left
268
+ assert question.timeout?
269
+ end
270
+
271
+ private
272
+
273
+ let(:candidate) { FactoryGirl.build(:candidate) }
274
+ let(:question) { FactoryGirl.build(:question) }
275
+
276
+ end
277
+ end
@@ -0,0 +1,64 @@
1
+ require 'test_helper'
2
+
3
+ module Barker
4
+ class CandidateRoundRest < Spec
5
+
6
+ test "interface" do
7
+ Barker::CandidateRound.new(candidate, round)
8
+ end
9
+
10
+ test "candidate_question" do
11
+ candidate_round = Barker::CandidateRound.new(round.candidates.first, round)
12
+ candidate_question = candidate_round.question
13
+
14
+ assert_kind_of CandidateQuestion, candidate_question
15
+ assert_equal round.question, candidate_question.question
16
+ assert_equal round.candidates.first, candidate_question.candidate
17
+ end
18
+
19
+ test "ask delegation" do
20
+ candidate_round = CandidateRound.new(nil, nil)
21
+ question = Minitest::Mock.new
22
+
23
+ question.expect(:ask, :candidate_question, [{}])
24
+
25
+ candidate_round.stub :question, question do
26
+ assert_equal :candidate_question, candidate_round.ask
27
+ end
28
+
29
+ assert question.verify
30
+ end
31
+
32
+ test "answer delegation" do
33
+ candidate_round = CandidateRound.new(nil, nil)
34
+ question = Minitest::Mock.new
35
+
36
+ question.expect(:answer, :candidate_answer, [12])
37
+
38
+ candidate_round.stub :question, question do
39
+ assert_equal :candidate_answer, candidate_round.answer(12)
40
+ end
41
+
42
+ assert question.verify
43
+ end
44
+
45
+ test "given answer delegation" do
46
+ candidate_round = CandidateRound.new(nil, nil)
47
+ question = Minitest::Mock.new
48
+
49
+ question.expect(:given_answer, :candidate_answer)
50
+
51
+ candidate_round.stub :question, question do
52
+ assert_equal :candidate_answer, candidate_round.given_answer
53
+ end
54
+
55
+ assert question.verify
56
+ end
57
+
58
+ private
59
+
60
+ let(:round) { FactoryGirl.build :round }
61
+ let(:candidate) { round.candidates[0] }
62
+
63
+ end
64
+ end
@@ -0,0 +1,76 @@
1
+ require 'test_helper'
2
+
3
+ module Unit
4
+ class CandidateTest < Spec
5
+ test "has id" do
6
+ assert_kind_of Numeric, candidate.id
7
+ end
8
+
9
+ test "has locale" do
10
+ assert_equal "en", candidate.locale
11
+ end
12
+
13
+ test "joined_at" do
14
+ joined_at = Time.now
15
+ Time.stubs(:now).returns(joined_at)
16
+
17
+ refute candidate.joined_at
18
+ candidate.join
19
+ assert_equal joined_at, candidate.joined_at
20
+ end
21
+
22
+ test "leaved_at" do
23
+ leaved_at = Time.now
24
+ Time.stubs(:now).returns(leaved_at)
25
+
26
+ refute candidate.leaved_at
27
+ candidate.leave
28
+ assert_equal leaved_at, candidate.leaved_at
29
+ end
30
+
31
+ test "aborted_at" do
32
+ aborted_at = Time.now
33
+ Time.stubs(:now).returns(aborted_at)
34
+
35
+ refute candidate.aborted_at
36
+ candidate.abort
37
+ assert_equal aborted_at, candidate.aborted_at
38
+ end
39
+
40
+ test "joined?" do
41
+ refute candidate.joined?
42
+ candidate.join
43
+ assert candidate.joined?
44
+ end
45
+
46
+ test "leaved?" do
47
+ refute candidate.leaved?
48
+ candidate.leave
49
+ assert candidate.leaved?
50
+ end
51
+
52
+ test "aborted?" do
53
+ refute candidate.aborted?
54
+ candidate.abort
55
+ assert candidate.aborted?
56
+ end
57
+
58
+ test "candidate_id" do
59
+ assert_equal candidate.id, candidate.candidate_id
60
+ end
61
+
62
+ context "error" do
63
+ test "object has to respond to id" do
64
+ assert_raises Barker::Errors::HasToRespondToIdError do
65
+ candidate_without_id.id
66
+ end
67
+ end
68
+
69
+ test "object has to respond to locale" do
70
+ assert_raises Barker::Errors::HasToRespondToLocaleError do
71
+ candidate_without_locale.locale
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end