diff --git a/lib/quby/compiler/services/definition_validator.rb b/lib/quby/compiler/services/definition_validator.rb index 6785a6bddb6ce3b172cbbfbb21f3a7999f866348..6cf8c58efc859c6359fd11c4e2207b955d45a87e 100644 --- a/lib/quby/compiler/services/definition_validator.rb +++ b/lib/quby/compiler/services/definition_validator.rb @@ -25,7 +25,6 @@ module Quby validate_outcome_tables(questionnaire) validate_markdown_fields(questionnaire) if questionnaire.validate_html validate_raw_content_items(questionnaire) if questionnaire.validate_html - validate_scores(questionnaire) # Some compilation errors are Exceptions (pure syntax errors) and some StandardErrors (NameErrors) rescue Exception => exception # rubocop:disable Lint/RescueException definition.errors.add(:sourcecode, {message: "Questionnaire error: #{definition.key}\n" \ @@ -81,6 +80,13 @@ module Quby fail "Score #{score.key} does not have a score schema" unless score_schema fail "Score label langer dan 100 tekens (geeft problemen oru accare)\n #{score_schema.label}" if score_schema.label&.length > 100 end + + export_keys = questionnaire.score_schemas.flat_map { |_key, score_schema| + score_schema.subscore_schemas.map(&:export_key) + } + + duplicate_export_keys = export_keys.tally.select { |key, count| count > 1 }.keys + fail "Score export keys not unique, duplicates: #{duplicate_export_keys}" if duplicate_export_keys.present? end def validate_question_options(questionnaire, question) @@ -241,8 +247,6 @@ scores_schema tables to the resulting seed." def validate_score_label_present(score) fail "Score #{score.key} label must be passed in as an option." unless score.label.present? - - end def validate_subquestion_absence_in_select(question) diff --git a/spec/quby/compiler/services/definition_validator_spec.rb b/spec/quby/compiler/services/definition_validator_spec.rb index 65309bc1a871870ce1dbf936a4fa22bd25318958..09a1aacefd2e589e03e1ae90b091f6023cc2c4f9 100644 --- a/spec/quby/compiler/services/definition_validator_spec.rb +++ b/spec/quby/compiler/services/definition_validator_spec.rb @@ -821,5 +821,23 @@ module Quby::Compiler::Services expect(definition.valid?).to be true end end + + describe '#validate_scores' do + it 'fails on duplicate export keys' do + definition = make_definition(<<-END) + title "Test" + score :tot, label: "Totaalscore", schema: [{:export_key=>:tot, :label=>"Score", :key=>:value}] do + {} + end + + score :tot2, label: "Totaalscore", schema: [{:export_key=>:tot, :label=>"Score", :key=>:value}] do + {} + end + END + expect(definition.valid?).to be false + expect(definition.errors.full_messages.first).to \ + include('Score export keys not unique, duplicates: [:tot]') + end + end end end