mumuki-laboratory 7.10.3 → 7.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -7
  3. data/Rakefile +9 -2
  4. data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +26 -5
  5. data/app/assets/javascripts/mumuki_laboratory/application/gamification.js +85 -0
  6. data/app/assets/javascripts/mumuki_laboratory/application/kindergarten.js +145 -0
  7. data/app/assets/javascripts/mumuki_laboratory/application/profile.js +31 -16
  8. data/app/assets/javascripts/mumuki_laboratory/application/submission.js +1 -0
  9. data/app/assets/javascripts/mumuki_laboratory/application/submissions-store.js +19 -2
  10. data/app/assets/stylesheets/mumuki_laboratory/application/_errors.scss +3 -4
  11. data/app/assets/stylesheets/mumuki_laboratory/application/_modules.scss +3 -1
  12. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_avatar.scss +21 -0
  13. data/app/assets/stylesheets/mumuki_laboratory/application/modules/{_chapter_show.scss → _content_show.scss} +0 -0
  14. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_kindergarten.scss +401 -12
  15. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_medal.scss +48 -0
  16. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_terms.scss +44 -0
  17. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_user_profile.scss +9 -0
  18. data/app/controllers/application_controller.rb +15 -8
  19. data/app/controllers/book_discussions_controller.rb +4 -0
  20. data/app/controllers/users_controller.rb +8 -2
  21. data/app/helpers/application_helper.rb +2 -2
  22. data/app/helpers/avatar_helper.rb +11 -3
  23. data/app/helpers/kindergarten_helper.rb +5 -0
  24. data/app/helpers/links_helper.rb +8 -0
  25. data/app/helpers/medal_helper.rb +36 -0
  26. data/app/helpers/open_graph_helper.rb +2 -2
  27. data/app/helpers/organization_list_helper.rb +1 -1
  28. data/app/helpers/overlapped_buttons_helper.rb +1 -1
  29. data/app/helpers/page_title_helper.rb +2 -2
  30. data/app/helpers/profile_helper.rb +9 -1
  31. data/app/views/book/_header.html.erb +17 -0
  32. data/app/views/book/show.html.erb +1 -18
  33. data/app/views/discussions/terms.html.erb +10 -0
  34. data/app/views/exercises/show.html.erb +1 -0
  35. data/app/views/invitations/_invitation_form.html.erb +1 -0
  36. data/app/views/layouts/_discussions.html.erb +5 -1
  37. data/app/views/layouts/_error.html.erb +3 -6
  38. data/app/views/layouts/_guide.html.erb +10 -3
  39. data/app/views/layouts/_kindergarten.html.erb +38 -0
  40. data/app/views/layouts/_main.html.erb +3 -1
  41. data/app/views/layouts/_organization_chooser.html.erb +0 -7
  42. data/app/views/layouts/_terms_acceptance_disclaimer.html.erb +6 -0
  43. data/app/views/layouts/application.html.erb +3 -2
  44. data/app/views/layouts/exercise_inputs/layouts/_input_kindergarten.html.erb +27 -27
  45. data/app/views/layouts/modals/_guide_corollary.html.erb +9 -0
  46. data/app/views/layouts/modals/_kindergarten_context.html.erb +30 -0
  47. data/app/views/layouts/modals/_kindergarten_results.html.erb +23 -0
  48. data/app/views/layouts/modals/_kindergarten_results_aborted.html.erb +24 -0
  49. data/app/views/users/_avatar_list.html.erb +6 -2
  50. data/app/views/users/_edit_user_form.html.erb +9 -4
  51. data/app/views/users/_term.html.erb +10 -0
  52. data/app/views/users/_user_form.html.erb +5 -1
  53. data/app/views/users/terms.html.erb +18 -0
  54. data/config/routes.rb +2 -0
  55. data/lib/mumuki/laboratory/controllers/current_organization.rb +1 -1
  56. data/lib/mumuki/laboratory/controllers/results_rendering.rb +3 -2
  57. data/lib/mumuki/laboratory/locales/en.yml +10 -5
  58. data/lib/mumuki/laboratory/locales/es-CL.yml +5 -4
  59. data/lib/mumuki/laboratory/locales/es.yml +12 -7
  60. data/lib/mumuki/laboratory/locales/pt.yml +12 -7
  61. data/lib/mumuki/laboratory/version.rb +1 -1
  62. data/spec/capybara_helper.rb +99 -0
  63. data/spec/controllers/exercise_solutions_controller_spec.rb +3 -4
  64. data/spec/dummy/db/schema.rb +37 -1
  65. data/spec/dummy/public/medal/outline.svg +1089 -0
  66. data/spec/features/choose_organization_spec.rb +12 -30
  67. data/spec/features/disable_user_flow_spec.rb +3 -5
  68. data/spec/features/disabled_organization_flow_spec.rb +9 -14
  69. data/spec/features/exercise_flow_spec.rb +2 -2
  70. data/spec/features/guide_reset_spec.rb +1 -1
  71. data/spec/features/guides_flow_spec.rb +1 -1
  72. data/spec/features/home_private_flow_spec.rb +1 -3
  73. data/spec/features/home_public_flow_spec.rb +6 -12
  74. data/spec/features/invitations_flow_spec.rb +2 -2
  75. data/spec/features/login_flow_spec.rb +2 -2
  76. data/spec/features/not_found_private_flow_spec.rb +4 -4
  77. data/spec/features/not_found_public_flow_spec.rb +1 -6
  78. data/spec/features/profile_flow_spec.rb +1 -1
  79. data/spec/helpers/page_title_helper_spec.rb +3 -3
  80. data/spec/javascripts/editors-spec.js +23 -0
  81. data/spec/javascripts/gamification-spec.js +58 -0
  82. data/spec/javascripts/submissions-store-spec.js +139 -6
  83. data/spec/spec_helper.rb +2 -0
  84. data/spec/teaspoon_env.rb +24 -6
  85. metadata +40 -7
