diff --git a/app/controllers/test_results_controller.rb b/app/controllers/test_results_controller.rb index 520b0151..981c3712 100644 --- a/app/controllers/test_results_controller.rb +++ b/app/controllers/test_results_controller.rb @@ -28,7 +28,7 @@ def create return end - if succeeded? && !verify_test_results(params[:results]) + if succeeded? && !verify_test_results head :unprocessable_entity return end @@ -42,6 +42,7 @@ def create addon_version_id: build.addon_version.id, build_server: build.build_server, canary: build.canary?, + ember_try_results: results, output: output, output_format: output_format, semver_string: semver_string, @@ -92,15 +93,17 @@ def succeeded? params[:status] == 'succeeded' end - def verify_test_results(results_str) - return false unless results_str - begin - @results = JSON.parse(results_str) + def results + @results ||= begin + JSON.parse(params[:results] || '') rescue JSON::ParserError - return false + return nil end + end - return false if @results['scenarios'].empty? + def verify_test_results + return false if results.nil? + return false if results['scenarios'].empty? true end diff --git a/app/models/test_result.rb b/app/models/test_result.rb index 4ba33e9d..b5af3933 100644 --- a/app/models/test_result.rb +++ b/app/models/test_result.rb @@ -4,17 +4,18 @@ # # Table name: test_results # -# id :integer not null, primary key -# addon_version_id :integer -# succeeded :boolean -# status_message :string -# created_at :datetime not null -# updated_at :datetime not null -# canary :boolean default(FALSE), not null -# build_server_id :integer -# semver_string :string -# output :text -# output_format :string default("text"), not null +# id :integer not null, primary key +# addon_version_id :integer +# succeeded :boolean +# status_message :string +# created_at :datetime not null +# updated_at :datetime not null +# canary :boolean default(FALSE), not null +# build_server_id :integer +# semver_string :string +# output :text +# output_format :string default("text"), not null +# ember_try_results :jsonb # # Indexes # diff --git a/app/resources/api/v2/test_result_resource.rb b/app/resources/api/v2/test_result_resource.rb index ff65eed6..649796ef 100644 --- a/app/resources/api/v2/test_result_resource.rb +++ b/app/resources/api/v2/test_result_resource.rb @@ -2,7 +2,7 @@ class API::V2::TestResultResource < JSONAPI::Resource immutable - attributes :succeeded, :status_message, :created_at, :semver_string, :canary, :output, :output_format + attributes :ember_try_results, :succeeded, :status_message, :created_at, :semver_string, :canary, :output, :output_format has_one :version, class_name: 'Version', relation_name: 'addon_version', foreign_key: 'addon_version_id' has_many :ember_version_compatibilities diff --git a/db/migrate/20190930010621_add_ember_try_results_to_test_results.rb b/db/migrate/20190930010621_add_ember_try_results_to_test_results.rb new file mode 100644 index 00000000..4c30194a --- /dev/null +++ b/db/migrate/20190930010621_add_ember_try_results_to_test_results.rb @@ -0,0 +1,5 @@ +class AddEmberTryResultsToTestResults < ActiveRecord::Migration[5.1] + def change + add_column :test_results, :ember_try_results, :jsonb + end +end diff --git a/db/schema.rb b/db/schema.rb index 7335b2f5..5d0c1a87 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -323,6 +323,7 @@ t.string "semver_string" t.text "output" t.string "output_format", default: "text", null: false + t.jsonb "ember_try_results" t.index ["addon_version_id"], name: "index_test_results_on_addon_version_id" t.index ["build_server_id"], name: "index_test_results_on_build_server_id" end diff --git a/test/controllers/test_results_controller_test.rb b/test/controllers/test_results_controller_test.rb index 96d4ffe0..75020130 100644 --- a/test/controllers/test_results_controller_test.rb +++ b/test/controllers/test_results_controller_test.rb @@ -139,7 +139,7 @@ class TestResultsControllerTest < ControllerTest end test "captures provided output from param when 'format' is 'json'" do - output = JSON.generate(foo: 'bar') + output = { foo: 'bar' }.to_json authed_post :create, pending_build_id: @pending_build.id, format: 'json', status: 'succeeded', results: build_test_result_string(1), output: output test_result = TestResult.find_by(addon_version_id: @pending_build.addon_version_id) @@ -154,14 +154,23 @@ class TestResultsControllerTest < ControllerTest end test "saves value for 'format' param" do - output = JSON.generate(foo: 'bar') + output = { foo: 'bar' }.to_json authed_post :create, pending_build_id: @pending_build.id, format: 'json', status: 'succeeded', results: build_test_result_string(1), output: output test_result = TestResult.find_by(addon_version_id: @pending_build.addon_version_id) assert_equal 'json', test_result.output_format end - test "'retry' action responds with HTTP unauthorized if request..." do + test 'saves provided results' do + output = { foo: 'bar' }.to_json + ember_try_results = build_test_result_string(7) + authed_post :create, pending_build_id: @pending_build.id, format: 'json', status: 'succeeded', results: ember_try_results, output: output + + test_result = TestResult.find_by(addon_version_id: @pending_build.addon_version_id) + assert_equal 7, test_result.ember_try_results['scenarios'].count + end + + test "'retry' action responds with HTTP unauthorized if request is not authenticated" do test_result = create(:test_result) post :retry, params: { id: test_result.id } @@ -205,16 +214,24 @@ def build_server end def build_test_result_string(num_scenarios) - scenario_string = build_scenarios(num_scenarios) - %({"scenarios":[#{scenario_string}]}) - end - - def build_scenarios(n) - scenarios = [] - n.times do |i| - scenarios << %({"scenarioName":"ember-2.#{i}","passed":true,"allowedToFail":false,"dependencies":[{"name":"ember","versionSeen":"2.#{i}.2","versionExpected":"~2.#{i}.0","type":"bower"}]}) - end - scenarios.join(',') + scenarios = Array.new(num_scenarios) { |i| build_scenario(i) } + { scenarios: scenarios }.to_json + end + + def build_scenario(i) + { + scenarioName: "ember-3.#{i}", + passed: true, + allowedToFail: false, + dependencies: [ + { + name: 'ember-source', + versionSeen: "3.#{i}.2", + versionExpected: "~3.#{i}.0", + type: 'yarn' + } + ] + } end def authed_post(action, data = nil) diff --git a/test/factories/test_results.rb b/test/factories/test_results.rb index 8e2a4a6a..a674c851 100644 --- a/test/factories/test_results.rb +++ b/test/factories/test_results.rb @@ -4,17 +4,18 @@ # # Table name: test_results # -# id :integer not null, primary key -# addon_version_id :integer -# succeeded :boolean -# status_message :string -# created_at :datetime not null -# updated_at :datetime not null -# canary :boolean default(FALSE), not null -# build_server_id :integer -# semver_string :string -# output :text -# output_format :string default("text"), not null +# id :integer not null, primary key +# addon_version_id :integer +# succeeded :boolean +# status_message :string +# created_at :datetime not null +# updated_at :datetime not null +# canary :boolean default(FALSE), not null +# build_server_id :integer +# semver_string :string +# output :text +# output_format :string default("text"), not null +# ember_try_results :jsonb # # Indexes # diff --git a/test/integration/api/v2/test_result_test.rb b/test/integration/api/v2/test_result_test.rb index 0a22a252..00aece1e 100644 --- a/test/integration/api/v2/test_result_test.rb +++ b/test/integration/api/v2/test_result_test.rb @@ -4,6 +4,7 @@ class API::V2::ReviewTest < IntegrationTest TEST_RESULT_ATTRIBUTES = %w[ + ember-try-results succeeded status-message created-at diff --git a/test/models/test_result_test.rb b/test/models/test_result_test.rb index 2a1798c6..24532a60 100644 --- a/test/models/test_result_test.rb +++ b/test/models/test_result_test.rb @@ -4,17 +4,18 @@ # # Table name: test_results # -# id :integer not null, primary key -# addon_version_id :integer -# succeeded :boolean -# status_message :string -# created_at :datetime not null -# updated_at :datetime not null -# canary :boolean default(FALSE), not null -# build_server_id :integer -# semver_string :string -# output :text -# output_format :string default("text"), not null +# id :integer not null, primary key +# addon_version_id :integer +# succeeded :boolean +# status_message :string +# created_at :datetime not null +# updated_at :datetime not null +# canary :boolean default(FALSE), not null +# build_server_id :integer +# semver_string :string +# output :text +# output_format :string default("text"), not null +# ember_try_results :jsonb # # Indexes #