From 0e88b5e7036696e9de6a59c03eba3706075f7c64 Mon Sep 17 00:00:00 2001 From: baarkerlounger Date: Fri, 12 Nov 2021 17:37:03 +0000 Subject: [PATCH] Refactor --- README.md | 9 ++-- lib/tasks/form_definition.rake | 43 ++++++++----------- .../tasks/form_definition_validator_spec.rb | 32 ++++++++++++++ 3 files changed, 56 insertions(+), 28 deletions(-) create mode 100644 spec/lib/tasks/form_definition_validator_spec.rb diff --git a/README.md b/README.md index b637e606e..ab098aa84 100644 --- a/README.md +++ b/README.md @@ -163,12 +163,13 @@ Assumptions made by the format: ## JSON Form Validation against Schema To validate the form JSON against the schema you can run: -`rake form_definition:validate` +`rake form_definition:validate["config/forms/2021_22.json"]` -This will validate all forms in: -directories = ["config/forms", "spec/fixtures/forms"] +This will validate the given form definition against the schema in `config/forms/schema/generic.json`. -against the schema in (config/forms/schema/generic.json) +You can also run: +`rake form_definition:validate_all` +This will validate all forms in directories = ["config/forms", "spec/fixtures/forms"] ## Useful documentation (external dependencies) diff --git a/lib/tasks/form_definition.rake b/lib/tasks/form_definition.rake index c2b3c6103..7061acc56 100644 --- a/lib/tasks/form_definition.rake +++ b/lib/tasks/form_definition.rake @@ -13,37 +13,32 @@ end namespace :form_definition do desc "Validate JSON against Generic Form Schema" - task validate: :environment do - puts Rails.root.to_s - path = "config/forms/schema/generic.json" - file = File.open(path) - schema = JSON.parse(file.read) - metaschema = JSON::Validator.validator_for_name("draft4").metaschema + task validate_all: :environment do + puts Rails.root.to_s - puts path + directories = ["config/forms", "spec/fixtures/forms"] + paths = get_all_form_paths(directories) + ["config/forms/schema/generic.json"] - if JSON::Validator.validate(metaschema, schema) - puts "schema valid" - else - puts "schema not valid" - return + paths.each do |path| + Rake::Task["form_definition:validate"].reenable + Rake::Task["form_definition:validate"].invoke(path) end + end - directories = ["config/forms", "spec/fixtures/forms"] - - get_all_form_paths(directories).each do |path| - puts path - file = File.open(path) - data = JSON.parse(file.read) + task :validate, %i[path] => :environment do |_task, args| + path = Rails.root.join(args.path) + file = File.open(path) + form_definition = JSON.parse(file.read) + schema = JSON::Validator.validator_for_name("draft4").metaschema - puts JSON::Validator.fully_validate(schema, data, strict: true) + puts path + puts JSON::Validator.fully_validate(schema, form_definition, strict: true) - begin - JSON::Validator.validate!(schema, data) - rescue JSON::Schema::ValidationError => e - e.message - end + begin + JSON::Validator.validate!(schema, form_definition) + rescue JSON::Schema::ValidationError => e + e.message end end end diff --git a/spec/lib/tasks/form_definition_validator_spec.rb b/spec/lib/tasks/form_definition_validator_spec.rb new file mode 100644 index 000000000..55479fe7b --- /dev/null +++ b/spec/lib/tasks/form_definition_validator_spec.rb @@ -0,0 +1,32 @@ +require "rails_helper" +require "rake" + +describe "rake form_definition:validate_all", type: :task do + subject(:task) { Rake::Task["form_definition:validate_all"] } + + before do + Rake.application.rake_require("tasks/form_definition") + Rake::Task.define_task(:environment) + task.reenable + end + + it "runs the validate task for each form definition in the project" do + expect(Rake::Task["form_definition:validate"]).to receive(:invoke).exactly(5).times + task.invoke + end +end + +describe "rake form_definition:validate", type: :task do + subject(:task) { Rake::Task["form_definition:validate"] } + + before do + Rake.application.rake_require("tasks/form_definition") + Rake::Task.define_task(:environment) + task.reenable + end + + it "runs the validate task for the given form definition" do + expect(JSON::Validator).to receive(:validate!).at_least(1).time + task.invoke("config/forms/2021_2022.json") + end +end