@@ -103,6 +103,7 @@ es-CL:
103
103
  first_name: Nombre
104
104
  forbidden_explanation: ¿Puede que hayas ingresado con una cuenta incorrecta?
105
105
  format: Dar formato
106
+ forum_terms_link: Si tienes alguna duda, consulta las %{terms_link}
106
107
  fullscreen: "Pantalla completa"
107
108
  gender: Género
108
109
  get_messages: "Ver mensajes"
@@ -143,6 +144,7 @@ es-CL:
143
144
  locked_content: 'Éste contenido se desbloqueará cuando termines los capítulos anteriores'
144
145
  male: Hombre
145
146
  manual_evaluation_pending: ¡Gracias por enviar tu solución! Tus docentes la corregirán pronto
147
+ medal: Medalla
146
148
  message_count:
147
149
  one: 1 mensaje
148
150
  other: '%{count} mensajes'
@@ -153,8 +155,6 @@ es-CL:
153
155
  minutes: minutos
154
156
  more_messages: Ver mensajes anteriores
155
157
  moderator: Moderador
156
- mumuki_catchphrase: Aprende a programar
157
- mumuki_short_description: Mumuki es la plataforma libre y gratuita para aprender a programar, de la práctica a la teoría y en tu idioma
158
158
  my_doubts: Mis consultas
159
159
  name: Nombre
160
160
  navigation_continue: 'Siguiente %{kind}: %{sibling}'
@@ -201,7 +201,6 @@ es-CL:
201
201
  permissions: Permisos
202
202
  please_fill_profile_data: ¡Completa tus datos personales para continuar!
203
203
  please_validate: 'Estás a punto de ingresar al curso. Para poder ofrecerte una mejor experiencia, por favor valida que tus datos a continuación sean reales y correctos.'
204
- powered_by_mumuki_html: "por <span class=\"da da-mumuki-circle\"></span> mumuki"
205
204
  previous_exercise: Anterior
206
205
  problem_with_exercise: '[Mumuki] Error con el ejercicio: %{title}'
207
206
  processing_your_solution: Estamos procesando tu solución
@@ -245,7 +244,6 @@ es-CL:
245
244
  start_practicing: ¡Empieza ahora!
246
245
  start_using_mumuki: ¡Empieza a usar Mumuki!
247
246
  status: Estado
248
- stay_here: No, quiero quedarme acá
249
247
  stop_emails?: ¿Quieres dejar de recibir estos mails?
250
248
  subscribe: Recibir notificaciones
251
249
  submission: solución
@@ -260,6 +258,8 @@ es-CL:
260
258
  tell_us_how: ¡Cuéntanos cómo te pasó esto!
261
259
  tell_us_if_our_error: Si piensas que es un error nuestro, %{issues}
262
260
  terms_and_conditions: Términos y condiciones
261
+ terms_and_conditions_continue_disclaimer: Al continuar aceptas los %{terms_link}
262
+ terms_and_conditions_must_be_accepted: Tienes que aceptar los términos y condiciones
263
263
  test_results: Resultados de las pruebas
264
264
  time_since: "hace %{time}"
265
265
  time_left: Te quedan
@@ -271,6 +271,7 @@ es-CL:
271
271
  unauthorized_explanation: ¡Ups! Esto es lo que se conoce como %{error}, es decir que no iniciaste sesión.
272
272
  uncategorized: No categorizado
273
273
  undo_upvote: No es útil
274
+ unlocked_medal_as_avatar: ¡Obtuviste esta medalla! Ya puedes elegirla como avatar.
274
275
  unspecified: Prefiero no decirlo
275
276
  unmeet_expectations: Objetivos que no se cumplieron
276
277
  unprepared_organization_explanation: ¡Este recorrido aún no ha comenzado!
@@ -3,7 +3,9 @@ es:
3
3
  aborted: Ups, no pudimos evaluar tu solución
4
4
  abort_explanation_html: <li>Revisá que tu programa no tenga recursión o algún bucle infinito</li><li>Revisá que tengas conexión a internet</li><li>Esperá un rato e intentalo nuevamente</li>
5
5
  about: Detalles
6
- accept_terms: Acepto los términos y condiciones
6
+ accept: Aceptar
7
+ accept_terms: He leido y acepto los términos y condiciones
8
+ accept_terms_to_continue: Para continuar es necesario aceptar los términos y condiciones
7
9
  actions: Acciones
8
10
  activity: Actividad
9
11
  actual_state: Tablero obtenido
@@ -68,7 +70,7 @@ es:
68
70
  destroy: Eliminar
69
71
  details: Detalles
70
72
  disabled_explanation: Estás intentando acceder a un recurso que fue deshabilitado o eliminado de forma permamente
71
- disabled_organization_explanation: ¡Este recorrido ha finalizado!
73
+ disabled_organization_explanation: Este recorrido ha finalizado
72
74
  discussion_description_placeholder: Podés agregar información para detallar más tu consulta
73
75
  discussion_updated: Consulta actualizada
74
76
  discussions: Consultas
@@ -109,6 +111,8 @@ es:
109
111
  first_name: Nombre
110
112
  forbidden_explanation: ¿Puede que hayas ingresado con una cuenta incorrecta?
111
113
  format: Dar formato
114
+ forum_terms: Reglas del foro
115
+ forum_terms_link: Si tenés alguna duda, consultá las %{terms_link}
112
116
  fullscreen: "Pantalla completa"
113
117
  gender: Género
114
118
  get_messages: "Ver mensajes"
@@ -150,6 +154,7 @@ es:
150
154
  locked_content: 'Este contenido se desbloqueará cuando termines los capítulos anteriores'
151
155
  male: Hombre
152
156
  manual_evaluation_pending: ¡Gracias por enviar tu solución! Tus docentes la corregirán pronto
157
+ medal: Medalla
153
158
  message_count:
154
159
  one: 1 mensaje
155
160
  other: '%{count} mensajes'
@@ -160,8 +165,6 @@ es:
160
165
  minutes: minutos
161
166
  more_messages: Ver mensajes anteriores
162
167
  moderator: Mentor
163
- mumuki_catchphrase: Aprendé a programar
164
- mumuki_short_description: Mumuki es la plataforma libre y gratuita para aprender a programar, de la práctica a la teoría y en tu idioma
165
168
  my_doubts: Mis consultas
166
169
  name: Nombre
167
170
  navigation_continue: 'Siguiente %{kind}: %{sibling}'
@@ -208,7 +211,6 @@ es:
208
211
  permissions: Permisos
209
212
  please_fill_profile_data: ¡Completá tus datos personales para continuar!
210
213
  please_validate: 'Estás a punto de ingresar al curso. Para poder ofrecerte una mejor experiencia, por favor validá que tus datos a continuación sean reales y correctos.'
211
- powered_by_mumuki_html: "por <span class=\"da da-mumuki-circle\"></span> mumuki"
212
214
  previous_exercise: Anterior
213
215
  problem_with_exercise: '[Mumuki] Error con el ejercicio: %{title}'
214
216
  processing_your_solution: Estamos procesando tu solución
@@ -256,7 +258,6 @@ es:
256
258
  start_practicing: ¡Empezá ahora!
257
259
  start_using_mumuki: ¡Empezá a usar Mumuki!
258
260
  status: Estado
259
- stay_here: No, quiero quedarme acá
260
261
  stop_emails?: ¿Querés dejar de recibir estos mails?
261
262
  subscribe: Recibir notificaciones
262
263
  submission: solución
@@ -270,7 +271,10 @@ es:
270
271
  teacher_info: Información para docentes
271
272
  tell_us_how: ¡Contanos cómo te pasó esto!
272
273
  tell_us_if_our_error: Si pensás que es un error nuestro, %{issues}
274
+ terms_accepted: Los términos y condiciones fueron aceptados
273
275
  terms_and_conditions: Términos y condiciones
276
+ terms_and_conditions_continue_disclaimer: Al continuar estás aceptando los %{terms_link}
277
+ terms_and_conditions_must_be_accepted: Tenés que aceptar los términos y condiciones
274
278
  test_results: Resultados de las pruebas
275
279
  time_since: "hace %{time}"
276
280
  time_left: Te quedan
@@ -282,9 +286,10 @@ es:
282
286
  unauthorized_explanation: ¡Ups! Esto es lo que se conoce como %{error}, es decir que no iniciaste sesión.
283
287
  uncategorized: No categorizado
284
288
  undo_upvote: No es útil
289
+ unlocked_medal_as_avatar: ¡Obtuviste esta medalla! Ya podés elegirla como avatar.
285
290
  unspecified: Prefiero no decirlo
286
291
  unmeet_expectations: Objetivos que no se cumplieron
287
- unprepared_organization_explanation: ¡Este recorrido aún no ha comenzado!
292
+ unprepared_organization_explanation: Este recorrido aún no ha comenzado
288
293
  unsubscribe: Dejar de recibir notificaciones
289
294
  unsubscribed_successfully: Te desuscribiste exitosamente de los recordatorios.
290
295
  upload_solution: "Subir solución"
@@ -3,7 +3,9 @@ pt:
3
3
  aborted: Opa, não pudemos avaliar sua solução
4
4
  abort_explanation_html: <li>Verifique se o seu programa não possui recursão ou um loop infinito</li> <li>Verifique se você tem uma conexão com a internet</li> <li>Espere um pouco e tente novamente</li>
5
5
  about: Detalhes
6
- accept_terms: Aceito os termos e condições
6
+ accept: Aceitar
7
+ accept_terms: Eu li e aceito ceito os termos e condições
8
+ accept_terms_to_continue: Aceite os termos e condições para continuar
7
9
  actions: Ações
8
10
  activity: Atividade
9
11
  actual_state: Tablero obtido
@@ -65,7 +67,7 @@ pt:
65
67
  destroy: Excluir
66
68
  details: Detalhes
67
69
  disabled_explanation: Você está tentando acessar um recurso que foi desativado ou removido permanentemente
68
- disabled_organization_explanation: Este curso terminou!
70
+ disabled_organization_explanation: Este curso terminou
69
71
  discussion_description_placeholder: Você pode adicionar mais informações sobre sua dúvida
70
72
  discussion_updated: Consulta actualizada
71
73
  discussions: Consultas
@@ -105,6 +107,8 @@ pt:
105
107
  first_name: Nome
106
108
  forbidden_explanation: Você poderia ter entrado com uma conta incorreta?
107
109
  format: Formato
110
+ forum_terms: Regras do fórum
111
+ forum_terms_link: Se você tiver alguma dúvida, consulte as %{terms_link}
108
112
  fullscreen: Tela completa
109
113
  gender: Gênero
110
114
  get_messages: Ver mensagens
@@ -144,6 +148,7 @@ pt:
144
148
  locked_content: 'Este conteúdo será desbloqueado quando você terminar os capítulos anteriores'
145
149
  male: Masculino
146
150
  manual_evaluation_pending: Obrigado por enviar sua solução! Seus professores irão corrigi-lo em breve
151
+ medal: Medalha
147
152
  message_count:
148
153
  one: 1 mensagem
149
154
  other: '%{count} mensagens'
@@ -154,8 +159,6 @@ pt:
154
159
  minutes: minutos
155
160
  more_messages: Ver as mensagens anteriores
156
161
  moderator: Mentor
157
- mumuki_catchphrase: Aprendi a programar
158
- mumuki_short_description: Mumuki é a plataforma gratuita e gratuita para aprender a programar, desde a prática até a teoria e no seu idioma
159
162
  my_doubts: Minhas duvidas
160
163
  name: Nome
161
164
  navigation_continue: "Próximo %{kind}: %{sibling}"
@@ -199,7 +202,6 @@ pt:
199
202
  permissions: Permissões
200
203
  please_fill_profile_data: Preencha suas informações pessoais para continuar!
201
204
  please_validate: Você está prestes a entrar no curso. Para oferecer uma experiência melhor, valide que seus dados abaixo sejam reais e corretos.
202
- powered_by_mumuki_html: por <span class = "da da-mumuki-circle"> </ span> mumuki
203
205
  previous_exercise: Anterior
204
206
  problem_with_exercise: '[Mumuki] Erro com exercício %{title}'
205
207
  processing_your_solution: Estamos processando sua solução
@@ -242,7 +244,6 @@ pt:
242
244
  start_lesson: Comece esta lição!
243
245
  start_practicing: Comece agora!
244
246
  status: Estado
245
- stay_here: Não, eu quero ficar aqui
246
247
  submission: solução
247
248
  submission_date: Data de envio
248
249
  submission_for_exercise: Solução para exercício
@@ -255,7 +256,10 @@ pt:
255
256
  teacher_info: Informação para professores
256
257
  tell_us_how: Conte-nos como isso aconteceu com você!
257
258
  tell_us_if_our_error: Se você acha que é nosso erro, %{issues}
259
+ terms_accepted: Os termos e condições foram aceitos
258
260
  terms_and_conditions: Termos e Condições
261
+ terms_and_conditions_continue_disclaimer: Ao continuar, você concorda %{terms_link}
262
+ terms_and_conditions_must_be_accepted: Você deve aceitar os Termos e Condições
259
263
  test_results: Resultados do teste
260
264
  time_since: "há %{time}"
261
265
  time_left: Te deixam
@@ -266,9 +270,10 @@ pt:
266
270
  to_solved: Marcar como resolvida
267
271
  unauthorized_explanation: Opa! Isso é o que é conhecido como %{error}, ou seja, você não fez logon.
268
272
  uncategorized: Não classificado
273
+ unlocked_medal_as_avatar: Você ganhou essa medalha! Agora você pode escolhê-la como avatar.
269
274
  unspecified: Eu preferiria não dizer
270
275
  unmeet_expectations: Objetivos que não foram atendidos
271
- unprepared_organization_explanation: Este curso ainda não começou!
276
+ unprepared_organization_explanation: Este curso ainda não começou
272
277
  unsubscribe: Cancelar subscrição
273
278
  upload_solution: Carregar solução
274
279
  uploading_solution: Uploading solution
@@ -1,5 +1,5 @@
1
1
  module Mumuki
2
2
  module Laboratory
3
- VERSION = '7.10.3'
3
+ VERSION = '7.12.0'
4
4
  end
5
5
  end
@@ -1,12 +1,111 @@
1
1
  require 'capybara/rails'
2
2
  require 'capybara/rspec'
3
3
 
4
+ # Test helpers
5
+
6
+ def page_body
7
+ find('body')
8
+ end
9
+
10
+ def set_request_header!(key, value)
11
+ current_driver = Capybara.current_session.driver
12
+ if current_driver.respond_to? :header
13
+ current_driver.header key, value
14
+ else
15
+ $custom_headers = {key => value}
16
+ end
17
+ end
18
+
4
19
  def set_subdomain_host!(subdomain)
5
20
  @request.try { |it| it.host = Mumukit::Platform.laboratory.organic_domain subdomain }
6
21
  Capybara.app_host = Mumukit::Platform.laboratory.organic_url subdomain
7
22
  end
8
23
 
9
24
  def set_implicit_central!
25
+ warn "Implicit behaviour is going to be removed soon"
10
26
  @request.try { |it| it.host = Mumukit::Platform.laboratory.domain }
11
27
  Capybara.app_host = Mumukit::Platform.laboratory.url
12
28
  end
29
+
30
+ # Config helpers
31
+
32
+ def selected_driver
33
+ case ENV['MUMUKI_SELENIUM_DRIVER']
34
+ when 'chrome'
35
+ :selenium_chrome_headless
36
+ when 'firefox'
37
+ :selenium_headless
38
+ when 'safari'
39
+ :selenium_safari
40
+ else
41
+ :rack_test
42
+ end
43
+ end
44
+
45
+ def run_with_selenium?
46
+ selected_driver.to_s.start_with? 'selenium'
47
+ end
48
+
49
+ def register_safari_driver!
50
+ # No official docs for this, code was taken from https://github.com/teamcapybara/capybara/blob/master/spec/selenium_spec_safari.rb
51
+ Capybara.register_driver :selenium_safari do |app|
52
+ Capybara::Selenium::Driver.new(app, browser: :safari, timeout: 30)
53
+ end
54
+ end
55
+
56
+ # Registers a middleware to set request headers, because Selenium Webdriver has no native support for that
57
+ def register_request_headers_workaround!
58
+ RSpec.configure do |config|
59
+ config.after(:suite) do
60
+ $custom_headers = nil
61
+ end
62
+ end
63
+
64
+ Object.class_eval <<-EOR
65
+ module RequestWithExtraHeaders
66
+ def headers
67
+ $custom_headers.each { |key, value| self.set_header "HTTP_\#{key}", value } if $custom_headers
68
+ super
69
+ end
70
+ end
71
+
72
+ class ActionDispatch::Request
73
+ prepend RequestWithExtraHeaders
74
+ end
75
+ EOR
76
+ end
77
+
78
+ def exclude_selenium_failing_tests!
79
+ RSpec.configure do |config|
80
+ config.filter_run_excluding(
81
+ # Response headers are not supported by Selenium Driver
82
+ :http_response_headers,
83
+
84
+ # TODO: the following ignored groups should be fixed
85
+ :element_not_interactable_error,
86
+ :invalid_selector_error,
87
+ :json_eq_error,
88
+ :navigation_error,
89
+ :organization_not_nil,
90
+ :xpath_no_matches
91
+ )
92
+ end
93
+ end
94
+
95
+ # Configuration
96
+
97
+ register_safari_driver! if selected_driver == :selenium_safari
98
+ Capybara.default_driver = selected_driver
99
+
100
+ # TODO: fix the tests that depend on hidden elements and remove this
101
+ Capybara.ignore_hidden_elements = false
102
+
103
+ if run_with_selenium?
104
+ register_request_headers_workaround!
105
+ exclude_selenium_failing_tests!
106
+
107
+ # Include port on the URL, so we don't need to forward it via nginx or so
108
+ Capybara.always_include_port = true
109
+ end
110
+
111
+ puts "Running Capybara tests with #{selected_driver}, #{Capybara.ignore_hidden_elements ? '' : 'not '}ignoring hidden elements"
@@ -62,8 +62,7 @@ describe ExerciseSolutionsController, organization_workspace: :test do
62
62
  it { expect(assignment.solution).to eq('the content')}
63
63
 
64
64
  it { expect(response.body).to json_eq({ status: :failed, guide_finished_by_solution: false },
65
- except: [:html, :remaining_attempts_html]) }
66
-
65
+ except: [:html, :remaining_attempts_html, :current_exp]) }
67
66
 
68
67
  it 'does not include kids specific renders' do
69
68
  body = JSON.parse(response.body)
@@ -89,8 +88,8 @@ describe ExerciseSolutionsController, organization_workspace: :test do
89
88
  before { post_problem(kids_problem) }
90
89
 
91
90
  it { expect(response.body).to json_eq({ status: :failed, guide_finished_by_solution: false },
92
- except: [:html, :remaining_attempts_html,
93
- :title_html, :button_html, :expectations, :test_results, :tips]) }
91
+ except: [:html, :remaining_attempts_html, :title_html, :button_html,
92
+ :expectations, :test_results, :tips, :current_exp]) }
94
93
 
95
94
  it 'includes kids specific renders' do
96
95
  body = JSON.parse(response.body)
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 20200804191643) do
13
+ ActiveRecord::Schema.define(version: 20201027152806) do
14
14
 
15
15
  # These are extensions that must be enabled in order to support this database
16
16
  enable_extension "plpgsql"
@@ -45,6 +45,7 @@ ActiveRecord::Schema.define(version: 20200804191643) do
45
45
  t.datetime "submitted_at"
46
46
  t.bigint "parent_id"
47
47
  t.integer "top_submission_status"
48
+ t.boolean "misplaced"
48
49
  t.index ["exercise_id"], name: "index_assignments_on_exercise_id"
49
50
  t.index ["organization_id"], name: "index_assignments_on_organization_id"
50
51
  t.index ["parent_id"], name: "index_assignments_on_parent_id"
@@ -66,6 +67,7 @@ ActiveRecord::Schema.define(version: 20200804191643) do
66
67
  t.text "description"
67
68
  t.string "slug"
68
69
  t.boolean "private", default: false
70
+ t.bigint "medal_id"
69
71
  t.index ["slug"], name: "index_books_on_slug", unique: true
70
72
  end
71
73
 
@@ -124,9 +126,12 @@ ActiveRecord::Schema.define(version: 20200804191643) do
124
126
  t.boolean "requires_moderator_response", default: true
125
127
  t.string "last_moderator_access_by_id"
126
128
  t.datetime "last_moderator_access_at"
129
+ t.bigint "status_updated_by_id"
130
+ t.datetime "status_updated_at"
127
131
  t.index ["initiator_id"], name: "index_discussions_on_initiator_id"
128
132
  t.index ["item_type", "item_id"], name: "index_discussions_on_item_type_and_item_id"
129
133
  t.index ["organization_id"], name: "index_discussions_on_organization_id"
134
+ t.index ["status_updated_by_id"], name: "index_discussions_on_status_updated_by_id"
130
135
  end
131
136
 
132
137
  create_table "exam_authorizations", force: :cascade do |t|
@@ -218,6 +223,7 @@ ActiveRecord::Schema.define(version: 20200804191643) do
218
223
  t.text "learn_more"
219
224
  t.text "settings"
220
225
  t.text "custom_expectations"
226
+ t.bigint "medal_id"
221
227
  t.index ["name"], name: "index_guides_on_name"
222
228
  t.index ["slug"], name: "index_guides_on_slug", unique: true
223
229
  end
@@ -234,6 +240,7 @@ ActiveRecord::Schema.define(version: 20200804191643) do
234
240
  t.boolean "dirty_by_submission", default: false
235
241
  t.integer "children_passed_count"
236
242
  t.integer "children_count"
243
+ t.boolean "once_completed"
237
244
  t.index ["content_type", "content_id"], name: "index_indicators_on_content_type_and_content_id"
238
245
  t.index ["organization_id"], name: "index_indicators_on_organization_id"
239
246
  t.index ["parent_id"], name: "index_indicators_on_parent_id"
@@ -289,6 +296,11 @@ ActiveRecord::Schema.define(version: 20200804191643) do
289
296
  t.integer "topic_id"
290
297
  end
291
298
 
299
+ create_table "medals", force: :cascade do |t|
300
+ t.string "image_url"
301
+ t.string "description"
302
+ end
303
+
292
304
  create_table "messages", id: :serial, force: :cascade do |t|
293
305
  t.string "submission_id"
294
306
  t.text "content"
@@ -313,6 +325,10 @@ ActiveRecord::Schema.define(version: 20200804191643) do
313
325
  t.integer "progressive_display_lookahead"
314
326
  t.integer "target_audience", default: 0
315
327
  t.boolean "incognito_mode_enabled"
328
+ t.text "display_name"
329
+ t.text "display_description"
330
+ t.boolean "wins_page"
331
+ t.boolean "immersible"
316
332
  t.index ["book_id"], name: "index_organizations_on_book_id"
317
333
  t.index ["name"], name: "index_organizations_on_name", unique: true
318
334
  end
@@ -334,6 +350,15 @@ ActiveRecord::Schema.define(version: 20200804191643) do
334
350
  t.index ["user_id"], name: "index_subscriptions_on_user_id"
335
351
  end
336
352
 
353
+ create_table "terms", force: :cascade do |t|
354
+ t.string "locale"
355
+ t.string "scope"
356
+ t.text "content"
357
+ t.text "header"
358
+ t.datetime "created_at", null: false
359
+ t.datetime "updated_at", null: false
360
+ end
361
+
337
362
  create_table "topics", id: :serial, force: :cascade do |t|
338
363
  t.string "name"
339
364
  t.string "locale"
@@ -343,6 +368,7 @@ ActiveRecord::Schema.define(version: 20200804191643) do
343
368
  t.text "appendix"
344
369
  t.string "slug"
345
370
  t.boolean "private", default: false
371
+ t.bigint "medal_id"
346
372
  t.index ["slug"], name: "index_topics_on_slug", unique: true
347
373
  end
348
374
 
@@ -398,6 +424,16 @@ ActiveRecord::Schema.define(version: 20200804191643) do
398
424
  t.bigint "avatar_id"
399
425
  t.datetime "disabled_at"
400
426
  t.boolean "trusted_for_forum"
427
+ t.string "avatar_type", default: "Avatar"
428
+ t.datetime "headmaster_terms_accepted_at"
429
+ t.datetime "janitor_terms_accepted_at"
430
+ t.datetime "moderator_terms_accepted_at"
431
+ t.datetime "student_terms_accepted_at"
432
+ t.datetime "teacher_terms_accepted_at"
433
+ t.datetime "privacy_terms_accepted_at"
434
+ t.datetime "legal_terms_accepted_at"
435
+ t.datetime "forum_terms_accepted_at"
436
+ t.index ["avatar_type", "avatar_id"], name: "index_users_on_avatar_type_and_avatar_id"
401
437
  t.index ["disabled_at"], name: "index_users_on_disabled_at"
402
438
  t.index ["last_organization_id"], name: "index_users_on_last_organization_id"
403
439
  t.index ["uid"], name: "index_users_on_uid", unique: true