summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/admin/services_controller_spec.rb2
-rw-r--r--spec/controllers/dashboard/milestones_controller_spec.rb19
-rw-r--r--spec/controllers/import/bitbucket_server_controller_spec.rb154
-rw-r--r--spec/controllers/projects/merge_requests_controller_spec.rb58
-rw-r--r--spec/factories/ci/builds.rb5
-rw-r--r--spec/factories/ci/job_artifacts.rb32
-rw-r--r--spec/factories/ci/pipelines.rb12
-rw-r--r--spec/factories/merge_requests.rb16
-rw-r--r--spec/features/admin/admin_labels_spec.rb2
-rw-r--r--spec/features/admin/admin_settings_spec.rb2
-rw-r--r--spec/features/explore/groups_list_spec.rb4
-rw-r--r--spec/features/groups/issues_spec.rb3
-rw-r--r--spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb5
-rw-r--r--spec/features/projects/import_export/import_file_object_storage_spec.rb103
-rw-r--r--spec/features/projects/import_export/import_file_spec.rb1
-rw-r--r--spec/features/projects/settings/pipelines_settings_spec.rb60
-rw-r--r--spec/features/search/user_uses_header_search_field_spec.rb4
-rw-r--r--spec/features/uploads/user_uploads_avatar_to_profile_spec.rb2
-rw-r--r--spec/finders/labels_finder_spec.rb2
-rw-r--r--spec/finders/move_to_project_finder_spec.rb2
-rw-r--r--spec/fixtures/api/schemas/entities/merge_request_widget.json3
-rw-r--r--spec/fixtures/api/schemas/entities/test_case.json15
-rw-r--r--spec/fixtures/api/schemas/entities/test_reports_comparer.json26
-rw-r--r--spec/fixtures/api/schemas/entities/test_suite_comparer.json32
-rw-r--r--spec/fixtures/importers/bitbucket_server/activities.json1121
-rw-r--r--spec/fixtures/importers/bitbucket_server/pull_request.json146
-rw-r--r--spec/fixtures/junit/junit.xml32
-rw-r--r--spec/fixtures/junit/junit.xml.gz (renamed from spec/fixtures/junit.xml.gz)bin568 -> 568 bytes
-rw-r--r--spec/fixtures/junit/junit_ant.xml.gzbin0 -> 1659 bytes
-rw-r--r--spec/fixtures/junit/junit_with_corrupted_data.xml.gzbin0 -> 461 bytes
-rw-r--r--spec/fixtures/junit/junit_with_three_testsuites.xml.gzbin0 -> 10106 bytes
-rw-r--r--spec/fixtures/junit/junit_with_three_testsuites_1.xml8
-rw-r--r--spec/fixtures/junit/junit_with_three_testsuites_2.xml6010
-rw-r--r--spec/fixtures/junit/junit_with_three_testsuites_3.xml8
-rw-r--r--spec/helpers/namespaces_helper_spec.rb38
-rw-r--r--spec/javascripts/autosave_spec.js10
-rw-r--r--spec/javascripts/boards/issue_card_spec.js154
-rw-r--r--spec/javascripts/diffs/components/diff_line_note_form_spec.js41
-rw-r--r--spec/javascripts/fixtures/search_autocomplete.html.haml6
-rw-r--r--spec/javascripts/ide/components/new_dropdown/index_spec.js6
-rw-r--r--spec/javascripts/ide/components/new_dropdown/modal_spec.js47
-rw-r--r--spec/javascripts/ide/stores/actions_spec.js57
-rw-r--r--spec/javascripts/ide/stores/modules/commit/actions_spec.js6
-rw-r--r--spec/javascripts/ide/stores/mutations_spec.js100
-rw-r--r--spec/javascripts/ide/stores/utils_spec.js39
-rw-r--r--spec/javascripts/notes/components/discussion_counter_spec.js2
-rw-r--r--spec/javascripts/notes/components/noteable_discussion_spec.js56
-rw-r--r--spec/javascripts/notes/mock_data.js84
-rw-r--r--spec/javascripts/notes/stores/getters_spec.js155
-rw-r--r--spec/javascripts/pipelines/pipeline_url_spec.js26
-rw-r--r--spec/javascripts/reports/components/grouped_test_reports_app_spec.js163
-rw-r--r--spec/javascripts/reports/components/modal_spec.js45
-rw-r--r--spec/javascripts/reports/components/test_issue_body_spec.js71
-rw-r--r--spec/javascripts/reports/mock_data/mock_data.js8
-rw-r--r--spec/javascripts/reports/mock_data/new_and_fixed_failures_report.json1
-rw-r--r--spec/javascripts/reports/mock_data/new_failures_report.json1
-rw-r--r--spec/javascripts/reports/mock_data/no_failures_report.json1
-rw-r--r--spec/javascripts/reports/store/actions_spec.js49
-rw-r--r--spec/javascripts/reports/store/mutations_spec.js31
-rw-r--r--spec/javascripts/reports/store/utils_spec.js138
-rw-r--r--spec/javascripts/vue_shared/components/code_block_spec.js33
-rw-r--r--spec/javascripts/vue_shared/components/gl_modal_spec.js34
-rw-r--r--spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js2
-rw-r--r--spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js30
-rw-r--r--spec/lib/backup/repository_spec.rb40
-rw-r--r--spec/lib/bitbucket_server/client_spec.rb88
-rw-r--r--spec/lib/bitbucket_server/connection_spec.rb68
-rw-r--r--spec/lib/bitbucket_server/page_spec.rb51
-rw-r--r--spec/lib/bitbucket_server/paginator_spec.rb35
-rw-r--r--spec/lib/bitbucket_server/representation/activity_spec.rb38
-rw-r--r--spec/lib/bitbucket_server/representation/comment_spec.rb55
-rw-r--r--spec/lib/bitbucket_server/representation/pull_request_comment_spec.rb48
-rw-r--r--spec/lib/bitbucket_server/representation/pull_request_spec.rb79
-rw-r--r--spec/lib/bitbucket_server/representation/repo_spec.rb80
-rw-r--r--spec/lib/gitlab/auth/blocked_user_tracker_spec.rb79
-rw-r--r--spec/lib/gitlab/bitbucket_server_import/importer_spec.rb291
-rw-r--r--spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb56
-rw-r--r--spec/lib/gitlab/ci/parsers/junit_spec.rb118
-rw-r--r--spec/lib/gitlab/ci/parsers_spec.rb23
-rw-r--r--spec/lib/gitlab/ci/reports/test_case_spec.rb90
-rw-r--r--spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb134
-rw-r--r--spec/lib/gitlab/ci/reports/test_reports_spec.rb132
-rw-r--r--spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb225
-rw-r--r--spec/lib/gitlab/ci/reports/test_suite_spec.rb120
-rw-r--r--spec/lib/gitlab/cleanup/project_uploads_spec.rb278
-rw-r--r--spec/lib/gitlab/gitaly_client/storage_service_spec.rb13
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml1
-rw-r--r--spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb89
-rw-r--r--spec/lib/gitlab/import_export/file_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/import_export/importer_object_storage_spec.rb115
-rw-r--r--spec/lib/gitlab/import_export/importer_spec.rb5
-rw-r--r--spec/lib/gitlab/import_sources_spec.rb27
-rw-r--r--spec/lib/gitlab/kubernetes/helm/install_command_spec.rb6
-rw-r--r--spec/migrations/add_foreign_key_from_notification_settings_to_users_spec.rb36
-rw-r--r--spec/migrations/normalize_ldap_extern_uids_spec.rb6
-rw-r--r--spec/models/ci/build_spec.rb90
-rw-r--r--spec/models/ci/job_artifact_spec.rb28
-rw-r--r--spec/models/ci/pipeline_spec.rb56
-rw-r--r--spec/models/clusters/applications/ingress_spec.rb24
-rw-r--r--spec/models/clusters/applications/jupyter_spec.rb24
-rw-r--r--spec/models/clusters/applications/prometheus_spec.rb22
-rw-r--r--spec/models/clusters/applications/runner_spec.rb24
-rw-r--r--spec/models/concerns/avatarable_spec.rb4
-rw-r--r--spec/models/deploy_token_spec.rb8
-rw-r--r--spec/models/merge_request_diff_spec.rb7
-rw-r--r--spec/models/merge_request_spec.rb240
-rw-r--r--spec/models/postgresql/replication_slot_spec.rb31
-rw-r--r--spec/models/project_services/jira_service_spec.rb53
-rw-r--r--spec/models/project_spec.rb65
-rw-r--r--spec/presenters/merge_request_presenter_spec.rb2
-rw-r--r--spec/requests/api/internal_spec.rb2
-rw-r--r--spec/requests/api/merge_requests_spec.rb1
-rw-r--r--spec/requests/api/project_import_spec.rb2
-rw-r--r--spec/requests/api/projects_spec.rb4
-rw-r--r--spec/requests/api/runner_spec.rb4
-rw-r--r--spec/serializers/test_case_entity_spec.rb31
-rw-r--r--spec/serializers/test_reports_comparer_entity_spec.rb76
-rw-r--r--spec/serializers/test_reports_comparer_serializer_spec.rb62
-rw-r--r--spec/serializers/test_suite_comparer_entity_spec.rb86
-rw-r--r--spec/services/ci/compare_test_reports_service_spec.rb45
-rw-r--r--spec/services/issues/reopen_service_spec.rb2
-rw-r--r--spec/services/merge_requests/merge_service_spec.rb1
-rw-r--r--spec/services/merge_requests/post_merge_service_spec.rb2
-rw-r--r--spec/services/merge_requests/reopen_service_spec.rb6
-rw-r--r--spec/services/projects/create_service_spec.rb11
-rw-r--r--spec/services/projects/gitlab_projects_import_service_spec.rb2
-rw-r--r--spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb17
-rw-r--r--spec/services/projects/hashed_storage/migrate_repository_service_spec.rb3
-rw-r--r--spec/services/projects/hashed_storage_migration_service_spec.rb18
-rw-r--r--spec/services/projects/update_service_spec.rb15
-rw-r--r--spec/services/users/activity_service_spec.rb12
-rw-r--r--spec/support/helpers/reactive_caching_helpers.rb4
-rw-r--r--spec/support/helpers/test_env.rb3
-rw-r--r--spec/support/shared_examples/helm_generated_script.rb2
-rw-r--r--spec/support/shared_examples/notify_shared_examples.rb4
-rw-r--r--spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb (renamed from spec/support/shared_examples/gitlab_projects_import_service_shared_examples.rb)0
-rw-r--r--spec/support/test_reports/test_reports_helper.rb93
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb21
-rw-r--r--spec/tasks/gitlab/cleanup_rake_spec.rb321
-rw-r--r--spec/workers/background_migration_worker_spec.rb52
-rw-r--r--spec/workers/create_gpg_signature_worker_spec.rb13
-rw-r--r--spec/workers/project_migrate_hashed_storage_worker_spec.rb2
142 files changed, 12683 insertions, 665 deletions
diff --git a/spec/controllers/admin/services_controller_spec.rb b/spec/controllers/admin/services_controller_spec.rb
index 701211c2586..4439ea4a533 100644
--- a/spec/controllers/admin/services_controller_spec.rb
+++ b/spec/controllers/admin/services_controller_spec.rb
@@ -13,7 +13,7 @@ describe Admin::ServicesController do
Service.available_services_names.each do |service_name|
context "#{service_name}" do
let!(:service) do
- service_template = service_name.concat("_service").camelize.constantize
+ service_template = "#{service_name}_service".camelize.constantize
service_template.where(template: true).first_or_create
end
diff --git a/spec/controllers/dashboard/milestones_controller_spec.rb b/spec/controllers/dashboard/milestones_controller_spec.rb
index ba2669a5ea7..505c040b5d5 100644
--- a/spec/controllers/dashboard/milestones_controller_spec.rb
+++ b/spec/controllers/dashboard/milestones_controller_spec.rb
@@ -2,8 +2,10 @@ require 'spec_helper'
describe Dashboard::MilestonesController do
let(:project) { create(:project) }
- let(:user) { create(:user) }
+ let(:group) { create(:group) }
+ let(:user) { create(:user) }
let(:project_milestone) { create(:milestone, project: project) }
+ let(:group_milestone) { create(:milestone, group: group) }
let(:milestone) do
DashboardMilestone.build(
[project],
@@ -11,13 +13,17 @@ describe Dashboard::MilestonesController do
)
end
let(:issue) { create(:issue, project: project, milestone: project_milestone) }
+ let(:group_issue) { create(:issue, milestone: group_milestone) }
+
let!(:label) { create(:label, project: project, title: 'Issue Label', issues: [issue]) }
+ let!(:group_label) { create(:group_label, group: group, title: 'Group Issue Label', issues: [group_issue]) }
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project, milestone: project_milestone) }
let(:milestone_path) { dashboard_milestone_path(milestone.safe_title, title: milestone.title) }
before do
sign_in(user)
project.add_maintainer(user)
+ group.add_developer(user)
end
it_behaves_like 'milestone tabs'
@@ -35,4 +41,15 @@ describe Dashboard::MilestonesController do
expect(response).to have_gitlab_http_status(200)
end
end
+
+ describe "#index" do
+ it 'should contain group and project milestones' do
+ get :index, format: :json
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response.size).to eq(2)
+ expect(json_response.map { |i| i["first_milestone"]["id"] }).to include(group_milestone.id, project_milestone.id)
+ expect(json_response.map { |i| i["group_name"] }).to include(group.name)
+ end
+ end
end
diff --git a/spec/controllers/import/bitbucket_server_controller_spec.rb b/spec/controllers/import/bitbucket_server_controller_spec.rb
new file mode 100644
index 00000000000..5024ef71771
--- /dev/null
+++ b/spec/controllers/import/bitbucket_server_controller_spec.rb
@@ -0,0 +1,154 @@
+require 'spec_helper'
+
+describe Import::BitbucketServerController do
+ let(:user) { create(:user) }
+ let(:project_key) { 'test-project' }
+ let(:repo_slug) { 'some-repo' }
+ let(:client) { instance_double(BitbucketServer::Client) }
+
+ def assign_session_tokens
+ session[:bitbucket_server_url] = 'http://localhost:7990'
+ session[:bitbucket_server_username] = 'bitbucket'
+ session[:bitbucket_server_personal_access_token] = 'some-token'
+ end
+
+ before do
+ sign_in(user)
+ allow(controller).to receive(:bitbucket_server_import_enabled?).and_return(true)
+ end
+
+ describe 'GET new' do
+ render_views
+
+ it 'shows the input form' do
+ get :new
+
+ expect(response.body).to have_text('Bitbucket Server URL')
+ end
+ end
+
+ describe 'POST create' do
+ before do
+ allow(controller).to receive(:bitbucket_client).and_return(client)
+ repo = double(name: 'my-project')
+ allow(client).to receive(:repo).with(project_key, repo_slug).and_return(repo)
+ assign_session_tokens
+ end
+
+ set(:project) { create(:project) }
+
+ it 'returns the new project' do
+ allow(Gitlab::BitbucketServerImport::ProjectCreator)
+ .to receive(:new).with(project_key, repo_slug, anything, 'my-project', user.namespace, user, anything)
+ .and_return(double(execute: project))
+
+ post :create, project: project_key, repository: repo_slug, format: :json
+
+ expect(response).to have_gitlab_http_status(200)
+ end
+
+ it 'returns an error when an invalid project key is used' do
+ post :create, project: 'some&project'
+
+ expect(response).to have_gitlab_http_status(422)
+ end
+
+ it 'returns an error when an invalid repository slug is used' do
+ post :create, project: 'some-project', repository: 'try*this'
+
+ expect(response).to have_gitlab_http_status(422)
+ end
+
+ it 'returns an error when the project cannot be found' do
+ allow(client).to receive(:repo).with(project_key, repo_slug).and_return(nil)
+
+ post :create, project: project_key, repository: repo_slug, format: :json
+
+ expect(response).to have_gitlab_http_status(422)
+ end
+
+ it 'returns an error when the project cannot be saved' do
+ allow(Gitlab::BitbucketServerImport::ProjectCreator)
+ .to receive(:new).with(project_key, repo_slug, anything, 'my-project', user.namespace, user, anything)
+ .and_return(double(execute: build(:project)))
+
+ post :create, project: project_key, repository: repo_slug, format: :json
+
+ expect(response).to have_gitlab_http_status(422)
+ end
+
+ it "returns an error when the server can't be contacted" do
+ expect(client).to receive(:repo).with(project_key, repo_slug).and_raise(BitbucketServer::Client::ServerError)
+
+ post :create, project: project_key, repository: repo_slug, format: :json
+
+ expect(response).to have_gitlab_http_status(422)
+ end
+ end
+
+ describe 'POST configure' do
+ let(:token) { 'token' }
+ let(:username) { 'bitbucket-user' }
+ let(:url) { 'http://localhost:7990/bitbucket' }
+
+ it 'clears out existing session' do
+ post :configure
+
+ expect(session[:bitbucket_server_url]).to be_nil
+ expect(session[:bitbucket_server_username]).to be_nil
+ expect(session[:bitbucket_server_personal_access_token]).to be_nil
+
+ expect(response).to have_gitlab_http_status(302)
+ expect(response).to redirect_to(status_import_bitbucket_server_path)
+ end
+
+ it 'sets the session variables' do
+ post :configure, personal_access_token: token, bitbucket_username: username, bitbucket_server_url: url
+
+ expect(session[:bitbucket_server_url]).to eq(url)
+ expect(session[:bitbucket_server_username]).to eq(username)
+ expect(session[:bitbucket_server_personal_access_token]).to eq(token)
+ expect(response).to have_gitlab_http_status(302)
+ expect(response).to redirect_to(status_import_bitbucket_server_path)
+ end
+ end
+
+ describe 'GET status' do
+ render_views
+
+ before do
+ allow(controller).to receive(:bitbucket_client).and_return(client)
+
+ @repo = double(slug: 'vim', project_key: 'asd', full_name: 'asd/vim', "valid?" => true, project_name: 'asd', browse_url: 'http://test', name: 'vim')
+ @invalid_repo = double(slug: 'invalid', project_key: 'foobar', full_name: 'asd/foobar', "valid?" => false, browse_url: 'http://bad-repo')
+ assign_session_tokens
+ end
+
+ it 'assigns repository categories' do
+ created_project = create(:project, import_type: 'bitbucket_server', creator_id: user.id, import_source: 'foo/bar', import_status: 'finished')
+ expect(client).to receive(:repos).and_return([@repo, @invalid_repo])
+
+ get :status
+
+ expect(assigns(:already_added_projects)).to eq([created_project])
+ expect(assigns(:repos)).to eq([@repo])
+ expect(assigns(:incompatible_repos)).to eq([@invalid_repo])
+ end
+ end
+
+ describe 'GET jobs' do
+ before do
+ assign_session_tokens
+ end
+
+ it 'returns a list of imported projects' do
+ created_project = create(:project, import_type: 'bitbucket_server', creator_id: user.id)
+
+ get :jobs
+
+ expect(json_response.count).to eq(1)
+ expect(json_response.first['id']).to eq(created_project.id)
+ expect(json_response.first['import_status']).to eq('none')
+ end
+ end
+end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 1692f299552..375018e2229 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -580,6 +580,64 @@ describe Projects::MergeRequestsController do
end
end
+ describe 'GET test_reports' do
+ subject do
+ get :test_reports,
+ namespace_id: project.namespace.to_param,
+ project_id: project,
+ id: merge_request.iid,
+ format: :json
+ end
+
+ before do
+ allow_any_instance_of(MergeRequest)
+ .to receive(:compare_test_reports).and_return(comparison_status)
+ end
+
+ context 'when comparison is being processed' do
+ let(:comparison_status) { { status: :parsing } }
+
+ it 'returns 204 HTTP status' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+ end
+
+ context 'when comparison is done' do
+ let(:comparison_status) { { status: :parsed, data: { summary: 1 } } }
+
+ it 'returns 200 HTTP status' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to eq({ 'summary' => 1 })
+ end
+ end
+
+ context 'when user created corrupted test reports' do
+ let(:comparison_status) { { status: :error, status_reason: 'Failed to parse test reports' } }
+
+ it 'returns 400 HTTP status' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response).to eq({ 'status_reason' => 'Failed to parse test reports' })
+ end
+ end
+
+ context 'when something went wrong on our system' do
+ let(:comparison_status) { {} }
+
+ it 'returns 500 HTTP status' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:internal_server_error)
+ expect(json_response).to eq({ 'status_reason' => 'Unknown error' })
+ end
+ end
+ end
+
describe 'POST remove_wip' do
before do
merge_request.title = merge_request.wip_title
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index 8bd1f1ae4e0..9813190925b 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -188,9 +188,8 @@ FactoryBot.define do
end
trait :test_reports do
- after(:create) do |build|
- create(:ci_job_artifact, :junit, job: build)
- build.reload
+ after(:build) do |build|
+ build.job_artifacts << create(:ci_job_artifact, :junit, job: build)
end
end
diff --git a/spec/factories/ci/job_artifacts.rb b/spec/factories/ci/job_artifacts.rb
index a6a87782fe7..46aaaf6aa5d 100644
--- a/spec/factories/ci/job_artifacts.rb
+++ b/spec/factories/ci/job_artifacts.rb
@@ -50,7 +50,37 @@ FactoryBot.define do
after(:build) do |artifact, evaluator|
artifact.file = fixture_file_upload(
- Rails.root.join('spec/fixtures/junit.xml.gz'), 'application/x-gzip')
+ Rails.root.join('spec/fixtures/junit/junit.xml.gz'), 'application/x-gzip')
+ end
+ end
+
+ trait :junit_with_ant do
+ file_type :junit
+ file_format :gzip
+
+ after(:build) do |artifact, evaluator|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/junit/junit_ant.xml.gz'), 'application/x-gzip')
+ end
+ end
+
+ trait :junit_with_three_testsuites do
+ file_type :junit
+ file_format :gzip
+
+ after(:build) do |artifact, evaluator|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/junit/junit_with_three_testsuites.xml.gz'), 'application/x-gzip')
+ end
+ end
+
+ trait :junit_with_corrupted_data do
+ file_type :junit
+ file_format :gzip
+
+ after(:build) do |artifact, evaluator|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/junit/junit_with_corrupted_data.xml.gz'), 'application/x-gzip')
end
end
diff --git a/spec/factories/ci/pipelines.rb b/spec/factories/ci/pipelines.rb
index 51a767e5b93..a6ff226fa75 100644
--- a/spec/factories/ci/pipelines.rb
+++ b/spec/factories/ci/pipelines.rb
@@ -58,6 +58,10 @@ FactoryBot.define do
status :success
end
+ trait :running do
+ status :running
+ end
+
trait :failed do
status :failed
end
@@ -65,6 +69,14 @@ FactoryBot.define do
trait :protected do
protected true
end
+
+ trait :with_test_reports do
+ status :success
+
+ after(:build) do |pipeline, evaluator|
+ pipeline.builds << build(:ci_build, :test_reports, pipeline: pipeline, project: pipeline.project)
+ end
+ end
end
end
end
diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb
index f722bb9cb0d..b8b089b069b 100644
--- a/spec/factories/merge_requests.rb
+++ b/spec/factories/merge_requests.rb
@@ -89,6 +89,18 @@ FactoryBot.define do
end
end
+ trait :with_test_reports do
+ after(:build) do |merge_request|
+ merge_request.head_pipeline = build(
+ :ci_pipeline,
+ :success,
+ :with_test_reports,
+ project: merge_request.source_project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha)
+ end
+ end
+
after(:build) do |merge_request|
target_project = merge_request.target_project
source_project = merge_request.source_project
@@ -100,6 +112,10 @@ FactoryBot.define do
end
end
+ after(:create) do |merge_request, evaluator|
+ merge_request.cache_merge_request_closes_issues!
+ end
+
factory :merged_merge_request, traits: [:merged]
factory :closed_merge_request, traits: [:closed]
factory :reopened_merge_request, traits: [:opened]
diff --git a/spec/features/admin/admin_labels_spec.rb b/spec/features/admin/admin_labels_spec.rb
index de406d7d966..238ea2a25bd 100644
--- a/spec/features/admin/admin_labels_spec.rb
+++ b/spec/features/admin/admin_labels_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe 'admin issues labels' do
it 'deletes all labels', :js do
page.within '.labels' do
- page.all('.btn-remove').each do |remove|
+ page.all('.remove-row').each do |remove|
accept_confirm { remove.click }
wait_for_requests
end
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index a852ca689e7..af1c153dec8 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -175,7 +175,7 @@ describe 'Admin updates settings' do
it 'Change CI/CD settings' do
page.within('.as-ci-cd') do
- check 'Enabled Auto DevOps for projects by default'
+ check 'Default to Auto DevOps pipeline for all projects'
fill_in 'Auto devops domain', with: 'domain.com'
click_button 'Save changes'
end
diff --git a/spec/features/explore/groups_list_spec.rb b/spec/features/explore/groups_list_spec.rb
index ad02b454aee..8ed4051856e 100644
--- a/spec/features/explore/groups_list_spec.rb
+++ b/spec/features/explore/groups_list_spec.rb
@@ -53,14 +53,14 @@ describe 'Explore Groups page', :js do
expect(find('.js-groups-list-holder .content-list li:first-child .stats .number-projects')).to have_text("1")
# Archive project
- empty_project.archive!
+ ::Projects::UpdateService.new(empty_project, user, archived: true).execute
visit explore_groups_path
# Check project count
expect(find('.js-groups-list-holder .content-list li:first-child .stats .number-projects')).to have_text("0")
# Unarchive project
- empty_project.unarchive!
+ ::Projects::UpdateService.new(empty_project, user, archived: false).execute
visit explore_groups_path
# Check project count
diff --git a/spec/features/groups/issues_spec.rb b/spec/features/groups/issues_spec.rb
index 97d8776b15a..176f4a668ff 100644
--- a/spec/features/groups/issues_spec.rb
+++ b/spec/features/groups/issues_spec.rb
@@ -52,6 +52,7 @@ describe 'Group issues page' do
context 'issues list', :nested_groups do
let(:subgroup) { create(:group, parent: group) }
let(:subgroup_project) { create(:project, :public, group: subgroup)}
+ let(:user_in_group) { create(:group_member, :maintainer, user: create(:user), group: group ).user }
let!(:issue) { create(:issue, project: project, title: 'root group issue') }
let!(:subgroup_issue) { create(:issue, project: subgroup_project, title: 'subgroup issue') }
@@ -67,7 +68,7 @@ describe 'Group issues page' do
context 'when project is archived' do
before do
- project.archive!
+ ::Projects::UpdateService.new(project, user_in_group, archived: true).execute
end
it 'does not render issue' do
diff --git a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
index bf4d5396df9..2d268ecab58 100644
--- a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
+++ b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
@@ -342,8 +342,9 @@ describe 'Merge request > User resolves diff notes and discussions', :js do
end
end
- it 'shows jump to next discussion button' do
- expect(page.all('.discussion-reply-holder', count: 2)).to all(have_selector('.discussion-next-btn'))
+ it 'shows jump to next discussion button, apart from the last one' do
+ expect(page).to have_selector('.discussion-reply-holder', count: 2)
+ expect(page).to have_selector('.discussion-reply-holder .discussion-next-btn', count: 1)
end
it 'displays next discussion even if hidden' do
diff --git a/spec/features/projects/import_export/import_file_object_storage_spec.rb b/spec/features/projects/import_export/import_file_object_storage_spec.rb
new file mode 100644
index 00000000000..0d364543916
--- /dev/null
+++ b/spec/features/projects/import_export/import_file_object_storage_spec.rb
@@ -0,0 +1,103 @@
+require 'spec_helper'
+
+describe 'Import/Export - project import integration test', :js do
+ include Select2Helper
+
+ let(:user) { create(:user) }
+ let(:file) { File.join(Rails.root, 'spec', 'features', 'projects', 'import_export', 'test_project_export.tar.gz') }
+ let(:export_path) { "#{Dir.tmpdir}/import_file_spec" }
+
+ before do
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+ allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
+ gitlab_sign_in(user)
+ end
+
+ after do
+ FileUtils.rm_rf(export_path, secure: true)
+ end
+
+ context 'when selecting the namespace' do
+ let(:user) { create(:admin) }
+ let!(:namespace) { user.namespace }
+ let(:project_path) { 'test-project-path' + SecureRandom.hex }
+
+ context 'prefilled the path' do
+ it 'user imports an exported project successfully' do
+ visit new_project_path
+
+ select2(namespace.id, from: '#project_namespace_id')
+ fill_in :project_path, with: project_path, visible: true
+ click_import_project_tab
+ click_link 'GitLab export'
+
+ expect(page).to have_content('Import an exported GitLab project')
+ expect(URI.parse(current_url).query).to eq("namespace_id=#{namespace.id}&path=#{project_path}")
+
+ attach_file('file', file)
+ click_on 'Import project'
+
+ expect(Project.count).to eq(1)
+
+ project = Project.last
+ expect(project).not_to be_nil
+ expect(project.description).to eq("Foo Bar")
+ expect(project.issues).not_to be_empty
+ expect(project.merge_requests).not_to be_empty
+ expect(project_hook_exists?(project)).to be true
+ expect(wiki_exists?(project)).to be true
+ expect(project.import_state.status).to eq('finished')
+ end
+ end
+
+ context 'path is not prefilled' do
+ it 'user imports an exported project successfully' do
+ visit new_project_path
+ click_import_project_tab
+ click_link 'GitLab export'
+
+ fill_in :path, with: 'test-project-path', visible: true
+ attach_file('file', file)
+
+ expect { click_on 'Import project' }.to change { Project.count }.by(1)
+
+ project = Project.last
+ expect(project).not_to be_nil
+ expect(page).to have_content("Project 'test-project-path' is being imported")
+ end
+ end
+ end
+
+ it 'invalid project' do
+ project = create(:project, namespace: user.namespace)
+
+ visit new_project_path
+
+ select2(user.namespace.id, from: '#project_namespace_id')
+ fill_in :project_path, with: project.name, visible: true
+ click_import_project_tab
+ click_link 'GitLab export'
+ attach_file('file', file)
+ click_on 'Import project'
+
+ page.within('.flash-container') do
+ expect(page).to have_content('Project could not be imported')
+ end
+ end
+
+ def wiki_exists?(project)
+ wiki = ProjectWiki.new(project)
+ wiki.repository.exists? && !wiki.repository.empty?
+ end
+
+ def project_hook_exists?(project)
+ Gitlab::GitalyClient::StorageSettings.allow_disk_access do
+ Gitlab::Git::Hook.new('post-receive', project.repository.raw_repository).exists?
+ end
+ end
+
+ def click_import_project_tab
+ find('#import-project-tab').click
+ end
+end
diff --git a/spec/features/projects/import_export/import_file_spec.rb b/spec/features/projects/import_export/import_file_spec.rb
index 9cbfb62d872..2d86115de12 100644
--- a/spec/features/projects/import_export/import_file_spec.rb
+++ b/spec/features/projects/import_export/import_file_spec.rb
@@ -8,6 +8,7 @@ describe 'Import/Export - project import integration test', :js do
let(:export_path) { "#{Dir.tmpdir}/import_file_spec" }
before do
+ stub_feature_flags(import_export_object_storage: false)
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
gitlab_sign_in(user)
end
diff --git a/spec/features/projects/settings/pipelines_settings_spec.rb b/spec/features/projects/settings/pipelines_settings_spec.rb
index 742ecf82c38..30b0a5578ea 100644
--- a/spec/features/projects/settings/pipelines_settings_spec.rb
+++ b/spec/features/projects/settings/pipelines_settings_spec.rb
@@ -8,7 +8,6 @@ describe "Projects > Settings > Pipelines settings" do
before do
sign_in(user)
project.add_role(user, role)
- create(:project_auto_devops, project: project)
end
context 'for developer' do
@@ -61,19 +60,58 @@ describe "Projects > Settings > Pipelines settings" do
end
describe 'Auto DevOps' do
- it 'update auto devops settings' do
- visit project_settings_ci_cd_path(project)
+ context 'when auto devops is turned on instance-wide' do
+ before do
+ stub_application_setting(auto_devops_enabled: true)
+ end
+
+ it 'auto devops is on by default and can be manually turned off' do
+ visit project_settings_ci_cd_path(project)
- page.within '#autodevops-settings' do
- fill_in('project_auto_devops_attributes_domain', with: 'test.com')
- page.choose('project_auto_devops_attributes_enabled_false')
- click_on 'Save changes'
+ page.within '#autodevops-settings' do
+ expect(find_field('project_auto_devops_attributes_enabled')).to be_checked
+ expect(page).to have_content('instance enabled')
+ uncheck 'Default to Auto DevOps pipeline'
+ click_on 'Save changes'
+ end
+
+ expect(page.status_code).to eq(200)
+ expect(project.auto_devops).to be_present
+ expect(project.auto_devops).not_to be_enabled
+
+ page.within '#autodevops-settings' do
+ expect(find_field('project_auto_devops_attributes_enabled')).not_to be_checked
+ expect(page).not_to have_content('instance enabled')
+ end
end
+ end
- expect(page.status_code).to eq(200)
- expect(project.auto_devops).to be_present
- expect(project.auto_devops).not_to be_enabled
- expect(project.auto_devops.domain).to eq('test.com')
+ context 'when auto devops is not turned on instance-wide' do
+ before do
+ stub_application_setting(auto_devops_enabled: false)
+ end
+
+ it 'auto devops is off by default and can be manually turned on' do
+ visit project_settings_ci_cd_path(project)
+
+ page.within '#autodevops-settings' do
+ expect(page).not_to have_content('instance enabled')
+ expect(find_field('project_auto_devops_attributes_enabled')).not_to be_checked
+ check 'Default to Auto DevOps pipeline'
+ fill_in('project_auto_devops_attributes_domain', with: 'test.com')
+ click_on 'Save changes'
+ end
+
+ expect(page.status_code).to eq(200)
+ expect(project.auto_devops).to be_present
+ expect(project.auto_devops).to be_enabled
+ expect(project.auto_devops.domain).to eq('test.com')
+
+ page.within '#autodevops-settings' do
+ expect(find_field('project_auto_devops_attributes_enabled')).to be_checked
+ expect(page).not_to have_content('instance enabled')
+ end
+ end
end
context 'when there is a cluster with ingress and external_ip' do
diff --git a/spec/features/search/user_uses_header_search_field_spec.rb b/spec/features/search/user_uses_header_search_field_spec.rb
index a9128104b87..af38f77c0c6 100644
--- a/spec/features/search/user_uses_header_search_field_spec.rb
+++ b/spec/features/search/user_uses_header_search_field_spec.rb
@@ -62,10 +62,6 @@ describe 'User uses header search field' do
end
end
- it 'contains location badge' do
- expect(page).to have_selector('.has-location-badge')
- end
-
context 'when clicking the search field', :js do
before do
page.find('#search').click
diff --git a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
index 4db73fccfb6..48f8b8bf77e 100644
--- a/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
+++ b/spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
@@ -15,7 +15,7 @@ describe 'User uploads avatar to profile' do
visit user_path(user)
- expect(page).to have_selector(%Q(img[data-src$="/uploads/-/system/user/avatar/#{user.id}/dk.png"]))
+ expect(page).to have_selector(%Q(img[data-src$="/uploads/-/system/user/avatar/#{user.id}/dk.png?width=90"]))
# Cheating here to verify something that isn't user-facing, but is important
expect(user.reload.avatar.file).to exist
diff --git a/spec/finders/labels_finder_spec.rb b/spec/finders/labels_finder_spec.rb
index eb2a4576e30..f5cec8e349a 100644
--- a/spec/finders/labels_finder_spec.rb
+++ b/spec/finders/labels_finder_spec.rb
@@ -55,7 +55,7 @@ describe LabelsFinder do
context 'filtering by group_id' do
it 'returns labels available for any non-archived project within the group' do
group_1.add_developer(user)
- project_1.archive!
+ ::Projects::UpdateService.new(project_1, user, archived: true).execute
finder = described_class.new(user, group_id: group_1.id)
expect(finder.execute).to eq [group_label_2, group_label_1, project_label_5]
diff --git a/spec/finders/move_to_project_finder_spec.rb b/spec/finders/move_to_project_finder_spec.rb
index 1511cb0e04c..1b3f44cced1 100644
--- a/spec/finders/move_to_project_finder_spec.rb
+++ b/spec/finders/move_to_project_finder_spec.rb
@@ -36,7 +36,7 @@ describe MoveToProjectFinder do
it 'does not return archived projects' do
reporter_project.add_reporter(user)
- reporter_project.archive!
+ ::Projects::UpdateService.new(reporter_project, user, archived: true).execute
other_reporter_project = create(:project)
other_reporter_project.add_reporter(user)
diff --git a/spec/fixtures/api/schemas/entities/merge_request_widget.json b/spec/fixtures/api/schemas/entities/merge_request_widget.json
index a2ac4d238c7..c40977bc4ee 100644
--- a/spec/fixtures/api/schemas/entities/merge_request_widget.json
+++ b/spec/fixtures/api/schemas/entities/merge_request_widget.json
@@ -117,7 +117,8 @@
"rebase_in_progress": { "type": "boolean" },
"can_push_to_source_branch": { "type": "boolean" },
"rebase_path": { "type": ["string", "null"] },
- "squash": { "type": "boolean" }
+ "squash": { "type": "boolean" },
+ "test_reports_path": { "type": ["string", "null"] }
},
"additionalProperties": false
}
diff --git a/spec/fixtures/api/schemas/entities/test_case.json b/spec/fixtures/api/schemas/entities/test_case.json
new file mode 100644
index 00000000000..c9ba1f3ad18
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/test_case.json
@@ -0,0 +1,15 @@
+{
+ "type": "object",
+ "required" : [
+ "status",
+ "name"
+ ],
+ "properties": {
+ "status": { "type": "string" },
+ "name": { "type": "string" },
+ "execution_time": { "type": "float" },
+ "system_output": { "type": ["string", "null"] },
+ "stack_trace": { "type": ["string", "null"] }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/test_reports_comparer.json b/spec/fixtures/api/schemas/entities/test_reports_comparer.json
new file mode 100644
index 00000000000..d7880801c01
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/test_reports_comparer.json
@@ -0,0 +1,26 @@
+{
+ "type": "object",
+ "required" : [
+ "status",
+ "summary",
+ "suites"
+ ],
+ "properties": {
+ "status": { "type": "string" },
+ "summary": {
+ "type": "object",
+ "properties": {
+ "total": { "type": "integer" },
+ "resolved": { "type": "integer" },
+ "failed": { "type": "integer" }
+ },
+ "required": [
+ "total",
+ "resolved",
+ "failed"
+ ]
+ },
+ "suites": { "type": "array", "items": { "$ref": "test_suite_comparer.json" } }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/test_suite_comparer.json b/spec/fixtures/api/schemas/entities/test_suite_comparer.json
new file mode 100644
index 00000000000..d63fea1f0db
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/test_suite_comparer.json
@@ -0,0 +1,32 @@
+{
+ "type": "object",
+ "required": [
+ "name",
+ "status",
+ "summary",
+ "new_failures",
+ "resolved_failures",
+ "existing_failures"
+ ],
+ "properties": {
+ "name": { "type": "string" },
+ "status": { "type": "string" },
+ "summary": {
+ "type": "object",
+ "properties": {
+ "total": { "type": "integer" },
+ "resolved": { "type": "integer" },
+ "failed": { "type": "integer" }
+ },
+ "required": [
+ "total",
+ "resolved",
+ "failed"
+ ]
+ },
+ "new_failures": { "type": "array", "items": { "$ref": "test_case.json" } },
+ "resolved_failures": { "type": "array", "items": { "$ref": "test_case.json" } },
+ "existing_failures": { "type": "array", "items": { "$ref": "test_case.json" } }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/importers/bitbucket_server/activities.json b/spec/fixtures/importers/bitbucket_server/activities.json
new file mode 100644
index 00000000000..09adfca9f31
--- /dev/null
+++ b/spec/fixtures/importers/bitbucket_server/activities.json
@@ -0,0 +1,1121 @@
+{
+ "isLastPage": true,
+ "limit": 25,
+ "size": 8,
+ "start": 0,
+ "values": [
+ {
+ "action": "COMMENTED",
+ "comment": {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [
+ {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [
+ {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [],
+ "createdDate": 1530164016725,
+ "id": 11,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [
+ {
+ "anchor": {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "createdDate": 1530164016725,
+ "id": 11,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "text": "Ok",
+ "type": "COMMENT",
+ "updatedDate": 1530164016725,
+ "version": 0
+ },
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "createdDate": 1530164026000,
+ "id": 1,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true,
+ "transitionable": true
+ },
+ "state": "OPEN",
+ "text": "here's a task"
+ }
+ ],
+ "text": "Ok",
+ "updatedDate": 1530164016725,
+ "version": 0
+ },
+ {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [],
+ "createdDate": 1530165543990,
+ "id": 12,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "hi",
+ "updatedDate": 1530165543990,
+ "version": 0
+ }
+ ],
+ "createdDate": 1530164013718,
+ "id": 10,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "Hello world",
+ "updatedDate": 1530164013718,
+ "version": 0
+ },
+ {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [],
+ "createdDate": 1530165549932,
+ "id": 13,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "hello",
+ "updatedDate": 1530165549932,
+ "version": 0
+ }
+ ],
+ "createdDate": 1530161499144,
+ "id": 9,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "is this a new line?",
+ "updatedDate": 1530161499144,
+ "version": 0
+ },
+ "commentAction": "ADDED",
+ "commentAnchor": {
+ "diffType": "EFFECTIVE",
+ "fileType": "TO",
+ "fromHash": "c5f4288162e2e6218180779c7f6ac1735bb56eab",
+ "line": 1,
+ "lineType": "ADDED",
+ "orphaned": false,
+ "path": "CHANGELOG.md",
+ "toHash": "a4c2164330f2549f67c13f36a93884cf66e976be"
+ },
+ "createdDate": 1530161499144,
+ "diff": {
+ "destination": {
+ "components": [
+ "CHANGELOG.md"
+ ],
+ "extension": "md",
+ "name": "CHANGELOG.md",
+ "parent": "",
+ "toString": "CHANGELOG.md"
+ },
+ "hunks": [
+ {
+ "destinationLine": 1,
+ "destinationSpan": 11,
+ "segments": [
+ {
+ "lines": [
+ {
+ "commentIds": [
+ 9
+ ],
+ "destination": 1,
+ "line": "# Edit 1",
+ "source": 1,
+ "truncated": false
+ },
+ {
+ "destination": 2,
+ "line": "",
+ "source": 1,
+ "truncated": false
+ }
+ ],
+ "truncated": false,
+ "type": "ADDED"
+ },
+ {
+ "lines": [
+ {
+ "destination": 3,
+ "line": "# ChangeLog",
+ "source": 1,
+ "truncated": false
+ },
+ {
+ "destination": 4,
+ "line": "",
+ "source": 2,
+ "truncated": false
+ },
+ {
+ "destination": 5,
+ "line": "This log summarizes the changes in each released version of rouge. The versioning scheme",
+ "source": 3,
+ "truncated": false
+ },
+ {
+ "destination": 6,
+ "line": "we use is semver, although we will often release new lexers in minor versions, as a",
+ "source": 4,
+ "truncated": false
+ },
+ {
+ "destination": 7,
+ "line": "practical matter.",
+ "source": 5,
+ "truncated": false
+ },
+ {
+ "destination": 8,
+ "line": "",
+ "source": 6,
+ "truncated": false
+ },
+ {
+ "destination": 9,
+ "line": "## version TBD: (unreleased)",
+ "source": 7,
+ "truncated": false
+ },
+ {
+ "destination": 10,
+ "line": "",
+ "source": 8,
+ "truncated": false
+ },
+ {
+ "destination": 11,
+ "line": "* General",
+ "source": 9,
+ "truncated": false
+ }
+ ],
+ "truncated": false,
+ "type": "CONTEXT"
+ }
+ ],
+ "sourceLine": 1,
+ "sourceSpan": 9,
+ "truncated": false
+ }
+ ],
+ "properties": {
+ "current": true,
+ "fromHash": "c5f4288162e2e6218180779c7f6ac1735bb56eab",
+ "toHash": "a4c2164330f2549f67c13f36a93884cf66e976be"
+ },
+ "source": null,
+ "truncated": false
+ },
+ "id": 19,
+ "user": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ }
+ },
+ {
+ "action": "COMMENTED",
+ "comment": {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [],
+ "createdDate": 1530053198463,
+ "id": 7,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "What about this line?",
+ "updatedDate": 1530053198463,
+ "version": 0
+ },
+ "commentAction": "ADDED",
+ "commentAnchor": {
+ "diffType": "EFFECTIVE",
+ "fileType": "FROM",
+ "fromHash": "c5f4288162e2e6218180779c7f6ac1735bb56eab",
+ "line": 9,
+ "lineType": "CONTEXT",
+ "orphaned": false,
+ "path": "CHANGELOG.md",
+ "toHash": "a4c2164330f2549f67c13f36a93884cf66e976be"
+ },
+ "createdDate": 1530053198463,
+ "diff": {
+ "destination": {
+ "components": [
+ "CHANGELOG.md"
+ ],
+ "extension": "md",
+ "name": "CHANGELOG.md",
+ "parent": "",
+ "toString": "CHANGELOG.md"
+ },
+ "hunks": [
+ {
+ "destinationLine": 1,
+ "destinationSpan": 12,
+ "segments": [
+ {
+ "lines": [
+ {
+ "destination": 1,
+ "line": "# Edit 1",
+ "source": 1,
+ "truncated": false
+ },
+ {
+ "destination": 2,
+ "line": "",
+ "source": 1,
+ "truncated": false
+ }
+ ],
+ "truncated": false,
+ "type": "ADDED"
+ },
+ {
+ "lines": [
+ {
+ "destination": 3,
+ "line": "# ChangeLog",
+ "source": 1,
+ "truncated": false
+ },
+ {
+ "destination": 4,
+ "line": "",
+ "source": 2,
+ "truncated": false
+ },
+ {
+ "destination": 5,
+ "line": "This log summarizes the changes in each released version of rouge. The versioning scheme",
+ "source": 3,
+ "truncated": false
+ },
+ {
+ "destination": 6,
+ "line": "we use is semver, although we will often release new lexers in minor versions, as a",
+ "source": 4,
+ "truncated": false
+ },
+ {
+ "destination": 7,
+ "line": "practical matter.",
+ "source": 5,
+ "truncated": false
+ },
+ {
+ "destination": 8,
+ "line": "",
+ "source": 6,
+ "truncated": false
+ },
+ {
+ "destination": 9,
+ "line": "## version TBD: (unreleased)",
+ "source": 7,
+ "truncated": false
+ },
+ {
+ "destination": 10,
+ "line": "",
+ "source": 8,
+ "truncated": false
+ },
+ {
+ "commentIds": [
+ 7
+ ],
+ "destination": 11,
+ "line": "* General",
+ "source": 9,
+ "truncated": false
+ },
+ {
+ "destination": 12,
+ "line": " * Load pastie theme ([#809](https://github.com/jneen/rouge/pull/809) by rramsden)",
+ "source": 10,
+ "truncated": false
+ }
+ ],
+ "truncated": false,
+ "type": "CONTEXT"
+ }
+ ],
+ "sourceLine": 1,
+ "sourceSpan": 10,
+ "truncated": false
+ }
+ ],
+ "properties": {
+ "current": true,
+ "fromHash": "c5f4288162e2e6218180779c7f6ac1735bb56eab",
+ "toHash": "a4c2164330f2549f67c13f36a93884cf66e976be"
+ },
+ "source": null,
+ "truncated": false
+ },
+ "id": 14,
+ "user": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ }
+ },
+ {
+ "action": "COMMENTED",
+ "comment": {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [
+ {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [
+ {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [],
+ "createdDate": 1530143330513,
+ "id": 8,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "How about this?",
+ "updatedDate": 1530143330513,
+ "version": 0
+ }
+ ],
+ "createdDate": 1530053193795,
+ "id": 6,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "It does.",
+ "updatedDate": 1530053193795,
+ "version": 0
+ }
+ ],
+ "createdDate": 1530053187904,
+ "id": 5,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "Does this line make sense?",
+ "updatedDate": 1530053187904,
+ "version": 0
+ },
+ "commentAction": "ADDED",
+ "commentAnchor": {
+ "diffType": "EFFECTIVE",
+ "fileType": "FROM",
+ "fromHash": "c5f4288162e2e6218180779c7f6ac1735bb56eab",
+ "line": 3,
+ "lineType": "CONTEXT",
+ "orphaned": false,
+ "path": "CHANGELOG.md",
+ "toHash": "a4c2164330f2549f67c13f36a93884cf66e976be"
+ },
+ "createdDate": 1530053187904,
+ "diff": {
+ "destination": {
+ "components": [
+ "CHANGELOG.md"
+ ],
+ "extension": "md",
+ "name": "CHANGELOG.md",
+ "parent": "",
+ "toString": "CHANGELOG.md"
+ },
+ "hunks": [
+ {
+ "destinationLine": 1,
+ "destinationSpan": 12,
+ "segments": [
+ {
+ "lines": [
+ {
+ "destination": 1,
+ "line": "# Edit 1",
+ "source": 1,
+ "truncated": false
+ },
+ {
+ "destination": 2,
+ "line": "",
+ "source": 1,
+ "truncated": false
+ }
+ ],
+ "truncated": false,
+ "type": "ADDED"
+ },
+ {
+ "lines": [
+ {
+ "destination": 3,
+ "line": "# ChangeLog",
+ "source": 1,
+ "truncated": false
+ },
+ {
+ "destination": 4,
+ "line": "",
+ "source": 2,
+ "truncated": false
+ },
+ {
+ "commentIds": [
+ 5
+ ],
+ "destination": 5,
+ "line": "This log summarizes the changes in each released version of rouge. The versioning scheme",
+ "source": 3,
+ "truncated": false
+ },
+ {
+ "destination": 6,
+ "line": "we use is semver, although we will often release new lexers in minor versions, as a",
+ "source": 4,
+ "truncated": false
+ },
+ {
+ "destination": 7,
+ "line": "practical matter.",
+ "source": 5,
+ "truncated": false
+ },
+ {
+ "destination": 8,
+ "line": "",
+ "source": 6,
+ "truncated": false
+ },
+ {
+ "destination": 9,
+ "line": "## version TBD: (unreleased)",
+ "source": 7,
+ "truncated": false
+ },
+ {
+ "destination": 10,
+ "line": "",
+ "source": 8,
+ "truncated": false
+ },
+ {
+ "destination": 11,
+ "line": "* General",
+ "source": 9,
+ "truncated": false
+ },
+ {
+ "destination": 12,
+ "line": " * Load pastie theme ([#809](https://github.com/jneen/rouge/pull/809) by rramsden)",
+ "source": 10,
+ "truncated": false
+ }
+ ],
+ "truncated": false,
+ "type": "CONTEXT"
+ }
+ ],
+ "sourceLine": 1,
+ "sourceSpan": 10,
+ "truncated": false
+ }
+ ],
+ "properties": {
+ "current": true,
+ "fromHash": "c5f4288162e2e6218180779c7f6ac1735bb56eab",
+ "toHash": "a4c2164330f2549f67c13f36a93884cf66e976be"
+ },
+ "source": null,
+ "truncated": false
+ },
+ "id": 12,
+ "user": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ }
+ },
+ {
+ "action": "COMMENTED",
+ "comment": {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [],
+ "createdDate": 1529813304164,
+ "id": 4,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "Hello world",
+ "updatedDate": 1529813304164,
+ "version": 0
+ },
+ "commentAction": "ADDED",
+ "createdDate": 1529813304164,
+ "id": 11,
+ "user": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ }
+ },
+ {
+ "action": "MERGED",
+ "commit": {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "authorTimestamp": 1529727872000,
+ "committer": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "committerTimestamp": 1529727872000,
+ "displayId": "839fa9a2d43",
+ "id": "839fa9a2d434eb697815b8fcafaecc51accfdbbc",
+ "message": "Merge pull request #1 in TEST/rouge from root/CHANGELOGmd-1529725646923 to master\n\n* commit '66fbe6a097803f0acb7342b19563f710657ce5a2':\n CHANGELOG.md edited online with Bitbucket",
+ "parents": [
+ {
+ "author": {
+ "emailAddress": "dblessing@users.noreply.github.com",
+ "name": "Drew Blessing"
+ },
+ "authorTimestamp": 1529604583000,
+ "committer": {
+ "emailAddress": "noreply@github.com",
+ "name": "GitHub"
+ },
+ "committerTimestamp": 1529604583000,
+ "displayId": "c5f4288162e",
+ "id": "c5f4288162e2e6218180779c7f6ac1735bb56eab",
+ "message": "Merge pull request #949 from jneen/dblessing-patch-1\n\nAdd 'obj-c', 'obj_c' as ObjectiveC aliases",
+ "parents": [
+ {
+ "displayId": "ea7675f741e",
+ "id": "ea7675f741ee28f3f177ff32a9bde192742ffc59"
+ },
+ {
+ "displayId": "386b95a977b",
+ "id": "386b95a977b331e267497aa5206861774656f0c5"
+ }
+ ]
+ },
+ {
+ "author": {
+ "emailAddress": "test.user@example.com",
+ "name": "root"
+ },
+ "authorTimestamp": 1529725651000,
+ "committer": {
+ "emailAddress": "test.user@example.com",
+ "name": "root"
+ },
+ "committerTimestamp": 1529725651000,
+ "displayId": "66fbe6a0978",
+ "id": "66fbe6a097803f0acb7342b19563f710657ce5a2",
+ "message": "CHANGELOG.md edited online with Bitbucket",
+ "parents": [
+ {
+ "displayId": "c5f4288162e",
+ "id": "c5f4288162e2e6218180779c7f6ac1735bb56eab"
+ }
+ ]
+ }
+ ]
+ },
+ "createdDate": 1529727872302,
+ "id": 7,
+ "user": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ }
+ },
+ {
+ "action": "COMMENTED",
+ "comment": {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [
+ {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [],
+ "createdDate": 1529813297478,
+ "id": 3,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "This is a thread",
+ "updatedDate": 1529813297478,
+ "version": 0
+ }
+ ],
+ "createdDate": 1529725692591,
+ "id": 2,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "What about this?",
+ "updatedDate": 1529725692591,
+ "version": 0
+ },
+ "commentAction": "ADDED",
+ "createdDate": 1529725692591,
+ "id": 6,
+ "user": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ }
+ },
+ {
+ "action": "COMMENTED",
+ "comment": {
+ "author": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ },
+ "comments": [],
+ "createdDate": 1529725685910,
+ "id": 1,
+ "permittedOperations": {
+ "deletable": true,
+ "editable": true
+ },
+ "properties": {
+ "repositoryId": 1
+ },
+ "tasks": [],
+ "text": "This is a test.\n\n[analyze.json](attachment:1/1f32f09d97%2Fanalyze.json)\n",
+ "updatedDate": 1529725685910,
+ "version": 0
+ },
+ "commentAction": "ADDED",
+ "createdDate": 1529725685910,
+ "id": 5,
+ "user": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ }
+ },
+ {
+ "action": "OPENED",
+ "createdDate": 1529725657542,
+ "id": 4,
+ "user": {
+ "active": true,
+ "displayName": "root",
+ "emailAddress": "test.user@example.com",
+ "id": 1,
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name": "root",
+ "slug": "root",
+ "type": "NORMAL"
+ }
+ }
+ ]
+}
diff --git a/spec/fixtures/importers/bitbucket_server/pull_request.json b/spec/fixtures/importers/bitbucket_server/pull_request.json
new file mode 100644
index 00000000000..6c7fcf3b04c
--- /dev/null
+++ b/spec/fixtures/importers/bitbucket_server/pull_request.json
@@ -0,0 +1,146 @@
+{
+ "author":{
+ "approved":false,
+ "role":"AUTHOR",
+ "status":"UNAPPROVED",
+ "user":{
+ "active":true,
+ "displayName":"root",
+ "emailAddress":"joe.montana@49ers.com",
+ "id":1,
+ "links":{
+ "self":[
+ {
+ "href":"http://localhost:7990/users/root"
+ }
+ ]
+ },
+ "name":"root",
+ "slug":"root",
+ "type":"NORMAL"
+ }
+ },
+ "closed":true,
+ "closedDate":1530600648850,
+ "createdDate":1530600635690,
+ "description":"Test",
+ "fromRef":{
+ "displayId":"root/CODE_OF_CONDUCTmd-1530600625006",
+ "id":"refs/heads/root/CODE_OF_CONDUCTmd-1530600625006",
+ "latestCommit":"074e2b4dddc5b99df1bf9d4a3f66cfc15481fdc8",
+ "repository":{
+ "forkable":true,
+ "id":1,
+ "links":{
+ "clone":[
+ {
+ "href":"http://root@localhost:7990/scm/test/rouge.git",
+ "name":"http"
+ },
+ {
+ "href":"ssh://git@localhost:7999/test/rouge.git",
+ "name":"ssh"
+ }
+ ],
+ "self":[
+ {
+ "href":"http://localhost:7990/projects/TEST/repos/rouge/browse"
+ }
+ ]
+ },
+ "name":"rouge",
+ "project":{
+ "description":"Test",
+ "id":1,
+ "key":"TEST",
+ "links":{
+ "self":[
+ {
+ "href":"http://localhost:7990/projects/TEST"
+ }
+ ]
+ },
+ "name":"test",
+ "public":false,
+ "type":"NORMAL"
+ },
+ "public":false,
+ "scmId":"git",
+ "slug":"rouge",
+ "state":"AVAILABLE",
+ "statusMessage":"Available"
+ }
+ },
+ "id":7,
+ "links":{
+ "self":[
+ {
+ "href":"http://localhost:7990/projects/TEST/repos/rouge/pull-requests/7"
+ }
+ ]
+ },
+ "locked":false,
+ "open":false,
+ "participants":[
+
+ ],
+ "properties":{
+ "commentCount":1,
+ "openTaskCount":0,
+ "resolvedTaskCount":0
+ },
+ "reviewers":[
+
+ ],
+ "state":"MERGED",
+ "title":"Added a new line",
+ "toRef":{
+ "displayId":"master",
+ "id":"refs/heads/master",
+ "latestCommit":"839fa9a2d434eb697815b8fcafaecc51accfdbbc",
+ "repository":{
+ "forkable":true,
+ "id":1,
+ "links":{
+ "clone":[
+ {
+ "href":"http://root@localhost:7990/scm/test/rouge.git",
+ "name":"http"
+ },
+ {
+ "href":"ssh://git@localhost:7999/test/rouge.git",
+ "name":"ssh"
+ }
+ ],
+ "self":[
+ {
+ "href":"http://localhost:7990/projects/TEST/repos/rouge/browse"
+ }
+ ]
+ },
+ "name":"rouge",
+ "project":{
+ "description":"Test",
+ "id":1,
+ "key":"TEST",
+ "links":{
+ "self":[
+ {
+ "href":"http://localhost:7990/projects/TEST"
+ }
+ ]
+ },
+ "name":"test",
+ "public":false,
+ "type":"NORMAL"
+ },
+ "public":false,
+ "scmId":"git",
+ "slug":"rouge",
+ "state":"AVAILABLE",
+ "statusMessage":"Available"
+ }
+ },
+ "updatedDate":1530600648850,
+ "version":2
+}
diff --git a/spec/fixtures/junit/junit.xml b/spec/fixtures/junit/junit.xml
new file mode 100644
index 00000000000..b826afdc3ae
--- /dev/null
+++ b/spec/fixtures/junit/junit.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuite name="rspec" tests="4" skipped="0" failures="2" errors="0" time="0.011289" timestamp="2018-07-17T10:48:13+00:00" hostname="runner-400e3f62-project-15-concurrent-0">
+<properties>
+<property name="seed" value="404"/>
+</properties>
+<testcase classname="spec.test_spec" name="Test#sum when a is 1 and b is 2 returns summary" file="./spec/test_spec.rb" time="0.009292"><failure message="
+expected: 3
+ got: -1
+
+(compared using ==)
+" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: is_expected.to eq(3)
+
+ expected: 3
+ got: -1
+
+ (compared using ==)
+./spec/test_spec.rb:12:in `block (4 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#sum when a is 100 and b is 200 returns summary" file="./spec/test_spec.rb" time="0.000180"><failure message="
+expected: 300
+ got: -100
+
+(compared using ==)
+" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: is_expected.to eq(300)
+
+ expected: 300
+ got: -100
+
+ (compared using ==)
+./spec/test_spec.rb:21:in `block (4 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract when a is 1 and b is 2 raises an error" file="./spec/test_spec.rb" time="0.000748"></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract when a is 2 and b is 1 returns correct result" file="./spec/test_spec.rb" time="0.000064"></testcase>
+</testsuite>
diff --git a/spec/fixtures/junit.xml.gz b/spec/fixtures/junit/junit.xml.gz
index 88b7de6fa61..88b7de6fa61 100644
--- a/spec/fixtures/junit.xml.gz
+++ b/spec/fixtures/junit/junit.xml.gz
Binary files differ
diff --git a/spec/fixtures/junit/junit_ant.xml.gz b/spec/fixtures/junit/junit_ant.xml.gz
new file mode 100644
index 00000000000..e9cca1b0c73
--- /dev/null
+++ b/spec/fixtures/junit/junit_ant.xml.gz
Binary files differ
diff --git a/spec/fixtures/junit/junit_with_corrupted_data.xml.gz b/spec/fixtures/junit/junit_with_corrupted_data.xml.gz
new file mode 100644
index 00000000000..e6d17e4595d
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_corrupted_data.xml.gz
Binary files differ
diff --git a/spec/fixtures/junit/junit_with_three_testsuites.xml.gz b/spec/fixtures/junit/junit_with_three_testsuites.xml.gz
new file mode 100644
index 00000000000..aa4ad154de8
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_three_testsuites.xml.gz
Binary files differ
diff --git a/spec/fixtures/junit/junit_with_three_testsuites_1.xml b/spec/fixtures/junit/junit_with_three_testsuites_1.xml
new file mode 100644
index 00000000000..5f31824042e
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_three_testsuites_1.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuite name="rspec" tests="2" skipped="0" failures="0" errors="0" time="0.001670" timestamp="2018-07-30T10:02:37+00:00" hostname="runner-7661726c-project-14-concurrent-0">
+<properties>
+<property name="seed" value="52549"/>
+</properties>
+<testcase classname="spec.hash_scan_spec" name="HashScan#scan when argument is hash returns the value" file="./spec/hash_scan_spec.rb" time="0.000287"></testcase>
+<testcase classname="spec.hash_scan_spec" name="HashScan#scan when argument is not hash raises and error" file="./spec/hash_scan_spec.rb" time="0.000686"></testcase>
+</testsuite>
diff --git a/spec/fixtures/junit/junit_with_three_testsuites_2.xml b/spec/fixtures/junit/junit_with_three_testsuites_2.xml
new file mode 100644
index 00000000000..8ae771978e0
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_three_testsuites_2.xml
@@ -0,0 +1,6010 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuite name="rspec" tests="1004" skipped="0" failures="1000" errors="0" time="0.202645" timestamp="2018-07-30T10:02:36+00:00" hostname="runner-7661726c-project-14-concurrent-0">
+<properties>
+<property name="seed" value="28152"/>
+</properties>
+<testcase classname="spec.test_spec" name="Test#sum when a is 1 and b is 2 returns summary" file="./spec/test_spec.rb" time="0.000368"></testcase>
+<testcase classname="spec.test_spec" name="Test#sum when a is 100 and b is 200 returns summary" file="./spec/test_spec.rb" time="0.000069"></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract when a is 1 and b is 2 raises an error" file="./spec/test_spec.rb" time="0.000734"></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract when a is 2 and b is 1 returns correct result" file="./spec/test_spec.rb" time="0.000066"></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract1 fails" file="./spec/test_spec.rb" time="0.009856"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:52:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract2 fails" file="./spec/test_spec.rb" time="0.000185"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:59:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract3 fails" file="./spec/test_spec.rb" time="0.000102"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:66:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract4 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:73:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract5 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:80:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract6 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:87:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract7 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:94:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract8 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:101:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract9 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:108:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract10 fails" file="./spec/test_spec.rb" time="0.013083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:115:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract11 fails" file="./spec/test_spec.rb" time="0.000117"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:122:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract12 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:129:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract13 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:136:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract14 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:143:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract15 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:150:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract16 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:157:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract17 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:164:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract18 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:171:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract19 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:178:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract20 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:185:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract21 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:192:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract22 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:199:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract23 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:206:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract24 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:213:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract25 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:220:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract26 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:227:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract27 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:234:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract28 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:241:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract29 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:248:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract30 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:255:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract31 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:262:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract32 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:269:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract33 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:276:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract34 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:283:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract35 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:290:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract36 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:297:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract37 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:304:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract38 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:311:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract39 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:318:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract40 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:325:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract41 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:332:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract42 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:339:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract43 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:346:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract44 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:353:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract45 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:360:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract46 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:367:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract47 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:374:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract48 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:381:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract49 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:388:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract50 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:395:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract51 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:402:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract52 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:409:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract53 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:416:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract54 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:423:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract55 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:430:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract56 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:437:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract57 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:444:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract58 fails" file="./spec/test_spec.rb" time="0.000110"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:451:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract59 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:458:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract60 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:465:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract61 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:472:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract62 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:479:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract63 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:486:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract64 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:493:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract65 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:500:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract66 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:507:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract67 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:514:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract68 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:521:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract69 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:528:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract70 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:535:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract71 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:542:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract72 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:549:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract73 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:556:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract74 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:563:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract75 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:570:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract76 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:577:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract77 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:584:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract78 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:591:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract79 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:598:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract80 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:605:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract81 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:612:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract82 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:619:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract83 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:626:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract84 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:633:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract85 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:640:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract86 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:647:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract87 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:654:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract88 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:661:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract89 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:668:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract90 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:675:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract91 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:682:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract92 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:689:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract93 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:696:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract94 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:703:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract95 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:710:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract96 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:717:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract97 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:724:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract98 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:731:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract99 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:738:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract100 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:745:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract101 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:752:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract102 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:759:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract103 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:766:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract104 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:773:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract105 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:780:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract106 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:787:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract107 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:794:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract108 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:801:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract109 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:808:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract110 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:815:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract111 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:822:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract112 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:829:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract113 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:836:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract114 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:843:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract115 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:850:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract116 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:857:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract117 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:864:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract118 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:871:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract119 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:878:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract120 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:885:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract121 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:892:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract122 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:899:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract123 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:906:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract124 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:913:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract125 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:920:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract126 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:927:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract127 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:934:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract128 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:941:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract129 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:948:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract130 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:955:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract131 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:962:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract132 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:969:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract133 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:976:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract134 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:983:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract135 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:990:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract136 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:997:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract137 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1004:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract138 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1011:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract139 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1018:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract140 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1025:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract141 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1032:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract142 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1039:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract143 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1046:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract144 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1053:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract145 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1060:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract146 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1067:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract147 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1074:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract148 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1081:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract149 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1088:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract150 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1095:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract151 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1102:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract152 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1109:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract153 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1116:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract154 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1123:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract155 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1130:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract156 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1137:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract157 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1144:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract158 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1151:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract159 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1158:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract160 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1165:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract161 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1172:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract162 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1179:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract163 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1186:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract164 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1193:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract165 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1200:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract166 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1207:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract167 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1214:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract168 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1221:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract169 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1228:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract170 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1235:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract171 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1242:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract172 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1249:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract173 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1256:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract174 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1263:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract175 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1270:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract176 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1277:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract177 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1284:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract178 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1291:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract179 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1298:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract180 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1305:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract181 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1312:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract182 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1319:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract183 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1326:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract184 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1333:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract185 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1340:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract186 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1347:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract187 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1354:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract188 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1361:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract189 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1368:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract190 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1375:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract191 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1382:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract192 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1389:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract193 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1396:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract194 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1403:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract195 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1410:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract196 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1417:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract197 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1424:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract198 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1431:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract199 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1438:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract200 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1445:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract201 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1452:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract202 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1459:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract203 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1466:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract204 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1473:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract205 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1480:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract206 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1487:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract207 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1494:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract208 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1501:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract209 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1508:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract210 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1515:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract211 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1522:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract212 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1529:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract213 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1536:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract214 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1543:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract215 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1550:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract216 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1557:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract217 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1564:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract218 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1571:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract219 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1578:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract220 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1585:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract221 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1592:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract222 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1599:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract223 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1606:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract224 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1613:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract225 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1620:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract226 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1627:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract227 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1634:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract228 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1641:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract229 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1648:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract230 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1655:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract231 fails" file="./spec/test_spec.rb" time="0.000102"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1662:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract232 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1669:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract233 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1676:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract234 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1683:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract235 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1690:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract236 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1697:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract237 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1704:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract238 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1711:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract239 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1718:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract240 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1725:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract241 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1732:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract242 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1739:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract243 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1746:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract244 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1753:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract245 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1760:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract246 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1767:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract247 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1774:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract248 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1781:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract249 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1788:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract250 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1795:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract251 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1802:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract252 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1809:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract253 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1816:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract254 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1823:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract255 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1830:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract256 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1837:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract257 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1844:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract258 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1851:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract259 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1858:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract260 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1865:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract261 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1872:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract262 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1879:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract263 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1886:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract264 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1893:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract265 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1900:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract266 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1907:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract267 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1914:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract268 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1921:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract269 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1928:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract270 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1935:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract271 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1942:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract272 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1949:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract273 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1956:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract274 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1963:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract275 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1970:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract276 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1977:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract277 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1984:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract278 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1991:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract279 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1998:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract280 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2005:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract281 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2012:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract282 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2019:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract283 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2026:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract284 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2033:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract285 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2040:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract286 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2047:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract287 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2054:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract288 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2061:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract289 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2068:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract290 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2075:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract291 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2082:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract292 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2089:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract293 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2096:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract294 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2103:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract295 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2110:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract296 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2117:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract297 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2124:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract298 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2131:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract299 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2138:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract300 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2145:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract301 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2152:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract302 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2159:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract303 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2166:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract304 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2173:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract305 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2180:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract306 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2187:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract307 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2194:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract308 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2201:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract309 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2208:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract310 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2215:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract311 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2222:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract312 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2229:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract313 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2236:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract314 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2243:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract315 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2250:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract316 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2257:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract317 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2264:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract318 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2271:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract319 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2278:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract320 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2285:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract321 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2292:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract322 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2299:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract323 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2306:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract324 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2313:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract325 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2320:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract326 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2327:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract327 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2334:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract328 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2341:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract329 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2348:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract330 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2355:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract331 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2362:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract332 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2369:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract333 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2376:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract334 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2383:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract335 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2390:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract336 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2397:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract337 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2404:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract338 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2411:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract339 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2418:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract340 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2425:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract341 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2432:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract342 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2439:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract343 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2446:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract344 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2453:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract345 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2460:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract346 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2467:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract347 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2474:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract348 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2481:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract349 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2488:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract350 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2495:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract351 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2502:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract352 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2509:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract353 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2516:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract354 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2523:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract355 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2530:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract356 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2537:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract357 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2544:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract358 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2551:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract359 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2558:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract360 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2565:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract361 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2572:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract362 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2579:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract363 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2586:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract364 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2593:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract365 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2600:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract366 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2607:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract367 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2614:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract368 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2621:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract369 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2628:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract370 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2635:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract371 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2642:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract372 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2649:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract373 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2656:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract374 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2663:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract375 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2670:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract376 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2677:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract377 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2684:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract378 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2691:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract379 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2698:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract380 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2705:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract381 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2712:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract382 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2719:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract383 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2726:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract384 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2733:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract385 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2740:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract386 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2747:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract387 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2754:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract388 fails" file="./spec/test_spec.rb" time="0.006281"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2761:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract389 fails" file="./spec/test_spec.rb" time="0.000197"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2768:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract390 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2775:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract391 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2782:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract392 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2789:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract393 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2796:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract394 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2803:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract395 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2810:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract396 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2817:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract397 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2824:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract398 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2831:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract399 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2838:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract400 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2845:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract401 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2852:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract402 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2859:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract403 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2866:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract404 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2873:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract405 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2880:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract406 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2887:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract407 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2894:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract408 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2901:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract409 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2908:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract410 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2915:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract411 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2922:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract412 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2929:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract413 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2936:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract414 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2943:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract415 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2950:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract416 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2957:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract417 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2964:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract418 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2971:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract419 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2978:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract420 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2985:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract421 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2992:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract422 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2999:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract423 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3006:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract424 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3013:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract425 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3020:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract426 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3027:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract427 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3034:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract428 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3041:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract429 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3048:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract430 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3055:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract431 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3062:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract432 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3069:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract433 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3076:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract434 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3083:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract435 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3090:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract436 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3097:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract437 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3104:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract438 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3111:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract439 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3118:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract440 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3125:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract441 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3132:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract442 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3139:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract443 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3146:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract444 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3153:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract445 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3160:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract446 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3167:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract447 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3174:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract448 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3181:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract449 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3188:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract450 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3195:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract451 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3202:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract452 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3209:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract453 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3216:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract454 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3223:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract455 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3230:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract456 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3237:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract457 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3244:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract458 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3251:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract459 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3258:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract460 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3265:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract461 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3272:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract462 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3279:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract463 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3286:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract464 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3293:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract465 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3300:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract466 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3307:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract467 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3314:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract468 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3321:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract469 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3328:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract470 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3335:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract471 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3342:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract472 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3349:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract473 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3356:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract474 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3363:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract475 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3370:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract476 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3377:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract477 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3384:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract478 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3391:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract479 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3398:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract480 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3405:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract481 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3412:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract482 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3419:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract483 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3426:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract484 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3433:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract485 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3440:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract486 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3447:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract487 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3454:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract488 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3461:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract489 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3468:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract490 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3475:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract491 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3482:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract492 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3489:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract493 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3496:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract494 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3503:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract495 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3510:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract496 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3517:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract497 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3524:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract498 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3531:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract499 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3538:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract500 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3545:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract501 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3552:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract502 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3559:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract503 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3566:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract504 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3573:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract505 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3580:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract506 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3587:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract507 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3594:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract508 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3601:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract509 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3608:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract510 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3615:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract511 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3622:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract512 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3629:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract513 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3636:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract514 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3643:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract515 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3650:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract516 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3657:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract517 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3664:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract518 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3671:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract519 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3678:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract520 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3685:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract521 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3692:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract522 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3699:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract523 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3706:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract524 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3713:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract525 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3720:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract526 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3727:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract527 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3734:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract528 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3741:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract529 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3748:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract530 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3755:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract531 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3762:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract532 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3769:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract533 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3776:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract534 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3783:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract535 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3790:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract536 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3797:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract537 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3804:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract538 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3811:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract539 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3818:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract540 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3825:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract541 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3832:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract542 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3839:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract543 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3846:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract544 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3853:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract545 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3860:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract546 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3867:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract547 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3874:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract548 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3881:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract549 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3888:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract550 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3895:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract551 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3902:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract552 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3909:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract553 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3916:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract554 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3923:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract555 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3930:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract556 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3937:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract557 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3944:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract558 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3951:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract559 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3958:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract560 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3965:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract561 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3972:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract562 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3979:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract563 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3986:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract564 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3993:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract565 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4000:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract566 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4007:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract567 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4014:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract568 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4021:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract569 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4028:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract570 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4035:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract571 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4042:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract572 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4049:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract573 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4056:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract574 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4063:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract575 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4070:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract576 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4077:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract577 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4084:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract578 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4091:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract579 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4098:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract580 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4105:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract581 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4112:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract582 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4119:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract583 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4126:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract584 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4133:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract585 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4140:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract586 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4147:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract587 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4154:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract588 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4161:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract589 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4168:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract590 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4175:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract591 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4182:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract592 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4189:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract593 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4196:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract594 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4203:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract595 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4210:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract596 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4217:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract597 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4224:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract598 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4231:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract599 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4238:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract600 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4245:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract601 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4252:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract602 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4259:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract603 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4266:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract604 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4273:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract605 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4280:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract606 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4287:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract607 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4294:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract608 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4301:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract609 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4308:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract610 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4315:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract611 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4322:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract612 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4329:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract613 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4336:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract614 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4343:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract615 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4350:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract616 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4357:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract617 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4364:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract618 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4371:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract619 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4378:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract620 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4385:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract621 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4392:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract622 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4399:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract623 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4406:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract624 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4413:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract625 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4420:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract626 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4427:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract627 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4434:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract628 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4441:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract629 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4448:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract630 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4455:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract631 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4462:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract632 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4469:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract633 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4476:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract634 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4483:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract635 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4490:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract636 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4497:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract637 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4504:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract638 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4511:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract639 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4518:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract640 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4525:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract641 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4532:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract642 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4539:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract643 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4546:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract644 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4553:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract645 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4560:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract646 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4567:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract647 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4574:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract648 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4581:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract649 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4588:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract650 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4595:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract651 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4602:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract652 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4609:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract653 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4616:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract654 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4623:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract655 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4630:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract656 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4637:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract657 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4644:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract658 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4651:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract659 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4658:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract660 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4665:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract661 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4672:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract662 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4679:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract663 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4686:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract664 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4693:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract665 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4700:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract666 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4707:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract667 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4714:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract668 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4721:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract669 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4728:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract670 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4735:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract671 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4742:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract672 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4749:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract673 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4756:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract674 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4763:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract675 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4770:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract676 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4777:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract677 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4784:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract678 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4791:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract679 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4798:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract680 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4805:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract681 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4812:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract682 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4819:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract683 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4826:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract684 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4833:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract685 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4840:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract686 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4847:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract687 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4854:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract688 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4861:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract689 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4868:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract690 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4875:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract691 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4882:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract692 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4889:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract693 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4896:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract694 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4903:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract695 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4910:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract696 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4917:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract697 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4924:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract698 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4931:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract699 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4938:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract700 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4945:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract701 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4952:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract702 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4959:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract703 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4966:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract704 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4973:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract705 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4980:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract706 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4987:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract707 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4994:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract708 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5001:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract709 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5008:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract710 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5015:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract711 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5022:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract712 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5029:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract713 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5036:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract714 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5043:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract715 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5050:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract716 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5057:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract717 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5064:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract718 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5071:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract719 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5078:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract720 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5085:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract721 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5092:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract722 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5099:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract723 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5106:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract724 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5113:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract725 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5120:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract726 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5127:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract727 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5134:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract728 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5141:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract729 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5148:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract730 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5155:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract731 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5162:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract732 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5169:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract733 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5176:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract734 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5183:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract735 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5190:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract736 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5197:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract737 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5204:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract738 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5211:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract739 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5218:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract740 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5225:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract741 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5232:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract742 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5239:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract743 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5246:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract744 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5253:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract745 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5260:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract746 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5267:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract747 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5274:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract748 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5281:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract749 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5288:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract750 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5295:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract751 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5302:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract752 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5309:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract753 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5316:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract754 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5323:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract755 fails" file="./spec/test_spec.rb" time="0.005906"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5330:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract756 fails" file="./spec/test_spec.rb" time="0.000117"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5337:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract757 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5344:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract758 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5351:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract759 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5358:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract760 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5365:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract761 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5372:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract762 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5379:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract763 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5386:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract764 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5393:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract765 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5400:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract766 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5407:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract767 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5414:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract768 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5421:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract769 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5428:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract770 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5435:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract771 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5442:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract772 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5449:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract773 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5456:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract774 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5463:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract775 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5470:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract776 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5477:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract777 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5484:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract778 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5491:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract779 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5498:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract780 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5505:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract781 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5512:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract782 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5519:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract783 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5526:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract784 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5533:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract785 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5540:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract786 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5547:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract787 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5554:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract788 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5561:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract789 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5568:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract790 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5575:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract791 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5582:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract792 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5589:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract793 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5596:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract794 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5603:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract795 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5610:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract796 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5617:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract797 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5624:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract798 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5631:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract799 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5638:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract800 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5645:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract801 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5652:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract802 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5659:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract803 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5666:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract804 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5673:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract805 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5680:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract806 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5687:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract807 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5694:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract808 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5701:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract809 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5708:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract810 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5715:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract811 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5722:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract812 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5729:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract813 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5736:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract814 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5743:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract815 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5750:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract816 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5757:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract817 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5764:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract818 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5771:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract819 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5778:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract820 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5785:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract821 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5792:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract822 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5799:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract823 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5806:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract824 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5813:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract825 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5820:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract826 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5827:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract827 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5834:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract828 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5841:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract829 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5848:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract830 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5855:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract831 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5862:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract832 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5869:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract833 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5876:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract834 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5883:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract835 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5890:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract836 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5897:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract837 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5904:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract838 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5911:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract839 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5918:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract840 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5925:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract841 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5932:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract842 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5939:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract843 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5946:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract844 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5953:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract845 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5960:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract846 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5967:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract847 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5974:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract848 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5981:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract849 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5988:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract850 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5995:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract851 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6002:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract852 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6009:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract853 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6016:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract854 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6023:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract855 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6030:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract856 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6037:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract857 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6044:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract858 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6051:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract859 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6058:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract860 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6065:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract861 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6072:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract862 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6079:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract863 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6086:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract864 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6093:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract865 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6100:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract866 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6107:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract867 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6114:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract868 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6121:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract869 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6128:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract870 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6135:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract871 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6142:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract872 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6149:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract873 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6156:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract874 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6163:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract875 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6170:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract876 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6177:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract877 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6184:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract878 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6191:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract879 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6198:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract880 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6205:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract881 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6212:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract882 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6219:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract883 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6226:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract884 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6233:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract885 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6240:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract886 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6247:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract887 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6254:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract888 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6261:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract889 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6268:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract890 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6275:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract891 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6282:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract892 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6289:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract893 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6296:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract894 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6303:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract895 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6310:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract896 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6317:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract897 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6324:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract898 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6331:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract899 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6338:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract900 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6345:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract901 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6352:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract902 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6359:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract903 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6366:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract904 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6373:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract905 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6380:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract906 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6387:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract907 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6394:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract908 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6401:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract909 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6408:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract910 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6415:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract911 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6422:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract912 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6429:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract913 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6436:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract914 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6443:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract915 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6450:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract916 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6457:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract917 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6464:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract918 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6471:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract919 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6478:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract920 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6485:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract921 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6492:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract922 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6499:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract923 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6506:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract924 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6513:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract925 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6520:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract926 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6527:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract927 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6534:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract928 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6541:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract929 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6548:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract930 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6555:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract931 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6562:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract932 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6569:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract933 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6576:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract934 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6583:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract935 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6590:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract936 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6597:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract937 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6604:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract938 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6611:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract939 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6618:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract940 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6625:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract941 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6632:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract942 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6639:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract943 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6646:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract944 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6653:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract945 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6660:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract946 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6667:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract947 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6674:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract948 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6681:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract949 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6688:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract950 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6695:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract951 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6702:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract952 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6709:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract953 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6716:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract954 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6723:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract955 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6730:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract956 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6737:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract957 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6744:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract958 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6751:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract959 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6758:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract960 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6765:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract961 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6772:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract962 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6779:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract963 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6786:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract964 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6793:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract965 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6800:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract966 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6807:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract967 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6814:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract968 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6821:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract969 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6828:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract970 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6835:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract971 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6842:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract972 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6849:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract973 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6856:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract974 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6863:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract975 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6870:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract976 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6877:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract977 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6884:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract978 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6891:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract979 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6898:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract980 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6905:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract981 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6912:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract982 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6919:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract983 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6926:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract984 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6933:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract985 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6940:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract986 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6947:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract987 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6954:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract988 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6961:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract989 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6968:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract990 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6975:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract991 fails" file="./spec/test_spec.rb" time="0.000113"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6982:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract992 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6989:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract993 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6996:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract994 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7003:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract995 fails" file="./spec/test_spec.rb" time="0.000104"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7010:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract996 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7017:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract997 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7024:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract998 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7031:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract999 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7038:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract1000 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7045:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+</testsuite>
diff --git a/spec/fixtures/junit/junit_with_three_testsuites_3.xml b/spec/fixtures/junit/junit_with_three_testsuites_3.xml
new file mode 100644
index 00000000000..9b3c287aec8
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_three_testsuites_3.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuite name="rspec" tests="2" skipped="0" failures="0" errors="0" time="0.001691" timestamp="2018-07-30T10:02:37+00:00" hostname="runner-7661726c-project-14-concurrent-0">
+<properties>
+<property name="seed" value="8528"/>
+</properties>
+<testcase classname="spec.string_helper_spec" name="StringHelper#concatenate when a is git and b is lab returns summary" file="./spec/string_helper_spec.rb" time="0.000287"></testcase>
+<testcase classname="spec.string_helper_spec" name="StringHelper#concatenate when a is git and b is 200 raises an error" file="./spec/string_helper_spec.rb" time="0.000706"></testcase>
+</testsuite>
diff --git a/spec/helpers/namespaces_helper_spec.rb b/spec/helpers/namespaces_helper_spec.rb
index 343e140f5fb..234690e742b 100644
--- a/spec/helpers/namespaces_helper_spec.rb
+++ b/spec/helpers/namespaces_helper_spec.rb
@@ -31,6 +31,44 @@ describe NamespacesHelper do
expect(options).to include(user.name)
end
+ it 'avoids duplicate groups when extra_group is used' do
+ allow(helper).to receive(:current_user).and_return(admin)
+
+ options = helper.namespaces_options(user_group.id, display_path: true, extra_group: build(:group, name: admin_group.name))
+
+ expect(options.scan("data-name=\"#{admin_group.name}\"").count).to eq(1)
+ expect(options).to include(admin_group.name)
+ end
+
+ it 'selects existing group' do
+ allow(helper).to receive(:current_user).and_return(admin)
+
+ options = helper.namespaces_options(:extra_group, display_path: true, extra_group: user_group)
+
+ expect(options).to include("selected=\"selected\" value=\"#{user_group.id}\"")
+ expect(options).to include(admin_group.name)
+ end
+
+ it 'selects the new group by default' do
+ allow(helper).to receive(:current_user).and_return(user)
+
+ options = helper.namespaces_options(:extra_group, display_path: true, extra_group: build(:group, name: 'new-group'))
+
+ expect(options).to include(user_group.name)
+ expect(options).not_to include(admin_group.name)
+ expect(options).to include("selected=\"selected\" value=\"-1\"")
+ end
+
+ it 'falls back to current user selection' do
+ allow(helper).to receive(:current_user).and_return(user)
+
+ options = helper.namespaces_options(:extra_group, display_path: true, extra_group: build(:group, name: admin_group.name))
+
+ expect(options).to include(user_group.name)
+ expect(options).not_to include(admin_group.name)
+ expect(options).to include("selected=\"selected\" value=\"#{user.namespace.id}\"")
+ end
+
it 'returns only groups if groups_only option is true' do
allow(helper).to receive(:current_user).and_return(user)
diff --git a/spec/javascripts/autosave_spec.js b/spec/javascripts/autosave_spec.js
index 38ae5b7e00c..dcb1c781591 100644
--- a/spec/javascripts/autosave_spec.js
+++ b/spec/javascripts/autosave_spec.js
@@ -59,12 +59,10 @@ describe('Autosave', () => {
Autosave.prototype.restore.call(autosave);
- expect(
- field.trigger,
- ).toHaveBeenCalled();
+ expect(field.trigger).toHaveBeenCalled();
});
- it('triggers native event', (done) => {
+ it('triggers native event', done => {
autosave.field.get(0).addEventListener('change', () => {
done();
});
@@ -81,9 +79,7 @@ describe('Autosave', () => {
it('does not trigger event', () => {
spyOn(field, 'trigger').and.callThrough();
- expect(
- field.trigger,
- ).not.toHaveBeenCalled();
+ expect(field.trigger).not.toHaveBeenCalled();
});
});
});
diff --git a/spec/javascripts/boards/issue_card_spec.js b/spec/javascripts/boards/issue_card_spec.js
index 7a32e84bced..b6c61e7bad7 100644
--- a/spec/javascripts/boards/issue_card_spec.js
+++ b/spec/javascripts/boards/issue_card_spec.js
@@ -69,109 +69,100 @@ describe('Issue card component', () => {
});
it('renders issue title', () => {
- expect(
- component.$el.querySelector('.board-card-title').textContent,
- ).toContain(issue.title);
+ expect(component.$el.querySelector('.board-card-title').textContent).toContain(issue.title);
});
it('includes issue base in link', () => {
- expect(
- component.$el.querySelector('.board-card-title a').getAttribute('href'),
- ).toContain('/test');
+ expect(component.$el.querySelector('.board-card-title a').getAttribute('href')).toContain(
+ '/test',
+ );
});
it('includes issue title on link', () => {
- expect(
- component.$el.querySelector('.board-card-title a').getAttribute('title'),
- ).toBe(issue.title);
+ expect(component.$el.querySelector('.board-card-title a').getAttribute('title')).toBe(
+ issue.title,
+ );
});
it('does not render confidential icon', () => {
- expect(
- component.$el.querySelector('.fa-eye-flash'),
- ).toBeNull();
+ expect(component.$el.querySelector('.fa-eye-flash')).toBeNull();
});
- it('renders confidential icon', (done) => {
+ it('renders confidential icon', done => {
component.issue.confidential = true;
Vue.nextTick(() => {
- expect(
- component.$el.querySelector('.confidential-icon'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.confidential-icon')).not.toBeNull();
done();
});
});
it('renders issue ID with #', () => {
- expect(
- component.$el.querySelector('.board-card-number').textContent,
- ).toContain(`#${issue.id}`);
+ expect(component.$el.querySelector('.board-card-number').textContent).toContain(`#${issue.id}`);
});
describe('assignee', () => {
it('does not render assignee', () => {
- expect(
- component.$el.querySelector('.board-card-assignee .avatar'),
- ).toBeNull();
+ expect(component.$el.querySelector('.board-card-assignee .avatar')).toBeNull();
});
describe('exists', () => {
- beforeEach((done) => {
+ beforeEach(done => {
component.issue.assignees = [user];
Vue.nextTick(() => done());
});
it('renders assignee', () => {
- expect(
- component.$el.querySelector('.board-card-assignee .avatar'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.board-card-assignee .avatar')).not.toBeNull();
});
it('sets title', () => {
expect(
- component.$el.querySelector('.board-card-assignee img').getAttribute('data-original-title'),
+ component.$el
+ .querySelector('.board-card-assignee img')
+ .getAttribute('data-original-title'),
).toContain(`Assigned to ${user.name}`);
});
it('sets users path', () => {
- expect(
- component.$el.querySelector('.board-card-assignee a').getAttribute('href'),
- ).toBe('/test');
+ expect(component.$el.querySelector('.board-card-assignee a').getAttribute('href')).toBe(
+ '/test',
+ );
});
it('renders avatar', () => {
- expect(
- component.$el.querySelector('.board-card-assignee img'),
- ).not.toBeNull();
+ expect(component.$el.querySelector('.board-card-assignee img')).not.toBeNull();
});
});
describe('assignee default avatar', () => {
- beforeEach((done) => {
- component.issue.assignees = [new ListAssignee({
- id: 1,
- name: 'testing 123',
- username: 'test',
- }, 'default_avatar')];
+ beforeEach(done => {
+ component.issue.assignees = [
+ new ListAssignee(
+ {
+ id: 1,
+ name: 'testing 123',
+ username: 'test',
+ },
+ 'default_avatar',
+ ),
+ ];
Vue.nextTick(done);
});
it('displays defaults avatar if users avatar is null', () => {
- expect(
- component.$el.querySelector('.board-card-assignee img'),
- ).not.toBeNull();
- expect(
- component.$el.querySelector('.board-card-assignee img').getAttribute('src'),
- ).toBe('default_avatar');
+ expect(component.$el.querySelector('.board-card-assignee img')).not.toBeNull();
+ expect(component.$el.querySelector('.board-card-assignee img').getAttribute('src')).toBe(
+ 'default_avatar?width=20',
+ );
});
});
});
describe('multiple assignees', () => {
- beforeEach((done) => {
+ beforeEach(done => {
component.issue.assignees = [
user,
new ListAssignee({
@@ -191,7 +182,8 @@ describe('Issue card component', () => {
name: 'user4',
username: 'user4',
avatar: 'test_image',
- })];
+ }),
+ ];
Vue.nextTick(() => done());
});
@@ -201,26 +193,30 @@ describe('Issue card component', () => {
});
describe('more than four assignees', () => {
- beforeEach((done) => {
- component.issue.assignees.push(new ListAssignee({
- id: 5,
- name: 'user5',
- username: 'user5',
- avatar: 'test_image',
- }));
+ beforeEach(done => {
+ component.issue.assignees.push(
+ new ListAssignee({
+ id: 5,
+ name: 'user5',
+ username: 'user5',
+ avatar: 'test_image',
+ }),
+ );
Vue.nextTick(() => done());
});
it('renders more avatar counter', () => {
- expect(component.$el.querySelector('.board-card-assignee .avatar-counter').innerText).toEqual('+2');
+ expect(
+ component.$el.querySelector('.board-card-assignee .avatar-counter').innerText,
+ ).toEqual('+2');
});
it('renders three assignees', () => {
expect(component.$el.querySelectorAll('.board-card-assignee .avatar').length).toEqual(3);
});
- it('renders 99+ avatar counter', (done) => {
+ it('renders 99+ avatar counter', done => {
for (let i = 5; i < 104; i += 1) {
const u = new ListAssignee({
id: i,
@@ -232,7 +228,9 @@ describe('Issue card component', () => {
}
Vue.nextTick(() => {
- expect(component.$el.querySelector('.board-card-assignee .avatar-counter').innerText).toEqual('99+');
+ expect(
+ component.$el.querySelector('.board-card-assignee .avatar-counter').innerText,
+ ).toEqual('99+');
done();
});
});
@@ -240,59 +238,51 @@ describe('Issue card component', () => {
});
describe('labels', () => {
- beforeEach((done) => {
+ beforeEach(done => {
component.issue.addLabel(label1);
Vue.nextTick(() => done());
});
it('renders list label', () => {
- expect(
- component.$el.querySelectorAll('.badge').length,
- ).toBe(2);
+ expect(component.$el.querySelectorAll('.badge').length).toBe(2);
});
it('renders label', () => {
const nodes = [];
- component.$el.querySelectorAll('.badge').forEach((label) => {
+ component.$el.querySelectorAll('.badge').forEach(label => {
nodes.push(label.getAttribute('data-original-title'));
});
- expect(
- nodes.includes(label1.description),
- ).toBe(true);
+ expect(nodes.includes(label1.description)).toBe(true);
});
it('sets label description as title', () => {
- expect(
- component.$el.querySelector('.badge').getAttribute('data-original-title'),
- ).toContain(label1.description);
+ expect(component.$el.querySelector('.badge').getAttribute('data-original-title')).toContain(
+ label1.description,
+ );
});
it('sets background color of button', () => {
const nodes = [];
- component.$el.querySelectorAll('.badge').forEach((label) => {
+ component.$el.querySelectorAll('.badge').forEach(label => {
nodes.push(label.style.backgroundColor);
});
- expect(
- nodes.includes(label1.color),
- ).toBe(true);
+ expect(nodes.includes(label1.color)).toBe(true);
});
- it('does not render label if label does not have an ID', (done) => {
- component.issue.addLabel(new ListLabel({
- title: 'closed',
- }));
+ it('does not render label if label does not have an ID', done => {
+ component.issue.addLabel(
+ new ListLabel({
+ title: 'closed',
+ }),
+ );
Vue.nextTick()
.then(() => {
- expect(
- component.$el.querySelectorAll('.badge').length,
- ).toBe(2);
- expect(
- component.$el.textContent,
- ).not.toContain('closed');
+ expect(component.$el.querySelectorAll('.badge').length).toBe(2);
+ expect(component.$el.textContent).not.toContain('closed');
done();
})
diff --git a/spec/javascripts/diffs/components/diff_line_note_form_spec.js b/spec/javascripts/diffs/components/diff_line_note_form_spec.js
index 4600aaea70b..6fe5fdaf7f9 100644
--- a/spec/javascripts/diffs/components/diff_line_note_form_spec.js
+++ b/spec/javascripts/diffs/components/diff_line_note_form_spec.js
@@ -3,6 +3,7 @@ import DiffLineNoteForm from '~/diffs/components/diff_line_note_form.vue';
import store from '~/mr_notes/stores';
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import diffFileMockData from '../mock_data/diff_file';
+import { noteableDataMock } from '../../notes/mock_data';
describe('DiffLineNoteForm', () => {
let component;
@@ -21,10 +22,9 @@ describe('DiffLineNoteForm', () => {
noteTargetLine: diffLines[0],
});
- Object.defineProperty(component, 'isLoggedIn', {
- get() {
- return true;
- },
+ Object.defineProperties(component, {
+ noteableData: { value: noteableDataMock },
+ isLoggedIn: { value: true },
});
component.$mount();
@@ -32,12 +32,37 @@ describe('DiffLineNoteForm', () => {
describe('methods', () => {
describe('handleCancelCommentForm', () => {
- it('should call cancelCommentForm with lineCode', () => {
+ it('should ask for confirmation when shouldConfirm and isDirty passed as truthy', () => {
+ spyOn(window, 'confirm').and.returnValue(false);
+
+ component.handleCancelCommentForm(true, true);
+ expect(window.confirm).toHaveBeenCalled();
+ });
+
+ it('should ask for confirmation when one of the params false', () => {
+ spyOn(window, 'confirm').and.returnValue(false);
+
+ component.handleCancelCommentForm(true, false);
+ expect(window.confirm).not.toHaveBeenCalled();
+
+ component.handleCancelCommentForm(false, true);
+ expect(window.confirm).not.toHaveBeenCalled();
+ });
+
+ it('should call cancelCommentForm with lineCode', done => {
+ spyOn(window, 'confirm');
spyOn(component, 'cancelCommentForm');
+ spyOn(component, 'resetAutoSave');
component.handleCancelCommentForm();
- expect(component.cancelCommentForm).toHaveBeenCalledWith({
- lineCode: diffLines[0].lineCode,
+ expect(window.confirm).not.toHaveBeenCalled();
+ component.$nextTick(() => {
+ expect(component.cancelCommentForm).toHaveBeenCalledWith({
+ lineCode: diffLines[0].lineCode,
+ });
+ expect(component.resetAutoSave).toHaveBeenCalled();
+
+ done();
});
});
});
@@ -66,7 +91,7 @@ describe('DiffLineNoteForm', () => {
describe('mounted', () => {
it('should init autosave', () => {
- const key = 'autosave/Note/issue///DiffNote//1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1';
+ const key = 'autosave/Note/Issue/98//DiffNote//1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1';
expect(component.autosave).toBeDefined();
expect(component.autosave.key).toEqual(key);
diff --git a/spec/javascripts/fixtures/search_autocomplete.html.haml b/spec/javascripts/fixtures/search_autocomplete.html.haml
index 0421ed2182f..4aa54da9411 100644
--- a/spec/javascripts/fixtures/search_autocomplete.html.haml
+++ b/spec/javascripts/fixtures/search_autocomplete.html.haml
@@ -1,8 +1,6 @@
-.search.search-form.has-location-badge
- %form.navbar-form
+.search.search-form
+ %form.form-inline
.search-input-container
- %div.location-badge
- This project
.search-input-wrap
.dropdown
%input#search.search-input.dropdown-menu-toggle
diff --git a/spec/javascripts/ide/components/new_dropdown/index_spec.js b/spec/javascripts/ide/components/new_dropdown/index_spec.js
index 092c405a70b..8a8cbd2cee4 100644
--- a/spec/javascripts/ide/components/new_dropdown/index_spec.js
+++ b/spec/javascripts/ide/components/new_dropdown/index_spec.js
@@ -62,7 +62,9 @@ describe('new dropdown component', () => {
vm.dropdownOpen = true;
setTimeout(() => {
- expect(vm.$refs.dropdownMenu.scrollIntoView).toHaveBeenCalled();
+ expect(vm.$refs.dropdownMenu.scrollIntoView).toHaveBeenCalledWith({
+ block: 'nearest',
+ });
done();
});
@@ -73,7 +75,7 @@ describe('new dropdown component', () => {
it('calls delete action', () => {
spyOn(vm, 'deleteEntry');
- vm.$el.querySelectorAll('.dropdown-menu button')[3].click();
+ vm.$el.querySelectorAll('.dropdown-menu button')[4].click();
expect(vm.deleteEntry).toHaveBeenCalledWith('');
});
diff --git a/spec/javascripts/ide/components/new_dropdown/modal_spec.js b/spec/javascripts/ide/components/new_dropdown/modal_spec.js
index 70651535e87..595a2f927e9 100644
--- a/spec/javascripts/ide/components/new_dropdown/modal_spec.js
+++ b/spec/javascripts/ide/components/new_dropdown/modal_spec.js
@@ -15,7 +15,7 @@ describe('new file modal component', () => {
describe(type, () => {
beforeEach(() => {
const store = createStore();
- store.state.newEntryModal = {
+ store.state.entryModal = {
type,
path: '',
};
@@ -45,7 +45,7 @@ describe('new file modal component', () => {
it('$emits create', () => {
spyOn(vm, 'createTempEntry');
- vm.createEntryInStore();
+ vm.submitForm();
expect(vm.createTempEntry).toHaveBeenCalledWith({
name: 'testing',
@@ -55,4 +55,47 @@ describe('new file modal component', () => {
});
});
});
+
+ describe('rename entry', () => {
+ beforeEach(() => {
+ const store = createStore();
+ store.state.entryModal = {
+ type: 'rename',
+ path: '',
+ entry: {
+ name: 'test',
+ type: 'blob',
+ },
+ };
+
+ vm = createComponentWithStore(Component, store).$mount();
+ });
+
+ ['tree', 'blob'].forEach(type => {
+ it(`renders title and button for renaming ${type}`, done => {
+ const text = type === 'tree' ? 'folder' : 'file';
+
+ vm.$store.state.entryModal.entry.type = type;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.modal-title').textContent.trim()).toBe(`Rename ${text}`);
+ expect(vm.$el.querySelector('.btn-success').textContent.trim()).toBe(`Rename ${text}`);
+
+ done();
+ });
+ });
+ });
+
+ describe('entryName', () => {
+ it('returns entries name', () => {
+ expect(vm.entryName).toBe('test');
+ });
+
+ it('updated name', () => {
+ vm.name = 'index.js';
+
+ expect(vm.entryName).toBe('index.js');
+ });
+ });
+ });
});
diff --git a/spec/javascripts/ide/stores/actions_spec.js b/spec/javascripts/ide/stores/actions_spec.js
index 792a716565c..d84f1717a61 100644
--- a/spec/javascripts/ide/stores/actions_spec.js
+++ b/spec/javascripts/ide/stores/actions_spec.js
@@ -8,6 +8,7 @@ import actions, {
updateTempFlagForEntry,
setErrorMessage,
deleteEntry,
+ renameEntry,
} from '~/ide/stores/actions';
import store from '~/ide/stores';
import * as types from '~/ide/stores/mutation_types';
@@ -468,7 +469,61 @@ describe('Multi-file store actions', () => {
'path',
store.state,
[{ type: types.DELETE_ENTRY, payload: 'path' }],
- [{ type: 'burstUnusedSeal' }, { type: 'closeFile', payload: store.state.entries.path }],
+ [{ type: 'burstUnusedSeal' }],
+ done,
+ );
+ });
+ });
+
+ describe('renameEntry', () => {
+ it('renames entry', done => {
+ store.state.entries.test = {
+ tree: [],
+ };
+
+ testAction(
+ renameEntry,
+ { path: 'test', name: 'new-name' },
+ store.state,
+ [
+ {
+ type: types.RENAME_ENTRY,
+ payload: { path: 'test', name: 'new-name', entryPath: null },
+ },
+ ],
+ [{ type: 'deleteEntry', payload: 'test' }],
+ done,
+ );
+ });
+
+ it('renames all entries in tree', done => {
+ store.state.entries.test = {
+ type: 'tree',
+ tree: [
+ {
+ path: 'tree-1',
+ },
+ {
+ path: 'tree-2',
+ },
+ ],
+ };
+
+ testAction(
+ renameEntry,
+ { path: 'test', name: 'new-name' },
+ store.state,
+ [
+ {
+ type: types.RENAME_ENTRY,
+ payload: { path: 'test', name: 'new-name', entryPath: null },
+ },
+ ],
+ [
+ { type: 'renameEntry', payload: { path: 'test', name: 'new-name', entryPath: 'tree-1' } },
+ { type: 'renameEntry', payload: { path: 'test', name: 'new-name', entryPath: 'tree-2' } },
+ { type: 'deleteEntry', payload: 'test' },
+ ],
done,
);
});
diff --git a/spec/javascripts/ide/stores/modules/commit/actions_spec.js b/spec/javascripts/ide/stores/modules/commit/actions_spec.js
index 133ad627f34..24a7d76f30b 100644
--- a/spec/javascripts/ide/stores/modules/commit/actions_spec.js
+++ b/spec/javascripts/ide/stores/modules/commit/actions_spec.js
@@ -294,9 +294,10 @@ describe('IDE commit module actions', () => {
{
action: 'update',
file_path: jasmine.anything(),
- content: jasmine.anything(),
+ content: undefined,
encoding: jasmine.anything(),
last_commit_id: undefined,
+ previous_path: undefined,
},
],
start_branch: 'master',
@@ -320,9 +321,10 @@ describe('IDE commit module actions', () => {
{
action: 'update',
file_path: jasmine.anything(),
- content: jasmine.anything(),
+ content: undefined,
encoding: jasmine.anything(),
last_commit_id: '123456789',
+ previous_path: undefined,
},
],
start_branch: undefined,
diff --git a/spec/javascripts/ide/stores/mutations_spec.js b/spec/javascripts/ide/stores/mutations_spec.js
index 8b5f2d0bdfa..1e836dbc3f9 100644
--- a/spec/javascripts/ide/stores/mutations_spec.js
+++ b/spec/javascripts/ide/stores/mutations_spec.js
@@ -206,6 +206,7 @@ describe('Multi-file store mutations', () => {
it('adds to changedFiles', () => {
localState.entries.filePath = {
deleted: false,
+ type: 'blob',
};
mutations.DELETE_ENTRY(localState, 'filePath');
@@ -213,4 +214,103 @@ describe('Multi-file store mutations', () => {
expect(localState.changedFiles).toEqual([localState.entries.filePath]);
});
});
+
+ describe('UPDATE_FILE_AFTER_COMMIT', () => {
+ it('updates URLs if prevPath is set', () => {
+ const f = {
+ ...file(),
+ path: 'test',
+ prevPath: 'testing-123',
+ rawPath: `${gl.TEST_HOST}/testing-123`,
+ permalink: `${gl.TEST_HOST}/testing-123`,
+ commitsPath: `${gl.TEST_HOST}/testing-123`,
+ blamePath: `${gl.TEST_HOST}/testing-123`,
+ };
+ localState.entries.test = f;
+ localState.changedFiles.push(f);
+
+ mutations.UPDATE_FILE_AFTER_COMMIT(localState, { file: f, lastCommit: { commit: {} } });
+
+ expect(f.rawPath).toBe(`${gl.TEST_HOST}/test`);
+ expect(f.permalink).toBe(`${gl.TEST_HOST}/test`);
+ expect(f.commitsPath).toBe(`${gl.TEST_HOST}/test`);
+ expect(f.blamePath).toBe(`${gl.TEST_HOST}/test`);
+ });
+ });
+
+ describe('OPEN_NEW_ENTRY_MODAL', () => {
+ it('sets entryModal', () => {
+ localState.entries.testPath = {
+ ...file(),
+ };
+
+ mutations.OPEN_NEW_ENTRY_MODAL(localState, { type: 'test', path: 'testPath' });
+
+ expect(localState.entryModal).toEqual({
+ type: 'test',
+ path: 'testPath',
+ entry: localState.entries.testPath,
+ });
+ });
+ });
+
+ describe('RENAME_ENTRY', () => {
+ beforeEach(() => {
+ localState.trees = {
+ 'gitlab-ce/master': { tree: [] },
+ };
+ localState.currentProjectId = 'gitlab-ce';
+ localState.currentBranchId = 'master';
+ localState.entries.oldPath = {
+ ...file(),
+ type: 'blob',
+ name: 'oldPath',
+ path: 'oldPath',
+ url: `${gl.TEST_HOST}/oldPath`,
+ };
+ });
+
+ it('creates new renamed entry', () => {
+ mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+
+ expect(localState.entries.newPath).toEqual({
+ ...localState.entries.oldPath,
+ id: 'newPath',
+ name: 'newPath',
+ key: 'newPath-blob-name',
+ path: 'newPath',
+ tempFile: true,
+ prevPath: 'oldPath',
+ tree: [],
+ parentPath: '',
+ url: `${gl.TEST_HOST}/newPath`,
+ moved: jasmine.anything(),
+ movedPath: jasmine.anything(),
+ });
+ });
+
+ it('adds new entry to changedFiles', () => {
+ mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+
+ expect(localState.changedFiles.length).toBe(1);
+ expect(localState.changedFiles[0].path).toBe('newPath');
+ });
+
+ it('sets oldEntry as moved', () => {
+ mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+
+ expect(localState.entries.oldPath.moved).toBe(true);
+ });
+
+ it('adds to parents tree', () => {
+ localState.entries.oldPath.parentPath = 'parentPath';
+ localState.entries.parentPath = {
+ ...file(),
+ };
+
+ mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+
+ expect(localState.entries.parentPath.tree.length).toBe(1);
+ });
+ });
});
diff --git a/spec/javascripts/ide/stores/utils_spec.js b/spec/javascripts/ide/stores/utils_spec.js
index 89db50b8874..9f18034f8a3 100644
--- a/spec/javascripts/ide/stores/utils_spec.js
+++ b/spec/javascripts/ide/stores/utils_spec.js
@@ -112,6 +112,7 @@ describe('Multi-file store utils', () => {
content: 'updated file content',
encoding: 'text',
last_commit_id: '123456789',
+ previous_path: undefined,
},
{
action: 'create',
@@ -119,13 +120,15 @@ describe('Multi-file store utils', () => {
content: 'new file content',
encoding: 'base64',
last_commit_id: '123456789',
+ previous_path: undefined,
},
{
action: 'delete',
file_path: 'deletedFile',
- content: '',
+ content: undefined,
encoding: 'text',
last_commit_id: undefined,
+ previous_path: undefined,
},
],
start_branch: undefined,
@@ -172,6 +175,7 @@ describe('Multi-file store utils', () => {
content: 'updated file content',
encoding: 'text',
last_commit_id: '123456789',
+ previous_path: undefined,
},
{
action: 'create',
@@ -179,6 +183,7 @@ describe('Multi-file store utils', () => {
content: 'new file content',
encoding: 'base64',
last_commit_id: '123456789',
+ previous_path: undefined,
},
],
start_branch: undefined,
@@ -195,13 +200,17 @@ describe('Multi-file store utils', () => {
expect(utils.commitActionForFile({ tempFile: true })).toBe('create');
});
+ it('returns move for moved file', () => {
+ expect(utils.commitActionForFile({ prevPath: 'test' })).toBe('move');
+ });
+
it('returns update by default', () => {
expect(utils.commitActionForFile({})).toBe('update');
});
});
describe('getCommitFiles', () => {
- it('returns flattened list of files and folders', () => {
+ it('returns list of files excluding moved files', () => {
const files = [
{
path: 'a',
@@ -209,19 +218,9 @@ describe('Multi-file store utils', () => {
deleted: true,
},
{
- path: 'b',
- type: 'tree',
- deleted: true,
- tree: [
- {
- path: 'c',
- type: 'blob',
- },
- {
- path: 'd',
- type: 'blob',
- },
- ],
+ path: 'c',
+ type: 'blob',
+ moved: true,
},
];
@@ -233,16 +232,6 @@ describe('Multi-file store utils', () => {
type: 'blob',
deleted: true,
},
- {
- path: 'c',
- type: 'blob',
- deleted: true,
- },
- {
- path: 'd',
- type: 'blob',
- deleted: true,
- },
]);
});
});
diff --git a/spec/javascripts/notes/components/discussion_counter_spec.js b/spec/javascripts/notes/components/discussion_counter_spec.js
index a3869cc6498..d09bc5037ef 100644
--- a/spec/javascripts/notes/components/discussion_counter_spec.js
+++ b/spec/javascripts/notes/components/discussion_counter_spec.js
@@ -46,7 +46,7 @@ describe('DiscussionCounter component', () => {
discussions,
});
setFixtures(`
- <div data-discussion-id="${firstDiscussionId}"></div>
+ <div class="discussion" data-discussion-id="${firstDiscussionId}"></div>
`);
vm.jumpToFirstUnresolvedDiscussion();
diff --git a/spec/javascripts/notes/components/noteable_discussion_spec.js b/spec/javascripts/notes/components/noteable_discussion_spec.js
index 7da931fd9cb..2a01bd85520 100644
--- a/spec/javascripts/notes/components/noteable_discussion_spec.js
+++ b/spec/javascripts/notes/components/noteable_discussion_spec.js
@@ -14,6 +14,7 @@ describe('noteable_discussion component', () => {
preloadFixtures(discussionWithTwoUnresolvedNotes);
beforeEach(() => {
+ window.mrTabs = {};
store = createStore();
store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock);
@@ -46,10 +47,15 @@ describe('noteable_discussion component', () => {
it('should toggle reply form', done => {
vm.$el.querySelector('.js-vue-discussion-reply').click();
+
Vue.nextTick(() => {
- expect(vm.$refs.noteForm).not.toBeNull();
expect(vm.isReplying).toEqual(true);
- done();
+
+ // There is a watcher for `isReplying` which will init autosave in the next tick
+ Vue.nextTick(() => {
+ expect(vm.$refs.noteForm).not.toBeNull();
+ done();
+ });
});
});
@@ -101,33 +107,29 @@ describe('noteable_discussion component', () => {
describe('methods', () => {
describe('jumpToNextDiscussion', () => {
- it('expands next unresolved discussion', () => {
- spyOn(vm, 'expandDiscussion').and.stub();
- const discussions = [
- discussionMock,
- {
- ...discussionMock,
- id: discussionMock.id + 1,
- notes: [{ ...discussionMock.notes[0], resolvable: true, resolved: true }],
- },
- {
- ...discussionMock,
- id: discussionMock.id + 2,
- notes: [{ ...discussionMock.notes[0], resolvable: true, resolved: false }],
- },
- ];
- const nextDiscussionId = discussionMock.id + 2;
- store.replaceState({
- ...store.state,
- discussions,
- });
- setFixtures(`
- <div data-discussion-id="${nextDiscussionId}"></div>
- `);
+ it('expands next unresolved discussion', done => {
+ const discussion2 = getJSONFixture(discussionWithTwoUnresolvedNotes)[0];
+ discussion2.resolved = false;
+ discussion2.id = 'next'; // prepare this for being identified as next one (to be jumped to)
+ vm.$store.dispatch('setInitialNotes', [discussionMock, discussion2]);
+ window.mrTabs.currentAction = 'show';
+
+ Vue.nextTick()
+ .then(() => {
+ spyOn(vm, 'expandDiscussion').and.stub();
+
+ const nextDiscussionId = discussion2.id;
+
+ setFixtures(`
+ <div class="discussion" data-discussion-id="${nextDiscussionId}"></div>
+ `);
- vm.jumpToNextDiscussion();
+ vm.jumpToNextDiscussion();
- expect(vm.expandDiscussion).toHaveBeenCalledWith({ discussionId: nextDiscussionId });
+ expect(vm.expandDiscussion).toHaveBeenCalledWith({ discussionId: nextDiscussionId });
+ })
+ .then(done)
+ .catch(done.fail);
});
});
});
diff --git a/spec/javascripts/notes/mock_data.js b/spec/javascripts/notes/mock_data.js
index be2a8ba67fe..67f6a9629d9 100644
--- a/spec/javascripts/notes/mock_data.js
+++ b/spec/javascripts/notes/mock_data.js
@@ -1168,3 +1168,87 @@ export const collapsedSystemNotes = [
diff_discussion: false,
},
];
+
+export const discussion1 = {
+ id: 'abc1',
+ resolvable: true,
+ resolved: false,
+ diff_file: {
+ file_path: 'about.md',
+ },
+ position: {
+ formatter: {
+ new_line: 50,
+ old_line: null,
+ },
+ },
+ notes: [
+ {
+ created_at: '2018-07-04T16:25:41.749Z',
+ },
+ ],
+};
+
+export const resolvedDiscussion1 = {
+ id: 'abc1',
+ resolvable: true,
+ resolved: true,
+ diff_file: {
+ file_path: 'about.md',
+ },
+ position: {
+ formatter: {
+ new_line: 50,
+ old_line: null,
+ },
+ },
+ notes: [
+ {
+ created_at: '2018-07-04T16:25:41.749Z',
+ },
+ ],
+};
+
+export const discussion2 = {
+ id: 'abc2',
+ resolvable: true,
+ resolved: false,
+ diff_file: {
+ file_path: 'README.md',
+ },
+ position: {
+ formatter: {
+ new_line: null,
+ old_line: 20,
+ },
+ },
+ notes: [
+ {
+ created_at: '2018-07-04T12:05:41.749Z',
+ },
+ ],
+};
+
+export const discussion3 = {
+ id: 'abc3',
+ resolvable: true,
+ resolved: false,
+ diff_file: {
+ file_path: 'README.md',
+ },
+ position: {
+ formatter: {
+ new_line: 21,
+ old_line: null,
+ },
+ },
+ notes: [
+ {
+ created_at: '2018-07-05T17:25:41.749Z',
+ },
+ ],
+};
+
+export const unresolvableDiscussion = {
+ resolvable: false,
+};
diff --git a/spec/javascripts/notes/stores/getters_spec.js b/spec/javascripts/notes/stores/getters_spec.js
index 41599e00122..7f8ede51508 100644
--- a/spec/javascripts/notes/stores/getters_spec.js
+++ b/spec/javascripts/notes/stores/getters_spec.js
@@ -5,6 +5,11 @@ import {
noteableDataMock,
individualNote,
collapseNotesMock,
+ discussion1,
+ discussion2,
+ discussion3,
+ resolvedDiscussion1,
+ unresolvableDiscussion,
} from '../mock_data';
const discussionWithTwoUnresolvedNotes = 'merge_requests/resolved_diff_discussion.json';
@@ -109,4 +114,154 @@ describe('Getters Notes Store', () => {
expect(getters.isNotesFetched(state)).toBeFalsy();
});
});
+
+ describe('allResolvableDiscussions', () => {
+ it('should return only resolvable discussions in same order', () => {
+ const localGetters = {
+ allDiscussions: [
+ discussion3,
+ unresolvableDiscussion,
+ discussion1,
+ unresolvableDiscussion,
+ discussion2,
+ ],
+ };
+
+ expect(getters.allResolvableDiscussions(state, localGetters)).toEqual([
+ discussion3,
+ discussion1,
+ discussion2,
+ ]);
+ });
+
+ it('should return empty array if there are no resolvable discussions', () => {
+ const localGetters = {
+ allDiscussions: [unresolvableDiscussion, unresolvableDiscussion],
+ };
+
+ expect(getters.allResolvableDiscussions(state, localGetters)).toEqual([]);
+ });
+ });
+
+ describe('unresolvedDiscussionsIdsByDiff', () => {
+ it('should return all discussions IDs in diff order', () => {
+ const localGetters = {
+ allResolvableDiscussions: [discussion3, discussion1, discussion2],
+ };
+
+ expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters)).toEqual([
+ 'abc1',
+ 'abc2',
+ 'abc3',
+ ]);
+ });
+
+ it('should return empty array if all discussions have been resolved', () => {
+ const localGetters = {
+ allResolvableDiscussions: [resolvedDiscussion1],
+ };
+
+ expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters)).toEqual([]);
+ });
+ });
+
+ describe('unresolvedDiscussionsIdsByDate', () => {
+ it('should return all discussions in date ascending order', () => {
+ const localGetters = {
+ allResolvableDiscussions: [discussion3, discussion1, discussion2],
+ };
+
+ expect(getters.unresolvedDiscussionsIdsByDate(state, localGetters)).toEqual([
+ 'abc2',
+ 'abc1',
+ 'abc3',
+ ]);
+ });
+
+ it('should return empty array if all discussions have been resolved', () => {
+ const localGetters = {
+ allResolvableDiscussions: [resolvedDiscussion1],
+ };
+
+ expect(getters.unresolvedDiscussionsIdsByDate(state, localGetters)).toEqual([]);
+ });
+ });
+
+ describe('unresolvedDiscussionsIdsOrdered', () => {
+ const localGetters = {
+ unresolvedDiscussionsIdsByDate: ['123', '456'],
+ unresolvedDiscussionsIdsByDiff: ['abc', 'def'],
+ };
+
+ it('should return IDs ordered by diff when diffOrder param is true', () => {
+ expect(getters.unresolvedDiscussionsIdsOrdered(state, localGetters)(true)).toEqual([
+ 'abc',
+ 'def',
+ ]);
+ });
+
+ it('should return IDs ordered by date when diffOrder param is not true', () => {
+ expect(getters.unresolvedDiscussionsIdsOrdered(state, localGetters)(false)).toEqual([
+ '123',
+ '456',
+ ]);
+ expect(getters.unresolvedDiscussionsIdsOrdered(state, localGetters)(undefined)).toEqual([
+ '123',
+ '456',
+ ]);
+ });
+ });
+
+ describe('isLastUnresolvedDiscussion', () => {
+ const localGetters = {
+ unresolvedDiscussionsIdsOrdered: () => ['123', '456', '789'],
+ };
+
+ it('should return true if the discussion id provided is the last', () => {
+ expect(getters.isLastUnresolvedDiscussion(state, localGetters)('789')).toBe(true);
+ });
+
+ it('should return false if the discussion id provided is not the last', () => {
+ expect(getters.isLastUnresolvedDiscussion(state, localGetters)('123')).toBe(false);
+ expect(getters.isLastUnresolvedDiscussion(state, localGetters)('456')).toBe(false);
+ });
+ });
+
+ describe('nextUnresolvedDiscussionId', () => {
+ const localGetters = {
+ unresolvedDiscussionsIdsOrdered: () => ['123', '456', '789'],
+ };
+
+ it('should return the ID of the discussion after the ID provided', () => {
+ expect(getters.nextUnresolvedDiscussionId(state, localGetters)('123')).toBe('456');
+ expect(getters.nextUnresolvedDiscussionId(state, localGetters)('456')).toBe('789');
+ expect(getters.nextUnresolvedDiscussionId(state, localGetters)('789')).toBe(undefined);
+ });
+ });
+
+ describe('firstUnresolvedDiscussionId', () => {
+ const localGetters = {
+ unresolvedDiscussionsIdsByDate: ['123', '456'],
+ unresolvedDiscussionsIdsByDiff: ['abc', 'def'],
+ };
+
+ it('should return the first discussion id by diff when diffOrder param is true', () => {
+ expect(getters.firstUnresolvedDiscussionId(state, localGetters)(true)).toBe('abc');
+ });
+
+ it('should return the first discussion id by date when diffOrder param is not true', () => {
+ expect(getters.firstUnresolvedDiscussionId(state, localGetters)(false)).toBe('123');
+ expect(getters.firstUnresolvedDiscussionId(state, localGetters)(undefined)).toBe('123');
+ });
+
+ it('should be falsy if all discussions are resolved', () => {
+ const localGettersFalsy = {
+ unresolvedDiscussionsIdsByDiff: [],
+ unresolvedDiscussionsIdsByDate: [],
+ };
+
+ expect(getters.firstUnresolvedDiscussionId(state, localGettersFalsy)(true)).toBeFalsy();
+ expect(getters.firstUnresolvedDiscussionId(state, localGettersFalsy)(false)).toBeFalsy();
+ });
+ });
});
diff --git a/spec/javascripts/pipelines/pipeline_url_spec.js b/spec/javascripts/pipelines/pipeline_url_spec.js
index 4a4f2259d23..ddd580ae8b7 100644
--- a/spec/javascripts/pipelines/pipeline_url_spec.js
+++ b/spec/javascripts/pipelines/pipeline_url_spec.js
@@ -35,7 +35,9 @@ describe('Pipeline Url Component', () => {
},
}).$mount();
- expect(component.$el.querySelector('.js-pipeline-url-link').getAttribute('href')).toEqual('foo');
+ expect(component.$el.querySelector('.js-pipeline-url-link').getAttribute('href')).toEqual(
+ 'foo',
+ );
expect(component.$el.querySelector('.js-pipeline-url-link span').textContent).toEqual('#1');
});
@@ -61,11 +63,11 @@ describe('Pipeline Url Component', () => {
const image = component.$el.querySelector('.js-pipeline-url-user img');
- expect(
- component.$el.querySelector('.js-pipeline-url-user').getAttribute('href'),
- ).toEqual(mockData.pipeline.user.web_url);
+ expect(component.$el.querySelector('.js-pipeline-url-user').getAttribute('href')).toEqual(
+ mockData.pipeline.user.web_url,
+ );
expect(image.getAttribute('data-original-title')).toEqual(mockData.pipeline.user.name);
- expect(image.getAttribute('src')).toEqual(mockData.pipeline.user.avatar_url);
+ expect(image.getAttribute('src')).toEqual(`${mockData.pipeline.user.avatar_url}?width=20`);
});
it('should render "API" when no user is provided', () => {
@@ -100,7 +102,9 @@ describe('Pipeline Url Component', () => {
}).$mount();
expect(component.$el.querySelector('.js-pipeline-url-latest').textContent).toContain('latest');
- expect(component.$el.querySelector('.js-pipeline-url-yaml').textContent).toContain('yaml invalid');
+ expect(component.$el.querySelector('.js-pipeline-url-yaml').textContent).toContain(
+ 'yaml invalid',
+ );
expect(component.$el.querySelector('.js-pipeline-url-stuck').textContent).toContain('stuck');
});
@@ -121,9 +125,9 @@ describe('Pipeline Url Component', () => {
},
}).$mount();
- expect(
- component.$el.querySelector('.js-pipeline-url-autodevops').textContent.trim(),
- ).toEqual('Auto DevOps');
+ expect(component.$el.querySelector('.js-pipeline-url-autodevops').textContent.trim()).toEqual(
+ 'Auto DevOps',
+ );
});
it('should render error badge when pipeline has a failure reason set', () => {
@@ -142,6 +146,8 @@ describe('Pipeline Url Component', () => {
}).$mount();
expect(component.$el.querySelector('.js-pipeline-url-failure').textContent).toContain('error');
- expect(component.$el.querySelector('.js-pipeline-url-failure').getAttribute('data-original-title')).toContain('some reason');
+ expect(
+ component.$el.querySelector('.js-pipeline-url-failure').getAttribute('data-original-title'),
+ ).toContain('some reason');
});
});
diff --git a/spec/javascripts/reports/components/grouped_test_reports_app_spec.js b/spec/javascripts/reports/components/grouped_test_reports_app_spec.js
new file mode 100644
index 00000000000..d86e565036c
--- /dev/null
+++ b/spec/javascripts/reports/components/grouped_test_reports_app_spec.js
@@ -0,0 +1,163 @@
+import Vue from 'vue';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import state from '~/reports/store/state';
+import component from '~/reports/components/grouped_test_reports_app.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+import newFailedTestReports from '../mock_data/new_failures_report.json';
+import successTestReports from '../mock_data/no_failures_report.json';
+import mixedResultsTestReports from '../mock_data/new_and_fixed_failures_report.json';
+
+describe('Grouped Test Reports App', () => {
+ let vm;
+ let mock;
+ const Component = Vue.extend(component);
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ vm.$store.replaceState(state());
+ vm.$destroy();
+ mock.restore();
+ });
+
+ describe('with success result', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(200, successTestReports, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders success summary text', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.fa-spinner')).toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary contained no changed test results out of 11 total tests',
+ );
+
+ expect(vm.$el.textContent).toContain(
+ 'rspec:pg found no changed test results out of 8 total tests',
+ );
+ expect(vm.$el.textContent).toContain(
+ 'java ant found no changed test results out of 3 total tests',
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('with 204 result', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(204, {}, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders success summary text', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.fa-spinner')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary results are being parsed',
+ );
+
+ done();
+ }, 0);
+ });
+ });
+
+ describe('with new failed result', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(200, newFailedTestReports, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders failed summary text + new badge', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.fa-spinner')).toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary contained 2 failed test results out of 11 total tests',
+ );
+
+ expect(vm.$el.textContent).toContain(
+ 'rspec:pg found 2 failed test results out of 8 total tests',
+ );
+ expect(vm.$el.textContent).toContain('New');
+ expect(vm.$el.textContent).toContain(
+ 'java ant found no changed test results out of 3 total tests',
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('with mixed results', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(200, mixedResultsTestReports, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders summary text', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.fa-spinner')).toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary contained 2 failed test results and 2 fixed test results out of 11 total tests',
+ );
+
+ expect(vm.$el.textContent).toContain(
+ 'rspec:pg found 1 failed test result and 2 fixed test results out of 8 total tests',
+ );
+ expect(vm.$el.textContent).toContain('New');
+ expect(vm.$el.textContent).toContain(
+ ' java ant found 1 failed test result out of 3 total tests',
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('with error', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(500, {}, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders loading summary text with loading icon', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary failed loading results',
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('while loading', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(200, {}, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders loading summary text with loading icon', done => {
+ expect(vm.$el.querySelector('.fa-spinner')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary results are being parsed',
+ );
+
+ setTimeout(() => {
+ done();
+ }, 0);
+ });
+ });
+});
diff --git a/spec/javascripts/reports/components/modal_spec.js b/spec/javascripts/reports/components/modal_spec.js
new file mode 100644
index 00000000000..3a567c40eca
--- /dev/null
+++ b/spec/javascripts/reports/components/modal_spec.js
@@ -0,0 +1,45 @@
+import Vue from 'vue';
+import component from '~/reports/components/modal.vue';
+import state from '~/reports/store/state';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+import { trimText } from '../../helpers/vue_component_helper';
+
+describe('Grouped Test Reports Modal', () => {
+ const Component = Vue.extend(component);
+ const modalDataStructure = state().modal.data;
+
+ // populate data
+ modalDataStructure.execution_time.value = 0.009411;
+ modalDataStructure.system_output.value = 'Failure/Error: is_expected.to eq(3)\n\n';
+ modalDataStructure.class.value = 'link';
+
+ let vm;
+
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ title: 'Test#sum when a is 1 and b is 2 returns summary',
+ modalData: modalDataStructure,
+ });
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders code block', () => {
+ expect(vm.$el.querySelector('code').textContent).toEqual(modalDataStructure.system_output.value);
+ });
+
+ it('renders link', () => {
+ expect(vm.$el.querySelector('.js-modal-link').getAttribute('href')).toEqual(modalDataStructure.class.value);
+ expect(trimText(vm.$el.querySelector('.js-modal-link').textContent)).toEqual(modalDataStructure.class.value);
+ });
+
+ it('renders miliseconds', () => {
+ expect(vm.$el.textContent).toContain(`${modalDataStructure.execution_time.value} ms`);
+ });
+
+ it('render title', () => {
+ expect(trimText(vm.$el.querySelector('.modal-title').textContent)).toEqual('Test#sum when a is 1 and b is 2 returns summary');
+ });
+});
diff --git a/spec/javascripts/reports/components/test_issue_body_spec.js b/spec/javascripts/reports/components/test_issue_body_spec.js
new file mode 100644
index 00000000000..0ea81f714e7
--- /dev/null
+++ b/spec/javascripts/reports/components/test_issue_body_spec.js
@@ -0,0 +1,71 @@
+import Vue from 'vue';
+import component from '~/reports/components/test_issue_body.vue';
+import createStore from '~/reports/store';
+import { mountComponentWithStore } from '../../helpers/vue_mount_component_helper';
+import { trimText } from '../../helpers/vue_component_helper';
+import { issue } from '../mock_data/mock_data';
+
+describe('Test Issue body', () => {
+ let vm;
+ const Component = Vue.extend(component);
+ const store = createStore();
+
+ const commonProps = {
+ issue,
+ status: 'failed',
+ };
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('on click', () => {
+ it('calls openModal action', () => {
+ vm = mountComponentWithStore(Component, {
+ store,
+ props: commonProps,
+ });
+
+ spyOn(vm, 'openModal');
+
+ vm.$el.querySelector('button').click();
+ expect(vm.openModal).toHaveBeenCalledWith({
+ issue: commonProps.issue,
+ });
+ });
+ });
+
+ describe('is new', () => {
+ beforeEach(() => {
+ vm = mountComponentWithStore(Component, {
+ store,
+ props: Object.assign({}, commonProps, { isNew: true }),
+ });
+ });
+
+ it('renders issue name', () => {
+ expect(vm.$el.textContent).toContain(commonProps.issue.name);
+ });
+
+ it('renders new badge', () => {
+ expect(trimText(vm.$el.querySelector('.badge').textContent)).toEqual('New');
+ });
+ });
+
+ describe('not new', () => {
+ beforeEach(() => {
+ vm = mountComponentWithStore(Component, {
+ store,
+ props: commonProps,
+ });
+ });
+
+ it('renders issue name', () => {
+ expect(vm.$el.textContent).toContain(commonProps.issue.name);
+ });
+
+ it('does not renders new badge', () => {
+ expect(vm.$el.querySelector('.badge')).toEqual(null);
+ });
+ });
+});
diff --git a/spec/javascripts/reports/mock_data/mock_data.js b/spec/javascripts/reports/mock_data/mock_data.js
new file mode 100644
index 00000000000..0d90253bad2
--- /dev/null
+++ b/spec/javascripts/reports/mock_data/mock_data.js
@@ -0,0 +1,8 @@
+// eslint-disable-next-line import/prefer-default-export
+export const issue = {
+ result: 'failure',
+ name: 'Test#sum when a is 1 and b is 2 returns summary',
+ execution_time: 0.009411,
+ system_output:
+ "Failure/Error: is_expected.to eq(3)\n\n expected: 3\n got: -1\n\n (compared using ==)\n./spec/test_spec.rb:12:in `block (4 levels) in \u003ctop (required)\u003e'",
+};
diff --git a/spec/javascripts/reports/mock_data/new_and_fixed_failures_report.json b/spec/javascripts/reports/mock_data/new_and_fixed_failures_report.json
new file mode 100644
index 00000000000..ceaf894375a
--- /dev/null
+++ b/spec/javascripts/reports/mock_data/new_and_fixed_failures_report.json
@@ -0,0 +1 @@
+{"status":"failed","summary":{"total":11,"resolved":2,"failed":2},"suites":[{"name":"rspec:pg","status":"failed","summary":{"total":8,"resolved":2,"failed":1},"new_failures":[{"status":"failed","name":"Test#subtract when a is 2 and b is 1 returns correct result","execution_time":0.00908,"system_output":"Failure/Error: is_expected.to eq(1)\n\n expected: 1\n got: 3\n\n (compared using ==)\n./spec/test_spec.rb:43:in `block (4 levels) in <top (required)>'"}],"resolved_failures":[{"status":"success","name":"Test#sum when a is 1 and b is 2 returns summary","execution_time":0.000318,"system_output":null},{"status":"success","name":"Test#sum when a is 100 and b is 200 returns summary","execution_time":0.000074,"system_output":null}],"existing_failures":[]},{"name":"java ant","status":"failed","summary":{"total":3,"resolved":0,"failed":1},"new_failures":[],"resolved_failures":[],"existing_failures":[{"status":"failed","name":"sumTest","execution_time":0.004,"system_output":"junit.framework.AssertionFailedError: expected:<3> but was:<-1>\n\tat CalculatorTest.sumTest(Unknown Source)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"}]}]} \ No newline at end of file
diff --git a/spec/javascripts/reports/mock_data/new_failures_report.json b/spec/javascripts/reports/mock_data/new_failures_report.json
new file mode 100644
index 00000000000..930efe16f65
--- /dev/null
+++ b/spec/javascripts/reports/mock_data/new_failures_report.json
@@ -0,0 +1 @@
+{"summary":{"total":11,"resolved":0,"failed":2},"suites":[{"name":"rspec:pg","summary":{"total":8,"resolved":0,"failed":2},"new_failures":[{"result":"failure","name":"Test#sum when a is 1 and b is 2 returns summary","execution_time":0.009411,"system_output":"Failure/Error: is_expected.to eq(3)\n\n expected: 3\n got: -1\n\n (compared using ==)\n./spec/test_spec.rb:12:in `block (4 levels) in <top (required)>'"},{"result":"failure","name":"Test#sum when a is 100 and b is 200 returns summary","execution_time":0.000162,"system_output":"Failure/Error: is_expected.to eq(300)\n\n expected: 300\n got: -100\n\n (compared using ==)\n./spec/test_spec.rb:21:in `block (4 levels) in <top (required)>'"}],"resolved_failures":[],"existing_failures":[]},{"name":"java ant","summary":{"total":3,"resolved":0,"failed":0},"new_failures":[],"resolved_failures":[],"existing_failures":[]}]} \ No newline at end of file
diff --git a/spec/javascripts/reports/mock_data/no_failures_report.json b/spec/javascripts/reports/mock_data/no_failures_report.json
new file mode 100644
index 00000000000..6c0675ff7dc
--- /dev/null
+++ b/spec/javascripts/reports/mock_data/no_failures_report.json
@@ -0,0 +1 @@
+{"status":"success","summary":{"total":11,"resolved":0,"failed":0},"suites":[{"name":"rspec:pg","status":"success","summary":{"total":8,"resolved":0,"failed":0},"new_failures":[],"resolved_failures":[],"existing_failures":[]},{"name":"java ant","status":"success","summary":{"total":3,"resolved":0,"failed":0},"new_failures":[],"resolved_failures":[],"existing_failures":[]}]} \ No newline at end of file
diff --git a/spec/javascripts/reports/store/actions_spec.js b/spec/javascripts/reports/store/actions_spec.js
index c714c5af156..41137b50847 100644
--- a/spec/javascripts/reports/store/actions_spec.js
+++ b/spec/javascripts/reports/store/actions_spec.js
@@ -8,6 +8,8 @@ import {
clearEtagPoll,
receiveReportsSuccess,
receiveReportsError,
+ openModal,
+ setModalData,
} from '~/reports/store/actions';
import state from '~/reports/store/state';
import * as types from '~/reports/store/mutation_types';
@@ -56,7 +58,9 @@ describe('Reports Store Actions', () => {
describe('success', () => {
it('dispatches requestReports and receiveReportsSuccess ', done => {
- mock.onGet(`${TEST_HOST}/endpoint.json`).replyOnce(200, { summary: {}, suites: [{ name: 'rspec' }] });
+ mock
+ .onGet(`${TEST_HOST}/endpoint.json`)
+ .replyOnce(200, { summary: {}, suites: [{ name: 'rspec' }] });
testAction(
fetchReports,
@@ -68,7 +72,7 @@ describe('Reports Store Actions', () => {
type: 'requestReports',
},
{
- payload: { summary: {}, suites: [{ name: 'rspec' }] },
+ payload: { data: { summary: {}, suites: [{ name: 'rspec' }] }, status: 200 },
type: 'receiveReportsSuccess',
},
],
@@ -103,16 +107,27 @@ describe('Reports Store Actions', () => {
});
describe('receiveReportsSuccess', () => {
- it('should commit RECEIVE_REPORTS_SUCCESS mutation', done => {
+ it('should commit RECEIVE_REPORTS_SUCCESS mutation with 200', done => {
testAction(
receiveReportsSuccess,
- { summary: {} },
+ { data: { summary: {} }, status: 200 },
mockedState,
[{ type: types.RECEIVE_REPORTS_SUCCESS, payload: { summary: {} } }],
[],
done,
);
});
+
+ it('should not commit RECEIVE_REPORTS_SUCCESS mutation with 204', done => {
+ testAction(
+ receiveReportsSuccess,
+ { data: { summary: {} }, status: 204 },
+ mockedState,
+ [],
+ [],
+ done,
+ );
+ });
});
describe('receiveReportsError', () => {
@@ -127,4 +142,30 @@ describe('Reports Store Actions', () => {
);
});
});
+
+ describe('openModal', () => {
+ it('should dispatch setModalData', done => {
+ testAction(
+ openModal,
+ { name: 'foo' },
+ mockedState,
+ [],
+ [{ type: 'setModalData', payload: { name: 'foo' } }],
+ done,
+ );
+ });
+ });
+
+ describe('setModalData', () => {
+ it('should commit SET_ISSUE_MODAL_DATA', done => {
+ testAction(
+ setModalData,
+ { name: 'foo' },
+ mockedState,
+ [{ type: types.SET_ISSUE_MODAL_DATA, payload: { name: 'foo' } }],
+ [],
+ done,
+ );
+ });
+ });
});
diff --git a/spec/javascripts/reports/store/mutations_spec.js b/spec/javascripts/reports/store/mutations_spec.js
index 3e0b15438c3..8f99d2675a5 100644
--- a/spec/javascripts/reports/store/mutations_spec.js
+++ b/spec/javascripts/reports/store/mutations_spec.js
@@ -1,6 +1,7 @@
import state from '~/reports/store/state';
import mutations from '~/reports/store/mutations';
import * as types from '~/reports/store/mutation_types';
+import { issue } from '../mock_data/mock_data';
describe('Reports Store Mutations', () => {
let stateCopy;
@@ -42,24 +43,21 @@ describe('Reports Store Mutations', () => {
{
name: 'StringHelper#concatenate when a is git and b is lab returns summary',
execution_time: 0.0092435,
- system_output:
- 'Failure/Error: is_expected.to eq(\'gitlab\')',
+ system_output: "Failure/Error: is_expected.to eq('gitlab')",
},
],
resolved_failures: [
{
name: 'StringHelper#concatenate when a is git and b is lab returns summary',
execution_time: 0.009235,
- system_output:
- 'Failure/Error: is_expected.to eq(\'gitlab\')',
+ system_output: "Failure/Error: is_expected.to eq('gitlab')",
},
],
existing_failures: [
{
name: 'StringHelper#concatenate when a is git and b is lab returns summary',
execution_time: 1232.08,
- system_output:
- 'Failure/Error: is_expected.to eq(\'gitlab\')',
+ system_output: "Failure/Error: is_expected.to eq('gitlab')",
},
],
},
@@ -89,6 +87,7 @@ describe('Reports Store Mutations', () => {
beforeEach(() => {
mutations[types.RECEIVE_REPORTS_ERROR](stateCopy);
});
+
it('should reset isLoading', () => {
expect(stateCopy.isLoading).toEqual(false);
});
@@ -97,5 +96,25 @@ describe('Reports Store Mutations', () => {
expect(stateCopy.hasError).toEqual(true);
});
+ it('should reset reports', () => {
+ expect(stateCopy.reports).toEqual([]);
+ });
+ });
+
+ describe('SET_ISSUE_MODAL_DATA', () => {
+ beforeEach(() => {
+ mutations[types.SET_ISSUE_MODAL_DATA](stateCopy, {
+ issue,
+ });
+ });
+
+ it('should set modal title', () => {
+ expect(stateCopy.modal.title).toEqual(issue.name);
+ });
+
+ it('should set modal data', () => {
+ expect(stateCopy.modal.data.execution_time.value).toEqual(issue.execution_time);
+ expect(stateCopy.modal.data.system_output.value).toEqual(issue.system_output);
+ });
});
});
diff --git a/spec/javascripts/reports/store/utils_spec.js b/spec/javascripts/reports/store/utils_spec.js
new file mode 100644
index 00000000000..1679d120db2
--- /dev/null
+++ b/spec/javascripts/reports/store/utils_spec.js
@@ -0,0 +1,138 @@
+import * as utils from '~/reports/store/utils';
+import {
+ STATUS_FAILED,
+ STATUS_SUCCESS,
+ ICON_WARNING,
+ ICON_SUCCESS,
+ ICON_NOTFOUND,
+} from '~/reports/constants';
+
+describe('Reports store utils', () => {
+ describe('summaryTextbuilder', () => {
+ it('should render text for no changed results in multiple tests', () => {
+ const name = 'Test summary';
+ const data = { total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe('Test summary contained no changed test results out of 10 total tests');
+ });
+
+ it('should render text for no changed results in one test', () => {
+ const name = 'Test summary';
+ const data = { total: 1 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe('Test summary contained no changed test results out of 1 total test');
+ });
+
+ it('should render text for multiple failed results', () => {
+ const name = 'Test summary';
+ const data = { failed: 3, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe('Test summary contained 3 failed test results out of 10 total tests');
+ });
+
+ it('should render text for multiple fixed results', () => {
+ const name = 'Test summary';
+ const data = { resolved: 4, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe('Test summary contained 4 fixed test results out of 10 total tests');
+ });
+
+ it('should render text for multiple fixed, and multiple failed results', () => {
+ const name = 'Test summary';
+ const data = { failed: 3, resolved: 4, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary contained 3 failed test results and 4 fixed test results out of 10 total tests',
+ );
+ });
+
+ it('should render text for a singular fixed, and a singular failed result', () => {
+ const name = 'Test summary';
+ const data = { failed: 1, resolved: 1, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary contained 1 failed test result and 1 fixed test result out of 10 total tests',
+ );
+ });
+ });
+
+ describe('reportTextBuilder', () => {
+ it('should render text for no changed results in multiple tests', () => {
+ const name = 'Rspec';
+ const data = { total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe('Rspec found no changed test results out of 10 total tests');
+ });
+
+ it('should render text for no changed results in one test', () => {
+ const name = 'Rspec';
+ const data = { total: 1 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe('Rspec found no changed test results out of 1 total test');
+ });
+
+ it('should render text for multiple failed results', () => {
+ const name = 'Rspec';
+ const data = { failed: 3, total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe('Rspec found 3 failed test results out of 10 total tests');
+ });
+
+ it('should render text for multiple fixed results', () => {
+ const name = 'Rspec';
+ const data = { resolved: 4, total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe('Rspec found 4 fixed test results out of 10 total tests');
+ });
+
+ it('should render text for multiple fixed, and multiple failed results', () => {
+ const name = 'Rspec';
+ const data = { failed: 3, resolved: 4, total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Rspec found 3 failed test results and 4 fixed test results out of 10 total tests',
+ );
+ });
+
+ it('should render text for a singular fixed, and a singular failed result', () => {
+ const name = 'Rspec';
+ const data = { failed: 1, resolved: 1, total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Rspec found 1 failed test result and 1 fixed test result out of 10 total tests',
+ );
+ });
+ });
+
+ describe('statusIcon', () => {
+ describe('with failed status', () => {
+ it('returns ICON_WARNING', () => {
+ expect(utils.statusIcon(STATUS_FAILED)).toEqual(ICON_WARNING);
+ });
+ });
+
+ describe('with success status', () => {
+ it('returns ICON_SUCCESS', () => {
+ expect(utils.statusIcon(STATUS_SUCCESS)).toEqual(ICON_SUCCESS);
+ });
+ });
+
+ describe('without a status', () => {
+ it('returns ICON_NOTFOUND', () => {
+ expect(utils.statusIcon()).toEqual(ICON_NOTFOUND);
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/code_block_spec.js b/spec/javascripts/vue_shared/components/code_block_spec.js
new file mode 100644
index 00000000000..6b91a20ff76
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/code_block_spec.js
@@ -0,0 +1,33 @@
+import Vue from 'vue';
+import component from '~/vue_shared/components/code_block.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Code Block', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders a code block with the provided code', () => {
+ const code =
+ "Failure/Error: is_expected.to eq(3)\n\n expected: 3\n got: -1\n\n (compared using ==)\n./spec/test_spec.rb:12:in `block (4 levels) in \u003ctop (required)\u003e'";
+
+ vm = mountComponent(Component, {
+ code,
+ });
+
+ expect(vm.$el.querySelector('code').textContent).toEqual(code);
+ });
+
+ it('escapes XSS injections', () => {
+ const code = 'CCC&lt;img src=x onerror=alert(document.domain)&gt;';
+
+ vm = mountComponent(Component, {
+ code,
+ });
+
+ expect(vm.$el.querySelector('code').textContent).toEqual(code);
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/gl_modal_spec.js b/spec/javascripts/vue_shared/components/gl_modal_spec.js
index e4737714312..263824a102a 100644
--- a/spec/javascripts/vue_shared/components/gl_modal_spec.js
+++ b/spec/javascripts/vue_shared/components/gl_modal_spec.js
@@ -29,7 +29,7 @@ describe('GlModal', () => {
describe('without id', () => {
beforeEach(() => {
- vm = mountComponent(modalComponent, { });
+ vm = mountComponent(modalComponent, {});
});
it('does not add an id attribute to the modal', () => {
@@ -83,7 +83,7 @@ describe('GlModal', () => {
});
});
- it('works with data-toggle="modal"', (done) => {
+ it('works with data-toggle="modal"', done => {
setFixtures(`
<button id="modal-button" data-toggle="modal" data-target="#my-modal"></button>
<div id="modal-container"></div>
@@ -91,9 +91,13 @@ describe('GlModal', () => {
const modalContainer = document.getElementById('modal-container');
const modalButton = document.getElementById('modal-button');
- vm = mountComponent(modalComponent, {
- id: 'my-modal',
- }, modalContainer);
+ vm = mountComponent(
+ modalComponent,
+ {
+ id: 'my-modal',
+ },
+ modalContainer,
+ );
$(vm.$el).on('shown.bs.modal', () => done());
modalButton.click();
@@ -103,7 +107,7 @@ describe('GlModal', () => {
const dummyEvent = 'not really an event';
beforeEach(() => {
- vm = mountComponent(modalComponent, { });
+ vm = mountComponent(modalComponent, {});
spyOn(vm, '$emit');
});
@@ -122,11 +126,27 @@ describe('GlModal', () => {
expect(vm.$emit).toHaveBeenCalledWith('submit', dummyEvent);
});
});
+
+ describe('opened', () => {
+ it('emits a open event', () => {
+ vm.opened();
+
+ expect(vm.$emit).toHaveBeenCalledWith('open');
+ });
+ });
+
+ describe('closed', () => {
+ it('emits a closed event', () => {
+ vm.closed();
+
+ expect(vm.$emit).toHaveBeenCalledWith('closed');
+ });
+ });
});
describe('slots', () => {
const slotContent = 'this should go into the slot';
- const modalWithSlot = (slotName) => {
+ const modalWithSlot = slotName => {
let template;
if (slotName) {
template = `
diff --git a/spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js b/spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js
index 7e57c51bf29..db665fdaad3 100644
--- a/spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js
+++ b/spec/javascripts/vue_shared/components/notes/placeholder_note_spec.js
@@ -27,7 +27,7 @@ describe('issue placeholder system note component', () => {
userDataMock.path,
);
expect(vm.$el.querySelector('.user-avatar-link img').getAttribute('src')).toEqual(
- userDataMock.avatar_url,
+ `${userDataMock.avatar_url}?width=40`,
);
});
});
diff --git a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js b/spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js
index 656b57d764e..dc7652c77f7 100644
--- a/spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js
+++ b/spec/javascripts/vue_shared/components/user_avatar/user_avatar_image_spec.js
@@ -12,7 +12,7 @@ const DEFAULT_PROPS = {
tooltipPlacement: 'bottom',
};
-describe('User Avatar Image Component', function () {
+describe('User Avatar Image Component', function() {
let vm;
let UserAvatarImage;
@@ -20,37 +20,37 @@ describe('User Avatar Image Component', function () {
UserAvatarImage = Vue.extend(userAvatarImage);
});
- describe('Initialization', function () {
- beforeEach(function () {
+ describe('Initialization', function() {
+ beforeEach(function() {
vm = mountComponent(UserAvatarImage, {
...DEFAULT_PROPS,
}).$mount();
});
- it('should return a defined Vue component', function () {
+ it('should return a defined Vue component', function() {
expect(vm).toBeDefined();
});
- it('should have <img> as a child element', function () {
+ it('should have <img> as a child element', function() {
expect(vm.$el.tagName).toBe('IMG');
- expect(vm.$el.getAttribute('src')).toBe(DEFAULT_PROPS.imgSrc);
- expect(vm.$el.getAttribute('data-src')).toBe(DEFAULT_PROPS.imgSrc);
+ expect(vm.$el.getAttribute('src')).toBe(`${DEFAULT_PROPS.imgSrc}?width=99`);
+ expect(vm.$el.getAttribute('data-src')).toBe(`${DEFAULT_PROPS.imgSrc}?width=99`);
expect(vm.$el.getAttribute('alt')).toBe(DEFAULT_PROPS.imgAlt);
});
- it('should properly compute tooltipContainer', function () {
+ it('should properly compute tooltipContainer', function() {
expect(vm.tooltipContainer).toBe('body');
});
- it('should properly render tooltipContainer', function () {
+ it('should properly render tooltipContainer', function() {
expect(vm.$el.getAttribute('data-container')).toBe('body');
});
- it('should properly compute avatarSizeClass', function () {
+ it('should properly compute avatarSizeClass', function() {
expect(vm.avatarSizeClass).toBe('s99');
});
- it('should properly render img css', function () {
+ it('should properly render img css', function() {
const { classList } = vm.$el;
const containsAvatar = classList.contains('avatar');
const containsSizeClass = classList.contains('s99');
@@ -64,21 +64,21 @@ describe('User Avatar Image Component', function () {
});
});
- describe('Initialization when lazy', function () {
- beforeEach(function () {
+ describe('Initialization when lazy', function() {
+ beforeEach(function() {
vm = mountComponent(UserAvatarImage, {
...DEFAULT_PROPS,
lazy: true,
}).$mount();
});
- it('should add lazy attributes', function () {
+ it('should add lazy attributes', function() {
const { classList } = vm.$el;
const lazyClass = classList.contains('lazy');
expect(lazyClass).toBe(true);
expect(vm.$el.getAttribute('src')).toBe(placeholderImage);
- expect(vm.$el.getAttribute('data-src')).toBe(DEFAULT_PROPS.imgSrc);
+ expect(vm.$el.getAttribute('data-src')).toBe(`${DEFAULT_PROPS.imgSrc}?width=99`);
});
});
});
diff --git a/spec/lib/backup/repository_spec.rb b/spec/lib/backup/repository_spec.rb
index 92a27e308d2..c5a854b5660 100644
--- a/spec/lib/backup/repository_spec.rb
+++ b/spec/lib/backup/repository_spec.rb
@@ -73,37 +73,27 @@ describe Backup::Repository do
end
end
- describe '#delete_all_repositories', :seed_helper do
- shared_examples('delete_all_repositories') do
- before do
- allow(FileUtils).to receive(:mkdir_p).and_call_original
- allow(FileUtils).to receive(:mv).and_call_original
- end
-
- after(:all) do
- ensure_seeds
- end
-
- it 'removes all repositories' do
- # Sanity check: there should be something for us to delete
- expect(list_repositories).to include(File.join(SEED_STORAGE_PATH, TEST_REPO_PATH))
+ describe '#prepare_directories', :seed_helper do
+ before do
+ allow(FileUtils).to receive(:mkdir_p).and_call_original
+ allow(FileUtils).to receive(:mv).and_call_original
+ end
- subject.delete_all_repositories('default', Gitlab.config.repositories.storages['default'])
+ after(:all) do
+ ensure_seeds
+ end
- expect(list_repositories).to be_empty
- end
+ it' removes all repositories' do
+ # Sanity check: there should be something for us to delete
+ expect(list_repositories).to include(File.join(SEED_STORAGE_PATH, TEST_REPO_PATH))
- def list_repositories
- Dir[File.join(SEED_STORAGE_PATH, '*.git')]
- end
- end
+ subject.prepare_directories
- context 'with gitaly' do
- it_behaves_like 'delete_all_repositories'
+ expect(list_repositories).to be_empty
end
- context 'without gitaly', :skip_gitaly_mock do
- it_behaves_like 'delete_all_repositories'
+ def list_repositories
+ Dir[File.join(SEED_STORAGE_PATH, '*.git')]
end
end
diff --git a/spec/lib/bitbucket_server/client_spec.rb b/spec/lib/bitbucket_server/client_spec.rb
new file mode 100644
index 00000000000..f926ae963a4
--- /dev/null
+++ b/spec/lib/bitbucket_server/client_spec.rb
@@ -0,0 +1,88 @@
+require 'spec_helper'
+
+describe BitbucketServer::Client do
+ let(:base_uri) { 'https://test:7990/stash/' }
+ let(:options) { { base_uri: base_uri, user: 'bitbucket', password: 'mypassword' } }
+ let(:project) { 'SOME-PROJECT' }
+ let(:repo_slug) { 'my-repo' }
+ let(:headers) { { "Content-Type" => "application/json" } }
+
+ subject { described_class.new(options) }
+
+ describe '#pull_requests' do
+ let(:path) { "/projects/#{project}/repos/#{repo_slug}/pull-requests?state=ALL" }
+
+ it 'requests a collection' do
+ expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :pull_request)
+
+ subject.pull_requests(project, repo_slug)
+ end
+
+ it 'throws an exception when connection fails' do
+ allow(BitbucketServer::Collection).to receive(:new).and_raise(OpenSSL::SSL::SSLError)
+
+ expect { subject.pull_requests(project, repo_slug) }.to raise_error(described_class::ServerError)
+ end
+ end
+
+ describe '#activities' do
+ let(:path) { "/projects/#{project}/repos/#{repo_slug}/pull-requests/1/activities" }
+
+ it 'requests a collection' do
+ expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :activity)
+
+ subject.activities(project, repo_slug, 1)
+ end
+ end
+
+ describe '#repo' do
+ let(:path) { "/projects/#{project}/repos/#{repo_slug}" }
+ let(:url) { "#{base_uri}rest/api/1.0/projects/SOME-PROJECT/repos/my-repo" }
+
+ it 'requests a specific repository' do
+ stub_request(:get, url).to_return(status: 200, headers: headers, body: '{}')
+
+ subject.repo(project, repo_slug)
+
+ expect(WebMock).to have_requested(:get, url)
+ end
+ end
+
+ describe '#repos' do
+ let(:path) { "/repos" }
+
+ it 'requests a collection' do
+ expect(BitbucketServer::Paginator).to receive(:new).with(anything, path, :repo)
+
+ subject.repos
+ end
+ end
+
+ describe '#create_branch' do
+ let(:branch) { 'test-branch' }
+ let(:sha) { '12345678' }
+ let(:url) { "#{base_uri}rest/api/1.0/projects/SOME-PROJECT/repos/my-repo/branches" }
+
+ it 'requests Bitbucket to create a branch' do
+ stub_request(:post, url).to_return(status: 204, headers: headers, body: '{}')
+
+ subject.create_branch(project, repo_slug, branch, sha)
+
+ expect(WebMock).to have_requested(:post, url)
+ end
+ end
+
+ describe '#delete_branch' do
+ let(:branch) { 'test-branch' }
+ let(:sha) { '12345678' }
+ let(:url) { "#{base_uri}rest/branch-utils/1.0/projects/SOME-PROJECT/repos/my-repo/branches" }
+
+ it 'requests Bitbucket to create a branch' do
+ stub_request(:delete, url).to_return(status: 204, headers: headers, body: '{}')
+
+ subject.delete_branch(project, repo_slug, branch, sha)
+
+ expect(WebMock).to have_requested(:delete, url)
+ end
+ end
+end
diff --git a/spec/lib/bitbucket_server/connection_spec.rb b/spec/lib/bitbucket_server/connection_spec.rb
new file mode 100644
index 00000000000..b5da4cb1a49
--- /dev/null
+++ b/spec/lib/bitbucket_server/connection_spec.rb
@@ -0,0 +1,68 @@
+require 'spec_helper'
+
+describe BitbucketServer::Connection do
+ let(:options) { { base_uri: 'https://test:7990', user: 'bitbucket', password: 'mypassword' } }
+ let(:payload) { { 'test' => 1 } }
+ let(:headers) { { "Content-Type" => "application/json" } }
+ let(:url) { 'https://test:7990/rest/api/1.0/test?something=1' }
+
+ subject { described_class.new(options) }
+
+ describe '#get' do
+ it 'returns JSON body' do
+ WebMock.stub_request(:get, url).with(headers: { 'Accept' => 'application/json' }).to_return(body: payload.to_json, status: 200, headers: headers)
+
+ expect(subject.get(url, { something: 1 })).to eq(payload)
+ end
+
+ it 'throws an exception if the response is not 200' do
+ WebMock.stub_request(:get, url).with(headers: { 'Accept' => 'application/json' }).to_return(body: payload.to_json, status: 500, headers: headers)
+
+ expect { subject.get(url) }.to raise_error(described_class::ConnectionError)
+ end
+
+ it 'throws an exception if the response is not JSON' do
+ WebMock.stub_request(:get, url).with(headers: { 'Accept' => 'application/json' }).to_return(body: 'bad data', status: 200, headers: headers)
+
+ expect { subject.get(url) }.to raise_error(described_class::ConnectionError)
+ end
+ end
+
+ describe '#post' do
+ let(:headers) { { 'Accept' => 'application/json', 'Content-Type' => 'application/json' } }
+
+ it 'returns JSON body' do
+ WebMock.stub_request(:post, url).with(headers: headers).to_return(body: payload.to_json, status: 200, headers: headers)
+
+ expect(subject.post(url, payload)).to eq(payload)
+ end
+
+ it 'throws an exception if the response is not 200' do
+ WebMock.stub_request(:post, url).with(headers: headers).to_return(body: payload.to_json, status: 500, headers: headers)
+
+ expect { subject.post(url, payload) }.to raise_error(described_class::ConnectionError)
+ end
+ end
+
+ describe '#delete' do
+ let(:headers) { { 'Accept' => 'application/json', 'Content-Type' => 'application/json' } }
+
+ context 'branch API' do
+ let(:branch_path) { '/projects/foo/repos/bar/branches' }
+ let(:branch_url) { 'https://test:7990/rest/branch-utils/1.0/projects/foo/repos/bar/branches' }
+ let(:path) { }
+
+ it 'returns JSON body' do
+ WebMock.stub_request(:delete, branch_url).with(headers: headers).to_return(body: payload.to_json, status: 200, headers: headers)
+
+ expect(subject.delete(:branches, branch_path, payload)).to eq(payload)
+ end
+
+ it 'throws an exception if the response is not 200' do
+ WebMock.stub_request(:delete, branch_url).with(headers: headers).to_return(body: payload.to_json, status: 500, headers: headers)
+
+ expect { subject.delete(:branches, branch_path, payload) }.to raise_error(described_class::ConnectionError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/bitbucket_server/page_spec.rb b/spec/lib/bitbucket_server/page_spec.rb
new file mode 100644
index 00000000000..cf419a9045b
--- /dev/null
+++ b/spec/lib/bitbucket_server/page_spec.rb
@@ -0,0 +1,51 @@
+require 'spec_helper'
+
+describe BitbucketServer::Page do
+ let(:response) { { 'values' => [{ 'description' => 'Test' }], 'isLastPage' => false, 'nextPageStart' => 2 } }
+
+ before do
+ # Autoloading hack
+ BitbucketServer::Representation::PullRequest.new({})
+ end
+
+ describe '#items' do
+ it 'returns collection of needed objects' do
+ page = described_class.new(response, :pull_request)
+
+ expect(page.items.first).to be_a(BitbucketServer::Representation::PullRequest)
+ expect(page.items.count).to eq(1)
+ end
+ end
+
+ describe '#attrs' do
+ it 'returns attributes' do
+ page = described_class.new(response, :pull_request)
+
+ expect(page.attrs.keys).to include(:isLastPage, :nextPageStart)
+ end
+ end
+
+ describe '#next?' do
+ it 'returns true' do
+ page = described_class.new(response, :pull_request)
+
+ expect(page.next?).to be_truthy
+ end
+
+ it 'returns false' do
+ response['isLastPage'] = true
+ response.delete('nextPageStart')
+ page = described_class.new(response, :pull_request)
+
+ expect(page.next?).to be_falsey
+ end
+ end
+
+ describe '#next' do
+ it 'returns next attribute' do
+ page = described_class.new(response, :pull_request)
+
+ expect(page.next).to eq(2)
+ end
+ end
+end
diff --git a/spec/lib/bitbucket_server/paginator_spec.rb b/spec/lib/bitbucket_server/paginator_spec.rb
new file mode 100644
index 00000000000..2de50eba3c4
--- /dev/null
+++ b/spec/lib/bitbucket_server/paginator_spec.rb
@@ -0,0 +1,35 @@
+require 'spec_helper'
+
+describe BitbucketServer::Paginator do
+ let(:last_page) { double(:page, next?: false, items: ['item_2']) }
+ let(:first_page) { double(:page, next?: true, next: last_page, items: ['item_1']) }
+ let(:connection) { instance_double(BitbucketServer::Connection) }
+
+ describe '#items' do
+ let(:paginator) { described_class.new(connection, 'http://more-data', :pull_request) }
+ let(:page_attrs) { { 'isLastPage' => false, 'nextPageStart' => 1 } }
+
+ it 'returns items and raises StopIteration in the end' do
+ allow(paginator).to receive(:fetch_next_page).and_return(first_page)
+ expect(paginator.items).to match(['item_1'])
+
+ allow(paginator).to receive(:fetch_next_page).and_return(last_page)
+ expect(paginator.items).to match(['item_2'])
+
+ allow(paginator).to receive(:fetch_next_page).and_return(nil)
+ expect { paginator.items }.to raise_error(StopIteration)
+ end
+
+ it 'calls the connection with different offsets' do
+ expect(connection).to receive(:get).with('http://more-data', start: 0, limit: BitbucketServer::Paginator::PAGE_LENGTH).and_return(page_attrs)
+
+ expect(paginator.items).to eq([])
+
+ expect(connection).to receive(:get).with('http://more-data', start: 1, limit: BitbucketServer::Paginator::PAGE_LENGTH).and_return({})
+
+ expect(paginator.items).to eq([])
+
+ expect { paginator.items }.to raise_error(StopIteration)
+ end
+ end
+end
diff --git a/spec/lib/bitbucket_server/representation/activity_spec.rb b/spec/lib/bitbucket_server/representation/activity_spec.rb
new file mode 100644
index 00000000000..15c50e40472
--- /dev/null
+++ b/spec/lib/bitbucket_server/representation/activity_spec.rb
@@ -0,0 +1,38 @@
+require 'spec_helper'
+
+describe BitbucketServer::Representation::Activity do
+ let(:activities) { JSON.parse(fixture_file('importers/bitbucket_server/activities.json'))['values'] }
+ let(:inline_comment) { activities.first }
+ let(:comment) { activities[3] }
+ let(:merge_event) { activities[4] }
+
+ describe 'regular comment' do
+ subject { described_class.new(comment) }
+
+ it { expect(subject.comment?).to be_truthy }
+ it { expect(subject.inline_comment?).to be_falsey }
+ it { expect(subject.comment).to be_a(BitbucketServer::Representation::Comment) }
+ it { expect(subject.created_at).to be_a(Time) }
+ end
+
+ describe 'inline comment' do
+ subject { described_class.new(inline_comment) }
+
+ it { expect(subject.comment?).to be_truthy }
+ it { expect(subject.inline_comment?).to be_truthy }
+ it { expect(subject.comment).to be_a(BitbucketServer::Representation::PullRequestComment) }
+ it { expect(subject.created_at).to be_a(Time) }
+ end
+
+ describe 'merge event' do
+ subject { described_class.new(merge_event) }
+
+ it { expect(subject.comment?).to be_falsey }
+ it { expect(subject.inline_comment?).to be_falsey }
+ it { expect(subject.committer_user).to eq('root') }
+ it { expect(subject.committer_email).to eq('test.user@example.com') }
+ it { expect(subject.merge_timestamp).to be_a(Time) }
+ it { expect(subject.created_at).to be_a(Time) }
+ it { expect(subject.merge_commit).to eq('839fa9a2d434eb697815b8fcafaecc51accfdbbc') }
+ end
+end
diff --git a/spec/lib/bitbucket_server/representation/comment_spec.rb b/spec/lib/bitbucket_server/representation/comment_spec.rb
new file mode 100644
index 00000000000..53a20a1d80a
--- /dev/null
+++ b/spec/lib/bitbucket_server/representation/comment_spec.rb
@@ -0,0 +1,55 @@
+require 'spec_helper'
+
+describe BitbucketServer::Representation::Comment do
+ let(:activities) { JSON.parse(fixture_file('importers/bitbucket_server/activities.json'))['values'] }
+ let(:comment) { activities.first }
+
+ subject { described_class.new(comment) }
+
+ describe '#id' do
+ it { expect(subject.id).to eq(9) }
+ end
+
+ describe '#author_username' do
+ it { expect(subject.author_username).to eq('root' ) }
+ end
+
+ describe '#author_email' do
+ it { expect(subject.author_email).to eq('test.user@example.com' ) }
+ end
+
+ describe '#note' do
+ it { expect(subject.note).to eq('is this a new line?') }
+ end
+
+ describe '#created_at' do
+ it { expect(subject.created_at).to be_a(Time) }
+ end
+
+ describe '#updated_at' do
+ it { expect(subject.created_at).to be_a(Time) }
+ end
+
+ describe '#comments' do
+ it { expect(subject.comments.count).to eq(4) }
+ it { expect(subject.comments).to all( be_a(described_class) ) }
+ it { expect(subject.comments.map(&:note)).to match_array(["Hello world", "Ok", "hello", "hi"]) }
+
+ # The thread should look like:
+ #
+ # is this a new line? (subject)
+ # -> Hello world (first)
+ # -> Ok (third)
+ # -> Hi (fourth)
+ # -> hello (second)
+ it 'comments have the right parent' do
+ first, second, third, fourth = subject.comments[0..4]
+
+ expect(subject.parent_comment).to be_nil
+ expect(first.parent_comment).to eq(subject)
+ expect(second.parent_comment).to eq(subject)
+ expect(third.parent_comment).to eq(first)
+ expect(fourth.parent_comment).to eq(first)
+ end
+ end
+end
diff --git a/spec/lib/bitbucket_server/representation/pull_request_comment_spec.rb b/spec/lib/bitbucket_server/representation/pull_request_comment_spec.rb
new file mode 100644
index 00000000000..bd7e3597486
--- /dev/null
+++ b/spec/lib/bitbucket_server/representation/pull_request_comment_spec.rb
@@ -0,0 +1,48 @@
+require 'spec_helper'
+
+describe BitbucketServer::Representation::PullRequestComment do
+ let(:activities) { JSON.parse(fixture_file('importers/bitbucket_server/activities.json'))['values'] }
+ let(:comment) { activities.second }
+
+ subject { described_class.new(comment) }
+
+ describe '#id' do
+ it { expect(subject.id).to eq(7) }
+ end
+
+ describe '#from_sha' do
+ it { expect(subject.from_sha).to eq('c5f4288162e2e6218180779c7f6ac1735bb56eab') }
+ end
+
+ describe '#to_sha' do
+ it { expect(subject.to_sha).to eq('a4c2164330f2549f67c13f36a93884cf66e976be') }
+ end
+
+ describe '#to?' do
+ it { expect(subject.to?).to be_falsey }
+ end
+
+ describe '#from?' do
+ it { expect(subject.from?).to be_truthy }
+ end
+
+ describe '#added?' do
+ it { expect(subject.added?).to be_falsey }
+ end
+
+ describe '#removed?' do
+ it { expect(subject.removed?).to be_falsey }
+ end
+
+ describe '#new_pos' do
+ it { expect(subject.new_pos).to eq(11) }
+ end
+
+ describe '#old_pos' do
+ it { expect(subject.old_pos).to eq(9) }
+ end
+
+ describe '#file_path' do
+ it { expect(subject.file_path).to eq('CHANGELOG.md') }
+ end
+end
diff --git a/spec/lib/bitbucket_server/representation/pull_request_spec.rb b/spec/lib/bitbucket_server/representation/pull_request_spec.rb
new file mode 100644
index 00000000000..4b8afdb006b
--- /dev/null
+++ b/spec/lib/bitbucket_server/representation/pull_request_spec.rb
@@ -0,0 +1,79 @@
+require 'spec_helper'
+
+describe BitbucketServer::Representation::PullRequest do
+ let(:sample_data) { JSON.parse(fixture_file('importers/bitbucket_server/pull_request.json')) }
+
+ subject { described_class.new(sample_data) }
+
+ describe '#author' do
+ it { expect(subject.author).to eq('root') }
+ end
+
+ describe '#author_email' do
+ it { expect(subject.author_email).to eq('joe.montana@49ers.com') }
+ end
+
+ describe '#description' do
+ it { expect(subject.description).to eq('Test') }
+ end
+
+ describe '#iid' do
+ it { expect(subject.iid).to eq(7) }
+ end
+
+ describe '#state' do
+ it { expect(subject.state).to eq('merged') }
+
+ context 'declined pull requests' do
+ before do
+ sample_data['state'] = 'DECLINED'
+ end
+
+ it 'returns closed' do
+ expect(subject.state).to eq('closed')
+ end
+ end
+
+ context 'open pull requests' do
+ before do
+ sample_data['state'] = 'OPEN'
+ end
+
+ it 'returns open' do
+ expect(subject.state).to eq('opened')
+ end
+ end
+ end
+
+ describe '#merged?' do
+ it { expect(subject.merged?).to be_truthy }
+ end
+
+ describe '#created_at' do
+ it { expect(subject.created_at.to_i).to eq(sample_data['createdDate'] / 1000) }
+ end
+
+ describe '#updated_at' do
+ it { expect(subject.updated_at.to_i).to eq(sample_data['updatedDate'] / 1000) }
+ end
+
+ describe '#title' do
+ it { expect(subject.title).to eq('Added a new line') }
+ end
+
+ describe '#source_branch_name' do
+ it { expect(subject.source_branch_name).to eq('refs/heads/root/CODE_OF_CONDUCTmd-1530600625006') }
+ end
+
+ describe '#source_branch_sha' do
+ it { expect(subject.source_branch_sha).to eq('074e2b4dddc5b99df1bf9d4a3f66cfc15481fdc8') }
+ end
+
+ describe '#target_branch_name' do
+ it { expect(subject.target_branch_name).to eq('refs/heads/master') }
+ end
+
+ describe '#target_branch_sha' do
+ it { expect(subject.target_branch_sha).to eq('839fa9a2d434eb697815b8fcafaecc51accfdbbc') }
+ end
+end
diff --git a/spec/lib/bitbucket_server/representation/repo_spec.rb b/spec/lib/bitbucket_server/representation/repo_spec.rb
new file mode 100644
index 00000000000..3ac1030fbb0
--- /dev/null
+++ b/spec/lib/bitbucket_server/representation/repo_spec.rb
@@ -0,0 +1,80 @@
+require 'spec_helper'
+
+describe BitbucketServer::Representation::Repo do
+ let(:sample_data) do
+ <<~DATA
+ {
+ "slug": "rouge",
+ "id": 1,
+ "name": "rouge",
+ "scmId": "git",
+ "state": "AVAILABLE",
+ "statusMessage": "Available",
+ "forkable": true,
+ "project": {
+ "key": "TEST",
+ "id": 1,
+ "name": "test",
+ "description": "Test",
+ "public": false,
+ "type": "NORMAL",
+ "links": {
+ "self": [
+ {
+ "href": "http://localhost:7990/projects/TEST"
+ }
+ ]
+ }
+ },
+ "public": false,
+ "links": {
+ "clone": [
+ {
+ "href": "http://root@localhost:7990/scm/test/rouge.git",
+ "name": "http"
+ },
+ {
+ "href": "ssh://git@localhost:7999/test/rouge.git",
+ "name": "ssh"
+ }
+ ],
+ "self": [
+ {
+ "href": "http://localhost:7990/projects/TEST/repos/rouge/browse"
+ }
+ ]
+ }
+ }
+ DATA
+ end
+
+ subject { described_class.new(JSON.parse(sample_data)) }
+
+ describe '#project_key' do
+ it { expect(subject.project_key).to eq('TEST') }
+ end
+
+ describe '#project_name' do
+ it { expect(subject.project_name).to eq('test') }
+ end
+
+ describe '#slug' do
+ it { expect(subject.slug).to eq('rouge') }
+ end
+
+ describe '#browse_url' do
+ it { expect(subject.browse_url).to eq('http://localhost:7990/projects/TEST/repos/rouge/browse') }
+ end
+
+ describe '#clone_url' do
+ it { expect(subject.clone_url).to eq('http://root@localhost:7990/scm/test/rouge.git') }
+ end
+
+ describe '#description' do
+ it { expect(subject.description).to eq('Test') }
+ end
+
+ describe '#full_name' do
+ it { expect(subject.full_name).to eq('test/rouge') }
+ end
+end
diff --git a/spec/lib/gitlab/auth/blocked_user_tracker_spec.rb b/spec/lib/gitlab/auth/blocked_user_tracker_spec.rb
index 13c09b9cb9b..f39863fdda1 100644
--- a/spec/lib/gitlab/auth/blocked_user_tracker_spec.rb
+++ b/spec/lib/gitlab/auth/blocked_user_tracker_spec.rb
@@ -1,75 +1,30 @@
require 'spec_helper'
describe Gitlab::Auth::BlockedUserTracker do
- set(:user) { create(:user) }
-
describe '#log_blocked_user_activity!' do
- it 'does not log if user failed to login due to undefined reason' do
- expect_any_instance_of(SystemHooksService).not_to receive(:execute_hooks_for)
-
- tracker = described_class.new({})
+ context 'when user is not blocked' do
+ it 'does not log blocked user activity' do
+ expect_any_instance_of(SystemHooksService)
+ .not_to receive(:execute_hooks_for)
+ expect(Gitlab::AppLogger).not_to receive(:info)
- expect(tracker.user).to be_nil
- expect(tracker.user_blocked?).to be_falsey
- expect(tracker.log_blocked_user_activity!).to be_nil
- end
+ user = create(:user)
- it 'gracefully handles malformed environment variables' do
- tracker = described_class.new({ 'warden.options' => 'test' })
-
- expect(tracker.user).to be_nil
- expect(tracker.user_blocked?).to be_falsey
- expect(tracker.log_blocked_user_activity!).to be_nil
- end
-
- context 'failed login due to blocked user' do
- let(:base_env) { { 'warden.options' => { message: User::BLOCKED_MESSAGE } } }
- let(:env) { base_env.merge(request_env) }
-
- subject { described_class.new(env) }
-
- before do
- expect_any_instance_of(SystemHooksService).to receive(:execute_hooks_for).with(user, :failed_login)
+ described_class.new(user, spy('auth')).log_activity!
end
+ end
- context 'via GitLab login' do
- let(:request_env) { { described_class::ACTIVE_RECORD_REQUEST_PARAMS => { 'user' => { 'login' => user.username } } } }
-
- it 'logs a blocked user' do
- user.block!
-
- expect(subject.user).to be_blocked
- expect(subject.user_blocked?).to be true
- expect(subject.log_blocked_user_activity!).to be_truthy
- end
-
- it 'logs a blocked user by e-mail' do
- user.block!
- env[described_class::ACTIVE_RECORD_REQUEST_PARAMS]['user']['login'] = user.email
-
- expect(subject.user).to be_blocked
- expect(subject.log_blocked_user_activity!).to be_truthy
- end
- end
-
- context 'via LDAP login' do
- let(:request_env) { { described_class::ACTIVE_RECORD_REQUEST_PARAMS => { 'username' => user.username } } }
-
- it 'logs a blocked user' do
- user.block!
-
- expect(subject.user).to be_blocked
- expect(subject.user_blocked?).to be true
- expect(subject.log_blocked_user_activity!).to be_truthy
- end
+ context 'when user is not blocked' do
+ it 'logs blocked user activity' do
+ user = create(:user, :blocked)
- it 'logs a LDAP blocked user' do
- user.ldap_block!
+ expect_any_instance_of(SystemHooksService)
+ .to receive(:execute_hooks_for)
+ .with(user, :failed_login)
+ expect(Gitlab::AppLogger).to receive(:info)
+ .with(/Failed login for blocked user/)
- expect(subject.user).to be_blocked
- expect(subject.user_blocked?).to be true
- expect(subject.log_blocked_user_activity!).to be_truthy
- end
+ described_class.new(user, spy('auth')).log_activity!
end
end
end
diff --git a/spec/lib/gitlab/bitbucket_server_import/importer_spec.rb b/spec/lib/gitlab/bitbucket_server_import/importer_spec.rb
new file mode 100644
index 00000000000..70423823b89
--- /dev/null
+++ b/spec/lib/gitlab/bitbucket_server_import/importer_spec.rb
@@ -0,0 +1,291 @@
+require 'spec_helper'
+
+describe Gitlab::BitbucketServerImport::Importer do
+ include ImportSpecHelper
+
+ let(:project) { create(:project, :repository, import_url: 'http://my-bitbucket') }
+ let(:now) { Time.now.utc.change(usec: 0) }
+ let(:project_key) { 'TEST' }
+ let(:repo_slug) { 'rouge' }
+ let(:sample) { RepoHelpers.sample_compare }
+
+ subject { described_class.new(project, recover_missing_commits: true) }
+
+ before do
+ data = project.create_or_update_import_data(
+ data: { project_key: project_key, repo_slug: repo_slug },
+ credentials: { base_uri: 'http://my-bitbucket', user: 'bitbucket', password: 'test' }
+ )
+ data.save
+ project.save
+ end
+
+ describe '#import_repository' do
+ before do
+ expect(subject).to receive(:import_pull_requests)
+ expect(subject).to receive(:delete_temp_branches)
+ end
+
+ it 'adds a remote' do
+ expect(project.repository).to receive(:fetch_as_mirror)
+ .with('http://bitbucket:test@my-bitbucket',
+ refmap: [:heads, :tags, '+refs/pull-requests/*/to:refs/merge-requests/*/head'],
+ remote_name: 'bitbucket_server')
+
+ subject.execute
+ end
+ end
+
+ describe '#import_pull_requests' do
+ before do
+ allow(subject).to receive(:import_repository)
+ allow(subject).to receive(:delete_temp_branches)
+ allow(subject).to receive(:restore_branches)
+
+ pull_request = instance_double(
+ BitbucketServer::Representation::PullRequest,
+ iid: 10,
+ source_branch_sha: sample.commits.last,
+ source_branch_name: Gitlab::Git::BRANCH_REF_PREFIX + sample.source_branch,
+ target_branch_sha: sample.commits.first,
+ target_branch_name: Gitlab::Git::BRANCH_REF_PREFIX + sample.target_branch,
+ title: 'This is a title',
+ description: 'This is a test pull request',
+ state: 'merged',
+ author: 'Test Author',
+ author_email: project.owner.email,
+ created_at: Time.now,
+ updated_at: Time.now,
+ merged?: true)
+
+ allow(subject.client).to receive(:pull_requests).and_return([pull_request])
+
+ @merge_event = instance_double(
+ BitbucketServer::Representation::Activity,
+ comment?: false,
+ merge_event?: true,
+ committer_email: project.owner.email,
+ merge_timestamp: now,
+ merge_commit: '12345678'
+ )
+
+ @pr_note = instance_double(
+ BitbucketServer::Representation::Comment,
+ note: 'Hello world',
+ author_email: 'unknown@gmail.com',
+ author_username: 'The Flash',
+ comments: [],
+ created_at: now,
+ updated_at: now,
+ parent_comment: nil)
+
+ @pr_comment = instance_double(
+ BitbucketServer::Representation::Activity,
+ comment?: true,
+ inline_comment?: false,
+ merge_event?: false,
+ comment: @pr_note)
+ end
+
+ it 'imports merge event' do
+ expect(subject.client).to receive(:activities).and_return([@merge_event])
+
+ expect { subject.execute }.to change { MergeRequest.count }.by(1)
+
+ merge_request = MergeRequest.first
+ expect(merge_request.metrics.merged_by).to eq(project.owner)
+ expect(merge_request.metrics.merged_at).to eq(@merge_event.merge_timestamp)
+ expect(merge_request.merge_commit_sha).to eq('12345678')
+ end
+
+ it 'imports comments' do
+ expect(subject.client).to receive(:activities).and_return([@pr_comment])
+
+ expect { subject.execute }.to change { MergeRequest.count }.by(1)
+
+ merge_request = MergeRequest.first
+ expect(merge_request.notes.count).to eq(1)
+ note = merge_request.notes.first
+ expect(note.note).to end_with(@pr_note.note)
+ expect(note.author).to eq(project.owner)
+ expect(note.created_at).to eq(@pr_note.created_at)
+ expect(note.updated_at).to eq(@pr_note.created_at)
+ end
+
+ it 'imports threaded discussions' do
+ reply = instance_double(
+ BitbucketServer::Representation::PullRequestComment,
+ author_email: 'someuser@gitlab.com',
+ author_username: 'Batman',
+ note: 'I agree',
+ created_at: now,
+ updated_at: now)
+
+ # https://gitlab.com/gitlab-org/gitlab-test/compare/c1acaa58bbcbc3eafe538cb8274ba387047b69f8...5937ac0a7beb003549fc5fd26fc247ad
+ inline_note = instance_double(
+ BitbucketServer::Representation::PullRequestComment,
+ file_type: 'ADDED',
+ from_sha: sample.commits.first,
+ to_sha: sample.commits.last,
+ file_path: '.gitmodules',
+ old_pos: nil,
+ new_pos: 4,
+ note: 'Hello world',
+ author_email: 'unknown@gmail.com',
+ author_username: 'Superman',
+ comments: [reply],
+ created_at: now,
+ updated_at: now,
+ parent_comment: nil)
+
+ allow(reply).to receive(:parent_comment).and_return(inline_note)
+
+ inline_comment = instance_double(
+ BitbucketServer::Representation::Activity,
+ comment?: true,
+ inline_comment?: true,
+ merge_event?: false,
+ comment: inline_note)
+
+ expect(subject.client).to receive(:activities).and_return([inline_comment])
+
+ expect { subject.execute }.to change { MergeRequest.count }.by(1)
+
+ merge_request = MergeRequest.first
+ expect(merge_request.notes.count).to eq(2)
+ expect(merge_request.notes.map(&:discussion_id).uniq.count).to eq(1)
+
+ notes = merge_request.notes.order(:id).to_a
+ start_note = notes.first
+ expect(start_note.type).to eq('DiffNote')
+ expect(start_note.note).to end_with(inline_note.note)
+ expect(start_note.created_at).to eq(inline_note.created_at)
+ expect(start_note.updated_at).to eq(inline_note.updated_at)
+ expect(start_note.position.base_sha).to eq(inline_note.from_sha)
+ expect(start_note.position.start_sha).to eq(inline_note.from_sha)
+ expect(start_note.position.head_sha).to eq(inline_note.to_sha)
+ expect(start_note.position.old_line).to be_nil
+ expect(start_note.position.new_line).to eq(inline_note.new_pos)
+
+ reply_note = notes.last
+ # Make sure author and reply context is included
+ expect(reply_note.note).to start_with("*By #{reply.author_username} (#{reply.author_email})*\n\n")
+ expect(reply_note.note).to end_with("> #{inline_note.note}\n\n#{reply.note}")
+ expect(reply_note.author).to eq(project.owner)
+ expect(reply_note.created_at).to eq(reply.created_at)
+ expect(reply_note.updated_at).to eq(reply.created_at)
+ expect(reply_note.position.base_sha).to eq(inline_note.from_sha)
+ expect(reply_note.position.start_sha).to eq(inline_note.from_sha)
+ expect(reply_note.position.head_sha).to eq(inline_note.to_sha)
+ expect(reply_note.position.old_line).to be_nil
+ expect(reply_note.position.new_line).to eq(inline_note.new_pos)
+ end
+
+ it 'falls back to comments if diff comments fail to validate' do
+ reply = instance_double(
+ BitbucketServer::Representation::Comment,
+ author_email: 'someuser@gitlab.com',
+ author_username: 'Aquaman',
+ note: 'I agree',
+ created_at: now,
+ updated_at: now)
+
+ # https://gitlab.com/gitlab-org/gitlab-test/compare/c1acaa58bbcbc3eafe538cb8274ba387047b69f8...5937ac0a7beb003549fc5fd26fc247ad
+ inline_note = instance_double(
+ BitbucketServer::Representation::PullRequestComment,
+ file_type: 'REMOVED',
+ from_sha: sample.commits.first,
+ to_sha: sample.commits.last,
+ file_path: '.gitmodules',
+ old_pos: 8,
+ new_pos: 9,
+ note: 'This is a note with an invalid line position.',
+ author_email: project.owner.email,
+ author_username: 'Owner',
+ comments: [reply],
+ created_at: now,
+ updated_at: now,
+ parent_comment: nil)
+
+ inline_comment = instance_double(
+ BitbucketServer::Representation::Activity,
+ comment?: true,
+ inline_comment?: true,
+ merge_event?: false,
+ comment: inline_note)
+
+ allow(reply).to receive(:parent_comment).and_return(inline_note)
+
+ expect(subject.client).to receive(:activities).and_return([inline_comment])
+
+ expect { subject.execute }.to change { MergeRequest.count }.by(1)
+
+ merge_request = MergeRequest.first
+ expect(merge_request.notes.count).to eq(2)
+ notes = merge_request.notes
+
+ expect(notes.first.note).to start_with('*Comment on .gitmodules')
+ expect(notes.second.note).to start_with('*Comment on .gitmodules')
+ end
+ end
+
+ describe 'inaccessible branches' do
+ let(:id) { 10 }
+ let(:temp_branch_from) { "gitlab/import/pull-request/#{id}/from" }
+ let(:temp_branch_to) { "gitlab/import/pull-request/#{id}/to" }
+
+ before do
+ pull_request = instance_double(
+ BitbucketServer::Representation::PullRequest,
+ iid: id,
+ source_branch_sha: '12345678',
+ source_branch_name: Gitlab::Git::BRANCH_REF_PREFIX + sample.source_branch,
+ target_branch_sha: '98765432',
+ target_branch_name: Gitlab::Git::BRANCH_REF_PREFIX + sample.target_branch,
+ title: 'This is a title',
+ description: 'This is a test pull request',
+ state: 'merged',
+ author: 'Test Author',
+ author_email: project.owner.email,
+ created_at: Time.now,
+ updated_at: Time.now,
+ merged?: true)
+
+ expect(subject.client).to receive(:pull_requests).and_return([pull_request])
+ expect(subject.client).to receive(:activities).and_return([])
+ expect(subject).to receive(:import_repository).twice
+ end
+
+ it '#restore_branches' do
+ expect(subject).to receive(:restore_branches).and_call_original
+ expect(subject).to receive(:delete_temp_branches)
+ expect(subject.client).to receive(:create_branch)
+ .with(project_key, repo_slug,
+ temp_branch_from,
+ '12345678')
+ expect(subject.client).to receive(:create_branch)
+ .with(project_key, repo_slug,
+ temp_branch_to,
+ '98765432')
+
+ expect { subject.execute }.to change { MergeRequest.count }.by(1)
+ end
+
+ it '#delete_temp_branches' do
+ expect(subject.client).to receive(:create_branch).twice
+ expect(subject).to receive(:delete_temp_branches).and_call_original
+ expect(subject.client).to receive(:delete_branch)
+ .with(project_key, repo_slug,
+ temp_branch_from,
+ '12345678')
+ expect(subject.client).to receive(:delete_branch)
+ .with(project_key, repo_slug,
+ temp_branch_to,
+ '98765432')
+ expect(project.repository).to receive(:delete_branch).with(temp_branch_from)
+ expect(project.repository).to receive(:delete_branch).with(temp_branch_to)
+
+ expect { subject.execute }.to change { MergeRequest.count }.by(1)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb b/spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb
new file mode 100644
index 00000000000..384329dda18
--- /dev/null
+++ b/spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb
@@ -0,0 +1,56 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Build::Artifacts::GzipFileAdapter do
+ describe '#initialize' do
+ context 'when stream is passed' do
+ let(:stream) { File.open(expand_fixture_path('junit/junit.xml.gz'), 'rb') }
+
+ it 'initialized' do
+ expect { described_class.new(stream) }.not_to raise_error
+ end
+ end
+
+ context 'when stream is not passed' do
+ let(:stream) { nil }
+
+ it 'raises an error' do
+ expect { described_class.new(stream) }.to raise_error(described_class::InvalidStreamError)
+ end
+ end
+ end
+
+ describe '#each_blob' do
+ let(:adapter) { described_class.new(stream) }
+
+ context 'when stream is gzip file' do
+ context 'when gzip file contains one file' do
+ let(:stream) { File.open(expand_fixture_path('junit/junit.xml.gz'), 'rb') }
+
+ it 'iterates content and file_name' do
+ expect { |b| adapter.each_blob(&b) }
+ .to yield_with_args(fixture_file('junit/junit.xml'), 'rspec.xml')
+ end
+ end
+
+ context 'when gzip file contains three files' do
+ let(:stream) { File.open(expand_fixture_path('junit/junit_with_three_testsuites.xml.gz'), 'rb') }
+
+ it 'iterates content and file_name' do
+ expect { |b| adapter.each_blob(&b) }
+ .to yield_successive_args(
+ [fixture_file('junit/junit_with_three_testsuites_1.xml'), 'rspec-3.xml'],
+ [fixture_file('junit/junit_with_three_testsuites_2.xml'), 'rspec-1.xml'],
+ [fixture_file('junit/junit_with_three_testsuites_3.xml'), 'rspec-2.xml'])
+ end
+ end
+ end
+
+ context 'when stream is zip file' do
+ let(:stream) { File.open(expand_fixture_path('ci_build_artifacts.zip'), 'rb') }
+
+ it 'raises an error' do
+ expect { |b| adapter.each_blob(&b) }.to raise_error(described_class::InvalidStreamError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/parsers/junit_spec.rb b/spec/lib/gitlab/ci/parsers/junit_spec.rb
new file mode 100644
index 00000000000..f7ec86f5385
--- /dev/null
+++ b/spec/lib/gitlab/ci/parsers/junit_spec.rb
@@ -0,0 +1,118 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Parsers::Junit do
+ describe '#parse!' do
+ subject { described_class.new.parse!(junit, test_suite) }
+
+ let(:test_suite) { Gitlab::Ci::Reports::TestSuite.new('rspec') }
+ let(:test_cases) { flattened_test_cases(test_suite) }
+
+ context 'when data is JUnit style XML' do
+ context 'when there are no test cases' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuite></testsuite>
+ EOF
+ end
+
+ it 'raises an error and does not add any test cases' do
+ expect { subject }.to raise_error(described_class::JunitParserError)
+
+ expect(test_cases.count).to eq(0)
+ end
+ end
+
+ context 'when there is a test case' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuite>
+ <testcase classname='Calculator' name='sumTest1' time='0.01'></testcase>
+ </testsuite>
+ EOF
+ end
+
+ it 'parses XML and adds a test case to a suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases[0].classname).to eq('Calculator')
+ expect(test_cases[0].name).to eq('sumTest1')
+ expect(test_cases[0].execution_time).to eq(0.01)
+ end
+ end
+
+ context 'when there are two test cases' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuite>
+ <testcase classname='Calculator' name='sumTest1' time='0.01'></testcase>
+ <testcase classname='Calculator' name='sumTest2' time='0.02'></testcase>
+ </testsuite>
+ EOF
+ end
+
+ it 'parses XML and adds test cases to a suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases[0].classname).to eq('Calculator')
+ expect(test_cases[0].name).to eq('sumTest1')
+ expect(test_cases[0].execution_time).to eq(0.01)
+ expect(test_cases[1].classname).to eq('Calculator')
+ expect(test_cases[1].name).to eq('sumTest2')
+ expect(test_cases[1].execution_time).to eq(0.02)
+ end
+ end
+
+ context 'when there are two test suites' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuites>
+ <testsuite>
+ <testcase classname='Calculator' name='sumTest1' time='0.01'></testcase>
+ <testcase classname='Calculator' name='sumTest2' time='0.02'></testcase>
+ </testsuite>
+ <testsuite>
+ <testcase classname='Statemachine' name='happy path' time='100'></testcase>
+ <testcase classname='Statemachine' name='unhappy path' time='200'></testcase>
+ </testsuite>
+ </testsuites>
+ EOF
+ end
+
+ it 'parses XML and adds test cases to a suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases[0].classname).to eq('Calculator')
+ expect(test_cases[0].name).to eq('sumTest1')
+ expect(test_cases[0].execution_time).to eq(0.01)
+ expect(test_cases[1].classname).to eq('Calculator')
+ expect(test_cases[1].name).to eq('sumTest2')
+ expect(test_cases[1].execution_time).to eq(0.02)
+ expect(test_cases[2].classname).to eq('Statemachine')
+ expect(test_cases[2].name).to eq('happy path')
+ expect(test_cases[2].execution_time).to eq(100)
+ expect(test_cases[3].classname).to eq('Statemachine')
+ expect(test_cases[3].name).to eq('unhappy path')
+ expect(test_cases[3].execution_time).to eq(200)
+ end
+ end
+ end
+
+ context 'when data is not JUnit style XML' do
+ let(:junit) { { testsuite: 'abc' }.to_json }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(described_class::JunitParserError)
+ end
+ end
+
+ private
+
+ def flattened_test_cases(test_suite)
+ test_suite.test_cases.map do |status, value|
+ value.map do |key, test_case|
+ test_case
+ end
+ end.flatten
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/parsers_spec.rb b/spec/lib/gitlab/ci/parsers_spec.rb
new file mode 100644
index 00000000000..2fa83c4abae
--- /dev/null
+++ b/spec/lib/gitlab/ci/parsers_spec.rb
@@ -0,0 +1,23 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Parsers do
+ describe '.fabricate!' do
+ subject { described_class.fabricate!(file_type) }
+
+ context 'when file_type exists' do
+ let(:file_type) { 'junit' }
+
+ it 'fabricates the class' do
+ is_expected.to be_a(described_class::Junit)
+ end
+ end
+
+ context 'when file_type does not exist' do
+ let(:file_type) { 'undefined' }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(NameError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_case_spec.rb b/spec/lib/gitlab/ci/reports/test_case_spec.rb
new file mode 100644
index 00000000000..6932f79f0ce
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_case_spec.rb
@@ -0,0 +1,90 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestCase do
+ describe '#initialize' do
+ let(:test_case) { described_class.new(**params)}
+
+ context 'when both classname and name are given' do
+ context 'when test case is passed' do
+ let(:params) do
+ {
+ name: 'test-1',
+ classname: 'trace',
+ file: 'spec/trace_spec.rb',
+ execution_time: 1.23,
+ status: described_class::STATUS_SUCCESS,
+ system_output: nil
+ }
+ end
+
+ it 'initializes an instance' do
+ expect { test_case }.not_to raise_error
+
+ expect(test_case.name).to eq('test-1')
+ expect(test_case.classname).to eq('trace')
+ expect(test_case.file).to eq('spec/trace_spec.rb')
+ expect(test_case.execution_time).to eq(1.23)
+ expect(test_case.status).to eq(described_class::STATUS_SUCCESS)
+ expect(test_case.system_output).to be_nil
+ end
+ end
+
+ context 'when test case is failed' do
+ let(:params) do
+ {
+ name: 'test-1',
+ classname: 'trace',
+ file: 'spec/trace_spec.rb',
+ execution_time: 1.23,
+ status: described_class::STATUS_FAILED,
+ system_output: "Failure/Error: is_expected.to eq(300) expected: 300 got: -100"
+ }
+ end
+
+ it 'initializes an instance' do
+ expect { test_case }.not_to raise_error
+
+ expect(test_case.name).to eq('test-1')
+ expect(test_case.classname).to eq('trace')
+ expect(test_case.file).to eq('spec/trace_spec.rb')
+ expect(test_case.execution_time).to eq(1.23)
+ expect(test_case.status).to eq(described_class::STATUS_FAILED)
+ expect(test_case.system_output)
+ .to eq('Failure/Error: is_expected.to eq(300) expected: 300 got: -100')
+ end
+ end
+ end
+
+ context 'when classname is missing' do
+ let(:params) do
+ {
+ name: 'test-1',
+ file: 'spec/trace_spec.rb',
+ execution_time: 1.23,
+ status: described_class::STATUS_SUCCESS,
+ system_output: nil
+ }
+ end
+
+ it 'raises an error' do
+ expect { test_case }.to raise_error(ArgumentError)
+ end
+ end
+
+ context 'when name is missing' do
+ let(:params) do
+ {
+ classname: 'trace',
+ file: 'spec/trace_spec.rb',
+ execution_time: 1.23,
+ status: described_class::STATUS_SUCCESS,
+ system_output: nil
+ }
+ end
+
+ it 'raises an error' do
+ expect { test_case }.to raise_error(ArgumentError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb b/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb
new file mode 100644
index 00000000000..71c61e0345f
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb
@@ -0,0 +1,134 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestReportsComparer do
+ include TestReportsHelper
+
+ let(:comparer) { described_class.new(base_reports, head_reports) }
+ let(:base_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:head_reports) { Gitlab::Ci::Reports::TestReports.new }
+
+ describe '#suite_comparers' do
+ subject { comparer.suite_comparers }
+
+ context 'when head and base reports include two test suites' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns test suite comparers with specified values' do
+ expect(subject[0]).to be_a(Gitlab::Ci::Reports::TestSuiteComparer)
+ expect(subject[0].name).to eq('rspec')
+ expect(subject[0].head_suite).to eq(head_reports.get_suite('rspec'))
+ expect(subject[0].base_suite).to eq(base_reports.get_suite('rspec'))
+ expect(subject[1]).to be_a(Gitlab::Ci::Reports::TestSuiteComparer)
+ expect(subject[1].name).to eq('junit')
+ expect(subject[1].head_suite).to eq(head_reports.get_suite('junit'))
+ expect(subject[1].base_suite).to eq(base_reports.get_suite('junit'))
+ end
+ end
+ end
+
+ describe '#total_status' do
+ subject { comparer.total_status }
+
+ context 'when all tests cases are success in head suites' do
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns the total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is a failed test case in head suites' do
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns the total status in head suite' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+ end
+
+ describe '#total_count' do
+ subject { comparer.total_count }
+
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns the total test counts in head suites' do
+ is_expected.to eq(2)
+ end
+ end
+
+ describe '#resolved_count' do
+ subject { comparer.resolved_count }
+
+ context 'when there is a resolved test case in head suites' do
+ let(:create_test_case_java_resolved) do
+ create_test_case_java_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_resolved)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(1)
+ end
+ end
+
+ context 'when there are no resolved test cases in head suites' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(0)
+ end
+ end
+ end
+
+ describe '#failed_count' do
+ subject { comparer.failed_count }
+
+ context 'when there is a failed test case in head suites' do
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(1)
+ end
+ end
+
+ context 'when there are no failed test cases in head suites' do
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_rspec_success)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(0)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_reports_spec.rb b/spec/lib/gitlab/ci/reports/test_reports_spec.rb
new file mode 100644
index 00000000000..74ff134b239
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_reports_spec.rb
@@ -0,0 +1,132 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestReports do
+ include TestReportsHelper
+
+ let(:test_reports) { described_class.new }
+
+ describe '#get_suite' do
+ subject { test_reports.get_suite(suite_name) }
+
+ context 'when suite name is rspec' do
+ let(:suite_name) { 'rspec' }
+
+ it { expect(subject.name).to eq('rspec') }
+
+ it 'initializes a new test suite and returns it' do
+ expect(Gitlab::Ci::Reports::TestSuite).to receive(:new).and_call_original
+
+ is_expected.to be_a(Gitlab::Ci::Reports::TestSuite)
+ end
+
+ context 'when suite name is already allocated' do
+ before do
+ subject
+ end
+
+ it 'does not initialize a new test suite' do
+ expect(Gitlab::Ci::Reports::TestSuite).not_to receive(:new)
+
+ is_expected.to be_a(Gitlab::Ci::Reports::TestSuite)
+ end
+ end
+ end
+ end
+
+ describe '#total_time' do
+ subject { test_reports.total_time }
+
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns the total time' do
+ is_expected.to eq(6.66)
+ end
+ end
+
+ describe '#total_count' do
+ subject { test_reports.total_count }
+
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns the total count' do
+ is_expected.to eq(2)
+ end
+ end
+
+ describe '#total_status' do
+ subject { test_reports.total_status }
+
+ context 'when all test cases succeeded' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is a failed test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+
+ context 'when there is a skipped test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_skipped)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is an error test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_error)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+ end
+
+ Gitlab::Ci::Reports::TestCase::STATUS_TYPES.each do |status_type|
+ describe "##{status_type}_count" do
+ subject { test_reports.public_send("#{status_type}_count") }
+
+ context "when #{status_type} test case exists" do
+ before do
+ test_reports.get_suite('rspec').add_test_case(public_send("create_test_case_rspec_#{status_type}"))
+ test_reports.get_suite('junit').add_test_case(public_send("create_test_case_java_#{status_type}"))
+ end
+
+ it 'returns the count' do
+ is_expected.to eq(2)
+ end
+ end
+
+ context "when #{status_type} test case do not exist" do
+ it 'returns nothing' do
+ is_expected.to be(0)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb b/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb
new file mode 100644
index 00000000000..6ab16e5518d
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb
@@ -0,0 +1,225 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestSuiteComparer do
+ include TestReportsHelper
+
+ let(:comparer) { described_class.new(name, base_suite, head_suite) }
+ let(:name) { 'rpsec' }
+ let(:base_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
+ let(:head_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
+ let(:test_case_success) { create_test_case_rspec_success }
+ let(:test_case_failed) { create_test_case_rspec_failed }
+
+ let(:test_case_resolved) do
+ create_test_case_rspec_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ describe '#new_failures' do
+ subject { comparer.new_failures }
+
+ context 'when head sutie has a newly failed test case which does not exist in base' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the failed test case' do
+ is_expected.to eq([test_case_failed])
+ end
+ end
+
+ context 'when head sutie still has a failed test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when head sutie has a success test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_resolved)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to be_empty
+ end
+ end
+ end
+
+ describe '#existing_failures' do
+ subject { comparer.existing_failures }
+
+ context 'when head sutie has a newly failed test case which does not exist in base' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the failed test case' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when head sutie still has a failed test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to eq([test_case_failed])
+ end
+ end
+
+ context 'when head sutie has a success test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_resolved)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to be_empty
+ end
+ end
+ end
+
+ describe '#resolved_failures' do
+ subject { comparer.resolved_failures }
+
+ context 'when head sutie has a newly failed test case which does not exist in base' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the failed test case' do
+ is_expected.to be_empty
+ end
+
+ it 'returns the correct resolved count' do
+ expect(comparer.resolved_count).to eq(0)
+ end
+ end
+
+ context 'when head sutie still has a failed test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to be_empty
+ end
+
+ it 'returns the correct resolved count' do
+ expect(comparer.resolved_count).to eq(0)
+ end
+ end
+
+ context 'when head sutie has a success test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_resolved)
+ end
+
+ it 'does not return the resolved test case' do
+ is_expected.to eq([test_case_resolved])
+ end
+
+ it 'returns the correct resolved count' do
+ expect(comparer.resolved_count).to eq(1)
+ end
+ end
+ end
+
+ describe '#total_count' do
+ subject { comparer.total_count }
+
+ before do
+ head_suite.add_test_case(test_case_success)
+ end
+
+ it 'returns the total test counts in head suite' do
+ is_expected.to eq(1)
+ end
+ end
+
+ describe '#failed_count' do
+ subject { comparer.failed_count }
+
+ context 'when there are a new failure and an existing failure' do
+ let(:test_case_1_success) { create_test_case_rspec_success }
+ let(:test_case_2_failed) { create_test_case_rspec_failed }
+
+ let(:test_case_1_failed) do
+ create_test_case_rspec_success.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+
+ before do
+ base_suite.add_test_case(test_case_1_success)
+ base_suite.add_test_case(test_case_2_failed)
+ head_suite.add_test_case(test_case_1_failed)
+ head_suite.add_test_case(test_case_2_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(2)
+ end
+ end
+
+ context 'when there is a new failure' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(1)
+ end
+ end
+
+ context 'when there is an existing failure' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(1)
+ end
+ end
+ end
+
+ describe '#total_status' do
+ subject { comparer.total_status }
+
+ context 'when all test cases in head suite are success' do
+ before do
+ head_suite.add_test_case(test_case_success)
+ end
+
+ it 'returns the total status in head suite' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is a failed test case in head suite' do
+ before do
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the total status in head suite' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_suite_spec.rb b/spec/lib/gitlab/ci/reports/test_suite_spec.rb
new file mode 100644
index 00000000000..cd34dbaf62f
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_suite_spec.rb
@@ -0,0 +1,120 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestSuite do
+ include TestReportsHelper
+
+ let(:test_suite) { described_class.new('Rspec') }
+ let(:test_case_success) { create_test_case_rspec_success }
+ let(:test_case_failed) { create_test_case_rspec_failed }
+ let(:test_case_skipped) { create_test_case_rspec_skipped }
+ let(:test_case_error) { create_test_case_rspec_error }
+
+ it { expect(test_suite.name).to eq('Rspec') }
+
+ describe '#add_test_case' do
+ context 'when status of the test case is success' do
+ it 'stores data correctly' do
+ test_suite.add_test_case(test_case_success)
+
+ expect(test_suite.test_cases[test_case_success.status][test_case_success.key])
+ .to eq(test_case_success)
+ expect(test_suite.total_time).to eq(1.11)
+ end
+ end
+
+ context 'when status of the test case is failed' do
+ it 'stores data correctly' do
+ test_suite.add_test_case(test_case_failed)
+
+ expect(test_suite.test_cases[test_case_failed.status][test_case_failed.key])
+ .to eq(test_case_failed)
+ expect(test_suite.total_time).to eq(2.22)
+ end
+ end
+
+ context 'when two test cases are added' do
+ it 'sums up total time' do
+ test_suite.add_test_case(test_case_success)
+ test_suite.add_test_case(test_case_failed)
+
+ expect(test_suite.total_time).to eq(3.33)
+ end
+ end
+ end
+
+ describe '#total_count' do
+ subject { test_suite.total_count }
+
+ before do
+ test_suite.add_test_case(test_case_success)
+ test_suite.add_test_case(test_case_failed)
+ end
+
+ it { is_expected.to eq(2) }
+ end
+
+ describe '#total_status' do
+ subject { test_suite.total_status }
+
+ context 'when all test cases succeeded' do
+ before do
+ test_suite.add_test_case(test_case_success)
+ end
+
+ it { is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS) }
+ end
+
+ context 'when a test case failed' do
+ before do
+ test_suite.add_test_case(test_case_success)
+ test_suite.add_test_case(test_case_failed)
+ end
+
+ it { is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED) }
+ end
+ end
+
+ Gitlab::Ci::Reports::TestCase::STATUS_TYPES.each do |status_type|
+ describe "##{status_type}" do
+ subject { test_suite.public_send("#{status_type}") }
+
+ context "when #{status_type} test case exists" do
+ before do
+ test_suite.add_test_case(public_send("test_case_#{status_type}"))
+ end
+
+ it 'returns all success test cases' do
+ is_expected.to eq( { public_send("test_case_#{status_type}").key => public_send("test_case_#{status_type}") })
+ end
+ end
+
+ context "when #{status_type} test case do not exist" do
+ it 'returns nothing' do
+ is_expected.to be_empty
+ end
+ end
+ end
+ end
+
+ Gitlab::Ci::Reports::TestCase::STATUS_TYPES.each do |status_type|
+ describe "##{status_type}_count" do
+ subject { test_suite.public_send("#{status_type}_count") }
+
+ context "when #{status_type} test case exists" do
+ before do
+ test_suite.add_test_case(public_send("test_case_#{status_type}"))
+ end
+
+ it 'returns the count' do
+ is_expected.to eq(1)
+ end
+ end
+
+ context "when #{status_type} test case do not exist" do
+ it 'returns nothing' do
+ is_expected.to be(0)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/cleanup/project_uploads_spec.rb b/spec/lib/gitlab/cleanup/project_uploads_spec.rb
new file mode 100644
index 00000000000..37b38776775
--- /dev/null
+++ b/spec/lib/gitlab/cleanup/project_uploads_spec.rb
@@ -0,0 +1,278 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Cleanup::ProjectUploads do
+ subject { described_class.new(logger: logger) }
+ let(:logger) { double(:logger) }
+
+ before do
+ allow(logger).to receive(:info).at_least(1).times
+ allow(logger).to receive(:debug).at_least(1).times
+ end
+
+ describe '#run!' do
+ shared_examples_for 'moves the file' do
+ shared_examples_for 'a real run' do
+ let(:args) { [dry_run: false] }
+
+ it 'moves the file to its proper location' do
+ subject.run!(*args)
+
+ expect(File.exist?(path)).to be_falsey
+ expect(File.exist?(new_path)).to be_truthy
+ end
+
+ it 'logs action as done' do
+ expect(logger).to receive(:info).with("Looking for orphaned project uploads to clean up...")
+ expect(logger).to receive(:info).with("Did #{action}")
+
+ subject.run!(*args)
+ end
+ end
+
+ shared_examples_for 'a dry run' do
+ it 'does not move the file' do
+ subject.run!(*args)
+
+ expect(File.exist?(path)).to be_truthy
+ expect(File.exist?(new_path)).to be_falsey
+ end
+
+ it 'logs action as able to be done' do
+ expect(logger).to receive(:info).with("Looking for orphaned project uploads to clean up. Dry run...")
+ expect(logger).to receive(:info).with("Can #{action}")
+
+ subject.run!(*args)
+ end
+ end
+
+ context 'when dry_run is false' do
+ let(:args) { [dry_run: false] }
+
+ it_behaves_like 'a real run'
+ end
+
+ context 'when dry_run is nil' do
+ let(:args) { [dry_run: nil] }
+
+ it_behaves_like 'a real run'
+ end
+
+ context 'when dry_run is true' do
+ let(:args) { [dry_run: true] }
+
+ it_behaves_like 'a dry run'
+ end
+
+ context 'with dry_run not specified' do
+ let(:args) { [] }
+
+ it_behaves_like 'a dry run'
+ end
+ end
+
+ shared_examples_for 'moves the file to lost and found' do
+ let(:action) { "move to lost and found #{path} -> #{new_path}" }
+
+ it_behaves_like 'moves the file'
+ end
+
+ shared_examples_for 'fixes the file' do
+ let(:action) { "fix #{path} -> #{new_path}" }
+
+ it_behaves_like 'moves the file'
+ end
+
+ context 'orphaned project upload file' do
+ context 'when an upload record matching the secret and filename is found' do
+ context 'when the project is still in legacy storage' do
+ let(:orphaned) { create(:upload, :issuable_upload, :with_file, model: create(:project, :legacy_storage)) }
+ let(:new_path) { orphaned.absolute_path }
+ let(:path) { File.join(FileUploader.root, 'some', 'wrong', 'location', orphaned.path) }
+
+ before do
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.mv(new_path, path)
+ end
+
+ it_behaves_like 'fixes the file'
+ end
+
+ context 'when the project was moved to hashed storage' do
+ let(:orphaned) { create(:upload, :issuable_upload, :with_file) }
+ let(:new_path) { orphaned.absolute_path }
+ let(:path) { File.join(FileUploader.root, 'some', 'wrong', 'location', orphaned.path) }
+
+ before do
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.mv(new_path, path)
+ end
+
+ it_behaves_like 'fixes the file'
+ end
+
+ context 'when the project is missing (the upload *record* is an orphan)' do
+ let(:orphaned) { create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage)) }
+ let!(:path) { orphaned.absolute_path }
+ let!(:new_path) { File.join(FileUploader.root, '-', 'project-lost-found', orphaned.model.full_path, orphaned.path) }
+
+ before do
+ orphaned.model.delete
+ end
+
+ it_behaves_like 'moves the file to lost and found'
+ end
+
+ # We will probably want to add logic (Reschedule background upload) to
+ # cover Case 2 in https://gitlab.com/gitlab-org/gitlab-ce/issues/46535#note_75355104
+ context 'when the file should be in object storage' do
+ context 'when the file otherwise has the correct local path' do
+ let!(:orphaned) { create(:upload, :issuable_upload, :object_storage, model: build(:project, :legacy_storage)) }
+ let!(:path) { File.join(FileUploader.root, orphaned.model.full_path, orphaned.path) }
+
+ before do
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.touch(path)
+ end
+
+ it 'does not move the file' do
+ expect(File.exist?(path)).to be_truthy
+
+ subject.run!(dry_run: false)
+
+ expect(File.exist?(path)).to be_truthy
+ end
+ end
+
+ # E.g. the upload file was orphaned, and then uploads were migrated to
+ # object storage
+ context 'when the file has the wrong local path' do
+ let!(:orphaned) { create(:upload, :issuable_upload, :object_storage, model: build(:project, :legacy_storage)) }
+ let!(:path) { File.join(FileUploader.root, 'wrong', orphaned.path) }
+ let!(:new_path) { File.join(FileUploader.root, '-', 'project-lost-found', 'wrong', orphaned.path) }
+
+ before do
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.touch(path)
+ end
+
+ it_behaves_like 'moves the file to lost and found'
+ end
+ end
+ end
+
+ context 'when a matching upload record can not be found' do
+ context 'when the file path fits the known pattern' do
+ let!(:orphaned) { create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage)) }
+ let!(:path) { orphaned.absolute_path }
+ let!(:new_path) { File.join(FileUploader.root, '-', 'project-lost-found', orphaned.model.full_path, orphaned.path) }
+
+ before do
+ orphaned.delete
+ end
+
+ it_behaves_like 'moves the file to lost and found'
+ end
+
+ context 'when the file path does not fit the known pattern' do
+ let!(:invalid_path) { File.join('group', 'file.jpg') }
+ let!(:path) { File.join(FileUploader.root, invalid_path) }
+ let!(:new_path) { File.join(FileUploader.root, '-', 'project-lost-found', invalid_path) }
+
+ before do
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.touch(path)
+ end
+
+ after do
+ File.delete(path) if File.exist?(path)
+ end
+
+ it_behaves_like 'moves the file to lost and found'
+ end
+ end
+ end
+
+ context 'non-orphaned project upload file' do
+ it 'does not move the file' do
+ tracked = create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage))
+ tracked_path = tracked.absolute_path
+
+ expect(logger).not_to receive(:info).with(/move|fix/i)
+ expect(File.exist?(tracked_path)).to be_truthy
+
+ subject.run!(dry_run: false)
+
+ expect(File.exist?(tracked_path)).to be_truthy
+ end
+ end
+
+ context 'ignorable cases' do
+ # Because we aren't concerned about these, and can save a lot of
+ # processing time by ignoring them. If we wish to cleanup hashed storage
+ # directories, it should simply require removing this test and modifying
+ # the find command.
+ context 'when the file is already in hashed storage' do
+ let(:project) { create(:project) }
+
+ before do
+ expect(logger).not_to receive(:info).with(/move|fix/i)
+ end
+
+ it 'does not move even an orphan file' do
+ orphaned = create(:upload, :issuable_upload, :with_file, model: project)
+ path = orphaned.absolute_path
+ orphaned.delete
+
+ expect(File.exist?(path)).to be_truthy
+
+ subject.run!(dry_run: false)
+
+ expect(File.exist?(path)).to be_truthy
+ end
+ end
+
+ it 'does not move any non-project (FileUploader) uploads' do
+ paths = []
+ orphaned1 = create(:upload, :personal_snippet_upload, :with_file)
+ orphaned2 = create(:upload, :namespace_upload, :with_file)
+ orphaned3 = create(:upload, :attachment_upload, :with_file)
+ paths << orphaned1.absolute_path
+ paths << orphaned2.absolute_path
+ paths << orphaned3.absolute_path
+ Upload.delete_all
+
+ expect(logger).not_to receive(:info).with(/move|fix/i)
+ paths.each do |path|
+ expect(File.exist?(path)).to be_truthy
+ end
+
+ subject.run!(dry_run: false)
+
+ paths.each do |path|
+ expect(File.exist?(path)).to be_truthy
+ end
+ end
+
+ it 'does not move any uploads in tmp (which would interfere with ongoing upload activity)' do
+ path = File.join(FileUploader.root, 'tmp', 'foo.jpg')
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.touch(path)
+
+ expect(logger).not_to receive(:info).with(/move|fix/i)
+ expect(File.exist?(path)).to be_truthy
+
+ subject.run!(dry_run: false)
+
+ expect(File.exist?(path)).to be_truthy
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/gitaly_client/storage_service_spec.rb b/spec/lib/gitlab/gitaly_client/storage_service_spec.rb
new file mode 100644
index 00000000000..6c25e2d6ebd
--- /dev/null
+++ b/spec/lib/gitlab/gitaly_client/storage_service_spec.rb
@@ -0,0 +1,13 @@
+require 'spec_helper'
+
+describe Gitlab::GitalyClient::StorageService do
+ describe '#delete_all_repositories' do
+ let!(:project) { create(:project, :repository) }
+
+ it 'removes all repositories' do
+ described_class.new(project.repository_storage).delete_all_repositories
+
+ expect(project.repository.exists?).to be(false)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index b3e3ead9c5e..e9a1932407d 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -89,6 +89,7 @@ merge_requests:
- merge_request_diff
- events
- merge_requests_closing_issues
+- cached_closes_issues
- metrics
- timelogs
- head_pipeline
diff --git a/spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb b/spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb
new file mode 100644
index 00000000000..287745eb40e
--- /dev/null
+++ b/spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb
@@ -0,0 +1,89 @@
+require 'spec_helper'
+
+describe Gitlab::ImportExport::FileImporter do
+ let(:shared) { Gitlab::ImportExport::Shared.new(nil) }
+ let(:storage_path) { "#{Dir.tmpdir}/file_importer_spec" }
+ let(:valid_file) { "#{shared.export_path}/valid.json" }
+ let(:symlink_file) { "#{shared.export_path}/invalid.json" }
+ let(:hidden_symlink_file) { "#{shared.export_path}/.hidden" }
+ let(:subfolder_symlink_file) { "#{shared.export_path}/subfolder/invalid.json" }
+ let(:evil_symlink_file) { "#{shared.export_path}/.\nevil" }
+
+ before do
+ stub_const('Gitlab::ImportExport::FileImporter::MAX_RETRIES', 0)
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+
+ allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(storage_path)
+ allow_any_instance_of(Gitlab::ImportExport::CommandLineUtil).to receive(:untar_zxf).and_return(true)
+ allow_any_instance_of(Gitlab::ImportExport::Shared).to receive(:relative_archive_path).and_return('test')
+ allow(SecureRandom).to receive(:hex).and_return('abcd')
+ setup_files
+ end
+
+ after do
+ FileUtils.rm_rf(storage_path)
+ end
+
+ context 'normal run' do
+ before do
+ described_class.import(project: build(:project), archive_file: '', shared: shared)
+ end
+
+ it 'removes symlinks in root folder' do
+ expect(File.exist?(symlink_file)).to be false
+ end
+
+ it 'removes hidden symlinks in root folder' do
+ expect(File.exist?(hidden_symlink_file)).to be false
+ end
+
+ it 'removes evil symlinks in root folder' do
+ expect(File.exist?(evil_symlink_file)).to be false
+ end
+
+ it 'removes symlinks in subfolders' do
+ expect(File.exist?(subfolder_symlink_file)).to be false
+ end
+
+ it 'does not remove a valid file' do
+ expect(File.exist?(valid_file)).to be true
+ end
+
+ it 'creates the file in the right subfolder' do
+ expect(shared.export_path).to include('test/abcd')
+ end
+ end
+
+ context 'error' do
+ before do
+ allow_any_instance_of(described_class).to receive(:wait_for_archived_file).and_raise(StandardError)
+ described_class.import(project: build(:project), archive_file: '', shared: shared)
+ end
+
+ it 'removes symlinks in root folder' do
+ expect(File.exist?(symlink_file)).to be false
+ end
+
+ it 'removes hidden symlinks in root folder' do
+ expect(File.exist?(hidden_symlink_file)).to be false
+ end
+
+ it 'removes symlinks in subfolders' do
+ expect(File.exist?(subfolder_symlink_file)).to be false
+ end
+
+ it 'does not remove a valid file' do
+ expect(File.exist?(valid_file)).to be true
+ end
+ end
+
+ def setup_files
+ FileUtils.mkdir_p("#{shared.export_path}/subfolder/")
+ FileUtils.touch(valid_file)
+ FileUtils.ln_s(valid_file, symlink_file)
+ FileUtils.ln_s(valid_file, subfolder_symlink_file)
+ FileUtils.ln_s(valid_file, hidden_symlink_file)
+ FileUtils.ln_s(valid_file, evil_symlink_file)
+ end
+end
diff --git a/spec/lib/gitlab/import_export/file_importer_spec.rb b/spec/lib/gitlab/import_export/file_importer_spec.rb
index 265937f899e..78fccdf1dfc 100644
--- a/spec/lib/gitlab/import_export/file_importer_spec.rb
+++ b/spec/lib/gitlab/import_export/file_importer_spec.rb
@@ -24,7 +24,7 @@ describe Gitlab::ImportExport::FileImporter do
context 'normal run' do
before do
- described_class.import(archive_file: '', shared: shared)
+ described_class.import(project: nil, archive_file: '', shared: shared)
end
it 'removes symlinks in root folder' do
@@ -55,7 +55,7 @@ describe Gitlab::ImportExport::FileImporter do
context 'error' do
before do
allow_any_instance_of(described_class).to receive(:wait_for_archived_file).and_raise(StandardError)
- described_class.import(archive_file: '', shared: shared)
+ described_class.import(project: nil, archive_file: '', shared: shared)
end
it 'removes symlinks in root folder' do
diff --git a/spec/lib/gitlab/import_export/importer_object_storage_spec.rb b/spec/lib/gitlab/import_export/importer_object_storage_spec.rb
new file mode 100644
index 00000000000..24a994b3611
--- /dev/null
+++ b/spec/lib/gitlab/import_export/importer_object_storage_spec.rb
@@ -0,0 +1,115 @@
+require 'spec_helper'
+
+describe Gitlab::ImportExport::Importer do
+ let(:user) { create(:user) }
+ let(:test_path) { "#{Dir.tmpdir}/importer_spec" }
+ let(:shared) { project.import_export_shared }
+ let(:project) { create(:project) }
+ let(:import_file) { fixture_file_upload('spec/features/projects/import_export/test_project_export.tar.gz') }
+
+ subject(:importer) { described_class.new(project) }
+
+ before do
+ allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(test_path)
+ allow_any_instance_of(Gitlab::ImportExport::FileImporter).to receive(:remove_import_file)
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+
+ FileUtils.mkdir_p(shared.export_path)
+ ImportExportUpload.create(project: project, import_file: import_file)
+ end
+
+ after do
+ FileUtils.rm_rf(test_path)
+ end
+
+ describe '#execute' do
+ it 'succeeds' do
+ importer.execute
+
+ expect(shared.errors).to be_empty
+ end
+
+ it 'extracts the archive' do
+ expect(Gitlab::ImportExport::FileImporter).to receive(:import).and_call_original
+
+ importer.execute
+ end
+
+ it 'checks the version' do
+ expect(Gitlab::ImportExport::VersionChecker).to receive(:check!).and_call_original
+
+ importer.execute
+ end
+
+ context 'all restores are executed' do
+ [
+ Gitlab::ImportExport::AvatarRestorer,
+ Gitlab::ImportExport::RepoRestorer,
+ Gitlab::ImportExport::WikiRestorer,
+ Gitlab::ImportExport::UploadsRestorer,
+ Gitlab::ImportExport::LfsRestorer,
+ Gitlab::ImportExport::StatisticsRestorer
+ ].each do |restorer|
+ it "calls the #{restorer}" do
+ fake_restorer = double(restorer.to_s)
+
+ expect(fake_restorer).to receive(:restore).and_return(true).at_least(1)
+ expect(restorer).to receive(:new).and_return(fake_restorer).at_least(1)
+
+ importer.execute
+ end
+ end
+
+ it 'restores the ProjectTree' do
+ expect(Gitlab::ImportExport::ProjectTreeRestorer).to receive(:new).and_call_original
+
+ importer.execute
+ end
+
+ it 'removes the import file' do
+ expect(importer).to receive(:remove_import_file).and_call_original
+
+ importer.execute
+
+ expect(project.import_export_upload.import_file&.file).to be_nil
+ end
+ end
+
+ context 'when project successfully restored' do
+ let!(:existing_project) { create(:project, namespace: user.namespace) }
+ let(:project) { create(:project, namespace: user.namespace, name: 'whatever', path: 'whatever') }
+
+ before do
+ restorers = double(:restorers, all?: true)
+
+ allow(subject).to receive(:import_file).and_return(true)
+ allow(subject).to receive(:check_version!).and_return(true)
+ allow(subject).to receive(:restorers).and_return(restorers)
+ allow(project).to receive(:import_data).and_return(double(data: { 'original_path' => existing_project.path }))
+ end
+
+ context 'when import_data' do
+ context 'has original_path' do
+ it 'overwrites existing project' do
+ expect_any_instance_of(::Projects::OverwriteProjectService).to receive(:execute).with(existing_project)
+
+ subject.execute
+ end
+ end
+
+ context 'has not original_path' do
+ before do
+ allow(project).to receive(:import_data).and_return(double(data: {}))
+ end
+
+ it 'does not call the overwrite service' do
+ expect_any_instance_of(::Projects::OverwriteProjectService).not_to receive(:execute).with(existing_project)
+
+ subject.execute
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import_export/importer_spec.rb b/spec/lib/gitlab/import_export/importer_spec.rb
index c074e61da26..f07946824c4 100644
--- a/spec/lib/gitlab/import_export/importer_spec.rb
+++ b/spec/lib/gitlab/import_export/importer_spec.rb
@@ -10,9 +10,10 @@ describe Gitlab::ImportExport::Importer do
before do
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(test_path)
+ allow_any_instance_of(Gitlab::ImportExport::FileImporter).to receive(:remove_import_file)
+
FileUtils.mkdir_p(shared.export_path)
FileUtils.cp(Rails.root.join('spec/features/projects/import_export/test_project_export.tar.gz'), test_path)
- allow(subject).to receive(:remove_import_file)
end
after do
@@ -69,7 +70,7 @@ describe Gitlab::ImportExport::Importer do
let(:project) { create(:project, namespace: user.namespace, name: 'whatever', path: 'whatever') }
before do
- restorers = double
+ restorers = double(:restorers, all?: true)
allow(subject).to receive(:import_file).and_return(true)
allow(subject).to receive(:check_version!).and_return(true)
diff --git a/spec/lib/gitlab/import_sources_spec.rb b/spec/lib/gitlab/import_sources_spec.rb
index 25827423914..94abf9679c4 100644
--- a/spec/lib/gitlab/import_sources_spec.rb
+++ b/spec/lib/gitlab/import_sources_spec.rb
@@ -5,15 +5,16 @@ describe Gitlab::ImportSources do
it 'returns a hash' do
expected =
{
- 'GitHub' => 'github',
- 'Bitbucket' => 'bitbucket',
- 'GitLab.com' => 'gitlab',
- 'Google Code' => 'google_code',
- 'FogBugz' => 'fogbugz',
- 'Repo by URL' => 'git',
- 'GitLab export' => 'gitlab_project',
- 'Gitea' => 'gitea',
- 'Manifest file' => 'manifest'
+ 'GitHub' => 'github',
+ 'Bitbucket Cloud' => 'bitbucket',
+ 'Bitbucket Server' => 'bitbucket_server',
+ 'GitLab.com' => 'gitlab',
+ 'Google Code' => 'google_code',
+ 'FogBugz' => 'fogbugz',
+ 'Repo by URL' => 'git',
+ 'GitLab export' => 'gitlab_project',
+ 'Gitea' => 'gitea',
+ 'Manifest file' => 'manifest'
}
expect(described_class.options).to eq(expected)
@@ -26,6 +27,7 @@ describe Gitlab::ImportSources do
%w(
github
bitbucket
+ bitbucket_server
gitlab
google_code
fogbugz
@@ -45,6 +47,7 @@ describe Gitlab::ImportSources do
%w(
github
bitbucket
+ bitbucket_server
gitlab
google_code
fogbugz
@@ -60,6 +63,7 @@ describe Gitlab::ImportSources do
import_sources = {
'github' => Gitlab::GithubImport::ParallelImporter,
'bitbucket' => Gitlab::BitbucketImport::Importer,
+ 'bitbucket_server' => Gitlab::BitbucketServerImport::Importer,
'gitlab' => Gitlab::GitlabImport::Importer,
'google_code' => Gitlab::GoogleCodeImport::Importer,
'fogbugz' => Gitlab::FogbugzImport::Importer,
@@ -79,7 +83,8 @@ describe Gitlab::ImportSources do
describe '.title' do
import_sources = {
'github' => 'GitHub',
- 'bitbucket' => 'Bitbucket',
+ 'bitbucket' => 'Bitbucket Cloud',
+ 'bitbucket_server' => 'Bitbucket Server',
'gitlab' => 'GitLab.com',
'google_code' => 'Google Code',
'fogbugz' => 'FogBugz',
@@ -97,7 +102,7 @@ describe Gitlab::ImportSources do
end
describe 'imports_repository? checker' do
- let(:allowed_importers) { %w[github gitlab_project] }
+ let(:allowed_importers) { %w[github gitlab_project bitbucket_server] }
it 'fails if any importer other than the allowed ones implements this method' do
current_importers = described_class.values.select { |kind| described_class.importer(kind).try(:imports_repository?) }
diff --git a/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb b/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
index 25c6fa3b9a3..cd456a45287 100644
--- a/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
@@ -14,7 +14,7 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
let(:commands) do
<<~EOS
helm init --client-only >/dev/null
- helm install #{application.chart} --name #{application.name} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
+ helm install #{application.chart} --name #{application.name} --version #{application.version} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
EOS
end
end
@@ -42,7 +42,7 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
<<~EOS
helm init --client-only >/dev/null
helm repo add #{application.name} #{application.repository}
- helm install #{application.chart} --name #{application.name} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
+ helm install #{application.chart} --name #{application.name} --version #{application.version} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
EOS
end
end
@@ -56,7 +56,7 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
<<~EOS
helm init --client-only >/dev/null
helm repo add #{application.name} #{application.repository}
- helm install #{application.chart} --name #{application.name} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
+ helm install #{application.chart} --name #{application.name} --version #{application.version} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
EOS
end
end
diff --git a/spec/migrations/add_foreign_key_from_notification_settings_to_users_spec.rb b/spec/migrations/add_foreign_key_from_notification_settings_to_users_spec.rb
new file mode 100644
index 00000000000..656d4f75e3b
--- /dev/null
+++ b/spec/migrations/add_foreign_key_from_notification_settings_to_users_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20180710162338_add_foreign_key_from_notification_settings_to_users.rb')
+
+describe AddForeignKeyFromNotificationSettingsToUsers, :migration do
+ let(:notification_settings) { table(:notification_settings) }
+ let(:users) { table(:users) }
+ let(:projects) { table(:projects) }
+
+ before do
+ users.create!(email: 'email@email.com', name: 'foo', username: 'foo', projects_limit: 0)
+ projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce', namespace_id: 1)
+ end
+
+ describe 'removal of orphans without user' do
+ let!(:notification_setting_without_user) { create_notification_settings!(user_id: 123) }
+ let!(:notification_setting_with_user) { create_notification_settings!(user_id: users.last.id) }
+
+ it 'removes orphaned notification_settings without user' do
+ expect { migrate! }.to change { notification_settings.count }.by(-1)
+ end
+
+ it "doesn't remove notification_settings with valid user" do
+ expect { migrate! }.not_to change { notification_setting_with_user.reload }
+ end
+ end
+
+ def create_notification_settings!(**opts)
+ notification_settings.create!(
+ source_id: projects.last.id,
+ source_type: 'Project',
+ user_id: users.last.id,
+ **opts)
+ end
+end
diff --git a/spec/migrations/normalize_ldap_extern_uids_spec.rb b/spec/migrations/normalize_ldap_extern_uids_spec.rb
index c6ea1e3e49e..a23a5d54e0a 100644
--- a/spec/migrations/normalize_ldap_extern_uids_spec.rb
+++ b/spec/migrations/normalize_ldap_extern_uids_spec.rb
@@ -27,11 +27,11 @@ describe NormalizeLdapExternUids, :migration, :sidekiq do
migrate!
expect(BackgroundMigrationWorker.jobs[0]['args']).to eq([described_class::MIGRATION, [1, 2]])
- expect(BackgroundMigrationWorker.jobs[0]['at']).to eq(5.minutes.from_now.to_f)
+ expect(BackgroundMigrationWorker.jobs[0]['at']).to eq(2.minutes.from_now.to_f)
expect(BackgroundMigrationWorker.jobs[1]['args']).to eq([described_class::MIGRATION, [3, 4]])
- expect(BackgroundMigrationWorker.jobs[1]['at']).to eq(10.minutes.from_now.to_f)
+ expect(BackgroundMigrationWorker.jobs[1]['at']).to eq(4.minutes.from_now.to_f)
expect(BackgroundMigrationWorker.jobs[2]['args']).to eq([described_class::MIGRATION, [5, 5]])
- expect(BackgroundMigrationWorker.jobs[2]['at']).to eq(15.minutes.from_now.to_f)
+ expect(BackgroundMigrationWorker.jobs[2]['at']).to eq(6.minutes.from_now.to_f)
expect(BackgroundMigrationWorker.jobs.size).to eq 3
end
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 6955f7f4cd8..32b8755ee9a 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -151,6 +151,42 @@ describe Ci::Build do
end
end
+ describe '.with_test_reports' do
+ subject { described_class.with_test_reports }
+
+ context 'when build has a test report' do
+ let!(:build) { create(:ci_build, :success, :test_reports) }
+
+ it 'selects the build' do
+ is_expected.to eq([build])
+ end
+ end
+
+ context 'when build does not have test reports' do
+ let!(:build) { create(:ci_build, :success, :trace_artifact) }
+
+ it 'does not select the build' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when there are multiple builds with test reports' do
+ let!(:builds) { create_list(:ci_build, 5, :success, :test_reports) }
+
+ it 'does not execute a query for selecting job artifact one by one' do
+ recorded = ActiveRecord::QueryRecorder.new do
+ subject.each do |build|
+ Ci::JobArtifact::TEST_REPORT_FILE_TYPES.each do |file_type|
+ build.public_send("job_artifacts_#{file_type}").file.exists?
+ end
+ end
+ end
+
+ expect(recorded.count).to eq(2)
+ end
+ end
+ end
+
describe '#actionize' do
context 'when build is a created' do
before do
@@ -2760,6 +2796,60 @@ describe Ci::Build do
end
end
+ describe '#collect_test_reports!' do
+ subject { build.collect_test_reports!(test_reports) }
+
+ let(:test_reports) { Gitlab::Ci::Reports::TestReports.new }
+
+ it { expect(test_reports.get_suite(build.name).total_count).to eq(0) }
+
+ context 'when build has a test report' do
+ context 'when there is a JUnit test report from rspec test suite' do
+ before do
+ create(:ci_job_artifact, :junit, job: build, project: build.project)
+ end
+
+ it 'parses blobs and add the results to the test suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_reports.get_suite(build.name).total_count).to eq(4)
+ expect(test_reports.get_suite(build.name).success_count).to be(2)
+ expect(test_reports.get_suite(build.name).failed_count).to be(2)
+ end
+ end
+
+ context 'when there is a JUnit test report from java ant test suite' do
+ before do
+ create(:ci_job_artifact, :junit_with_ant, job: build, project: build.project)
+ end
+
+ it 'parses blobs and add the results to the test suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_reports.get_suite(build.name).total_count).to eq(3)
+ expect(test_reports.get_suite(build.name).success_count).to be(3)
+ expect(test_reports.get_suite(build.name).failed_count).to be(0)
+ end
+ end
+
+ context 'when there is a corrupted JUnit test report' do
+ before do
+ create(:ci_job_artifact, :junit_with_corrupted_data, job: build, project: build.project)
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(Gitlab::Ci::Parsers::Junit::JunitParserError)
+ end
+ end
+ end
+
+ context 'when build does not have test reports' do
+ it 'raises an error' do
+ expect { subject }.to raise_error(NoMethodError)
+ end
+ end
+ end
+
describe '#artifacts_metadata_entry' do
set(:build) { create(:ci_build, project: project) }
let(:path) { 'other_artifacts_0.1.2/another-subdirectory/banana_sample.gif' }
diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb
index 4f34c2e81f8..1bf338f4c70 100644
--- a/spec/models/ci/job_artifact_spec.rb
+++ b/spec/models/ci/job_artifact_spec.rb
@@ -147,6 +147,34 @@ describe Ci::JobArtifact do
end
end
+ describe '#each_blob' do
+ context 'when file format is gzip' do
+ context 'when gzip file contains one file' do
+ let(:artifact) { build(:ci_job_artifact, :junit) }
+
+ it 'iterates blob once' do
+ expect { |b| artifact.each_blob(&b) }.to yield_control.once
+ end
+ end
+
+ context 'when gzip file contains three files' do
+ let(:artifact) { build(:ci_job_artifact, :junit_with_three_testsuites) }
+
+ it 'iterates blob three times' do
+ expect { |b| artifact.each_blob(&b) }.to yield_control.exactly(3).times
+ end
+ end
+ end
+
+ context 'when there are no adapters for the file format' do
+ let(:artifact) { build(:ci_job_artifact, :junit, file_format: :zip) }
+
+ it 'raises an error' do
+ expect { |b| artifact.each_blob(&b) }.to raise_error(described_class::NotSupportedAdapterError)
+ end
+ end
+ end
+
describe '#expire_in' do
subject { artifact.expire_in }
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index a41657b53b7..3512ba6aee5 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -1851,6 +1851,62 @@ describe Ci::Pipeline, :mailer do
end
end
+ describe '#has_test_reports?' do
+ subject { pipeline.has_test_reports? }
+
+ context 'when pipeline has builds with test reports' do
+ before do
+ create(:ci_build, pipeline: pipeline, project: project).tap do |build|
+ create(:ci_job_artifact, :junit, job: build, project: build.project)
+ end
+ end
+
+ context 'when pipeline status is running' do
+ let(:pipeline) { create(:ci_pipeline, :running, project: project) }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when pipeline status is success' do
+ let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+
+ it { is_expected.to be_truthy }
+ end
+ end
+
+ context 'when pipeline does not have builds with test reports' do
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#test_reports' do
+ subject { pipeline.test_reports }
+
+ context 'when pipeline has multiple builds with test reports' do
+ before do
+ create(:ci_build, :success, name: 'rspec', pipeline: pipeline, project: project).tap do |build|
+ create(:ci_job_artifact, :junit, job: build, project: build.project)
+ end
+
+ create(:ci_build, :success, name: 'java', pipeline: pipeline, project: project).tap do |build|
+ create(:ci_job_artifact, :junit_with_ant, job: build, project: build.project)
+ end
+ end
+
+ it 'returns test reports with collected data' do
+ expect(subject.total_count).to be(7)
+ expect(subject.success_count).to be(5)
+ expect(subject.failed_count).to be(2)
+ end
+ end
+
+ context 'when pipeline does not have any builds with test reports' do
+ it 'returns empty test reports' do
+ expect(subject.total_count).to be(0)
+ end
+ end
+ end
+
describe '#total_size' do
let!(:build_job1) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
let!(:build_job2) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
diff --git a/spec/models/clusters/applications/ingress_spec.rb b/spec/models/clusters/applications/ingress_spec.rb
index bb5b2ef3a47..d378248d5d6 100644
--- a/spec/models/clusters/applications/ingress_spec.rb
+++ b/spec/models/clusters/applications/ingress_spec.rb
@@ -23,6 +23,20 @@ describe Clusters::Applications::Ingress do
it { is_expected.to contain_exactly(cluster) }
end
+ describe '#make_installing!' do
+ before do
+ application.make_installing!
+ end
+
+ context 'application install previously errored with older version' do
+ let(:application) { create(:clusters_applications_ingress, :scheduled, version: '0.22.0') }
+
+ it 'updates the application version' do
+ expect(application.reload.version).to eq('0.23.0')
+ end
+ end
+ end
+
describe '#make_installed!' do
before do
application.make_installed!
@@ -73,9 +87,17 @@ describe Clusters::Applications::Ingress do
it 'should be initialized with ingress arguments' do
expect(subject.name).to eq('ingress')
expect(subject.chart).to eq('stable/nginx-ingress')
- expect(subject.version).to be_nil
+ expect(subject.version).to eq('0.23.0')
expect(subject.values).to eq(ingress.values)
end
+
+ context 'application failed to install previously' do
+ let(:ingress) { create(:clusters_applications_ingress, :errored, version: 'nginx') }
+
+ it 'should be initialized with the locked version' do
+ expect(subject.version).to eq('0.23.0')
+ end
+ end
end
describe '#values' do
diff --git a/spec/models/clusters/applications/jupyter_spec.rb b/spec/models/clusters/applications/jupyter_spec.rb
index 65750141e65..e0d57ac65f7 100644
--- a/spec/models/clusters/applications/jupyter_spec.rb
+++ b/spec/models/clusters/applications/jupyter_spec.rb
@@ -25,6 +25,20 @@ describe Clusters::Applications::Jupyter do
end
end
+ describe '#make_installing!' do
+ before do
+ application.make_installing!
+ end
+
+ context 'application install previously errored with older version' do
+ let(:application) { create(:clusters_applications_jupyter, :scheduled, version: 'v0.5') }
+
+ it 'updates the application version' do
+ expect(application.reload.version).to eq('v0.6')
+ end
+ end
+ end
+
describe '#install_command' do
let!(:ingress) { create(:clusters_applications_ingress, :installed, external_ip: '127.0.0.1') }
let!(:jupyter) { create(:clusters_applications_jupyter, cluster: ingress.cluster) }
@@ -36,10 +50,18 @@ describe Clusters::Applications::Jupyter do
it 'should be initialized with 4 arguments' do
expect(subject.name).to eq('jupyter')
expect(subject.chart).to eq('jupyter/jupyterhub')
- expect(subject.version).to be_nil
+ expect(subject.version).to eq('v0.6')
expect(subject.repository).to eq('https://jupyterhub.github.io/helm-chart/')
expect(subject.values).to eq(jupyter.values)
end
+
+ context 'application failed to install previously' do
+ let(:jupyter) { create(:clusters_applications_jupyter, :errored, version: '0.0.1') }
+
+ it 'should be initialized with the locked version' do
+ expect(subject.version).to eq('v0.6')
+ end
+ end
end
describe '#values' do
diff --git a/spec/models/clusters/applications/prometheus_spec.rb b/spec/models/clusters/applications/prometheus_spec.rb
index e4b61552033..3812c65b3b6 100644
--- a/spec/models/clusters/applications/prometheus_spec.rb
+++ b/spec/models/clusters/applications/prometheus_spec.rb
@@ -16,6 +16,20 @@ describe Clusters::Applications::Prometheus do
it { is_expected.to contain_exactly(cluster) }
end
+ describe '#make_installing!' do
+ before do
+ application.make_installing!
+ end
+
+ context 'application install previously errored with older version' do
+ let(:application) { create(:clusters_applications_prometheus, :scheduled, version: '6.7.2') }
+
+ it 'updates the application version' do
+ expect(application.reload.version).to eq('6.7.3')
+ end
+ end
+ end
+
describe 'transition to installed' do
let(:project) { create(:project) }
let(:cluster) { create(:cluster, projects: [project]) }
@@ -155,6 +169,14 @@ describe Clusters::Applications::Prometheus do
expect(command.version).to eq('6.7.3')
expect(command.values).to eq(prometheus.values)
end
+
+ context 'application failed to install previously' do
+ let(:prometheus) { create(:clusters_applications_prometheus, :errored, version: '2.0.0') }
+
+ it 'should be initialized with the locked version' do
+ expect(subject.version).to eq('6.7.3')
+ end
+ end
end
describe '#values' do
diff --git a/spec/models/clusters/applications/runner_spec.rb b/spec/models/clusters/applications/runner_spec.rb
index b12500d0acd..526300755b5 100644
--- a/spec/models/clusters/applications/runner_spec.rb
+++ b/spec/models/clusters/applications/runner_spec.rb
@@ -8,6 +8,20 @@ describe Clusters::Applications::Runner do
it { is_expected.to belong_to(:runner) }
+ describe '#make_installing!' do
+ before do
+ application.make_installing!
+ end
+
+ context 'application install previously errored with older version' do
+ let(:application) { create(:clusters_applications_runner, :scheduled, version: '0.1.30') }
+
+ it 'updates the application version' do
+ expect(application.reload.version).to eq('0.1.31')
+ end
+ end
+ end
+
describe '.installed' do
subject { described_class.installed }
@@ -31,10 +45,18 @@ describe Clusters::Applications::Runner do
it 'should be initialized with 4 arguments' do
expect(subject.name).to eq('runner')
expect(subject.chart).to eq('runner/gitlab-runner')
- expect(subject.version).to be_nil
+ expect(subject.version).to eq('0.1.31')
expect(subject.repository).to eq('https://charts.gitlab.io')
expect(subject.values).to eq(gitlab_runner.values)
end
+
+ context 'application failed to install previously' do
+ let(:gitlab_runner) { create(:clusters_applications_runner, :errored, runner: ci_runner, version: '0.1.13') }
+
+ it 'should be initialized with the locked version' do
+ expect(subject.version).to eq('0.1.31')
+ end
+ end
end
describe '#values' do
diff --git a/spec/models/concerns/avatarable_spec.rb b/spec/models/concerns/avatarable_spec.rb
index 9faf21bfbbd..76f734079b7 100644
--- a/spec/models/concerns/avatarable_spec.rb
+++ b/spec/models/concerns/avatarable_spec.rb
@@ -43,6 +43,10 @@ describe Avatarable do
expect(project.avatar_path(only_path: only_path)).to eq(avatar_path)
end
+ it 'returns the expected avatar path with width parameter' do
+ expect(project.avatar_path(only_path: only_path, size: 128)).to eq(avatar_path + "?width=128")
+ end
+
context "when avatar is stored remotely" do
before do
stub_uploads_object_storage(AvatarUploader)
diff --git a/spec/models/deploy_token_spec.rb b/spec/models/deploy_token_spec.rb
index cd84a684fec..3435f93c999 100644
--- a/spec/models/deploy_token_spec.rb
+++ b/spec/models/deploy_token_spec.rb
@@ -74,6 +74,14 @@ describe DeployToken do
expect(deploy_token.active?).to be_falsy
end
end
+
+ context "when it hasn't been revoked and has no expiry" do
+ let(:deploy_token) { create(:deploy_token, expires_at: nil) }
+
+ it 'should return true' do
+ expect(deploy_token.active?).to be_truthy
+ end
+ end
end
describe '#username' do
diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb
index 0aee78ac12d..90cce826b6c 100644
--- a/spec/models/merge_request_diff_spec.rb
+++ b/spec/models/merge_request_diff_spec.rb
@@ -127,6 +127,13 @@ describe MergeRequestDiff do
expect(diffs.map(&:new_path)).to contain_exactly('files/ruby/popen.rb')
end
+ it 'only serializes diff files found by query' do
+ expect(diff_with_commits.merge_request_diff_files.count).to be > 10
+ expect_any_instance_of(MergeRequestDiffFile).to receive(:to_hash).once
+
+ diffs
+ end
+
it 'uses the diffs from the DB' do
expect(diff_with_commits).to receive(:load_diffs)
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index b0d9d03bf6c..3ab6a20cd55 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
describe MergeRequest do
include RepoHelpers
include ProjectForksHelper
+ include ReactiveCachingHelpers
subject { create(:merge_request) }
@@ -310,6 +311,51 @@ describe MergeRequest do
end
end
+ describe '#visible_closing_issues_for' do
+ let(:guest) { create(:user) }
+ let(:developer) { create(:user) }
+ let(:issue_1) { create(:issue, project: subject.source_project) }
+ let(:issue_2) { create(:issue, project: subject.source_project) }
+ let(:confidential_issue) { create(:issue, :confidential, project: subject.source_project) }
+
+ before do
+ subject.project.add_developer(subject.author)
+ subject.target_branch = subject.project.default_branch
+ commit = double('commit1', safe_message: "Fixes #{issue_1.to_reference} #{issue_2.to_reference} #{confidential_issue.to_reference}")
+ allow(subject).to receive(:commits).and_return([commit])
+ end
+
+ it 'shows only allowed issues to guest' do
+ subject.project.add_guest(guest)
+
+ subject.cache_merge_request_closes_issues!
+
+ expect(subject.visible_closing_issues_for(guest)).to match_array([issue_1, issue_2])
+ end
+
+ it 'shows only allowed issues to developer' do
+ subject.project.add_developer(developer)
+
+ subject.cache_merge_request_closes_issues!
+
+ expect(subject.visible_closing_issues_for(developer)).to match_array([issue_1, confidential_issue, issue_2])
+ end
+
+ context 'when external issue tracker is enabled' do
+ before do
+ subject.project.has_external_issue_tracker = true
+ subject.project.save!
+ end
+
+ it 'calls non #closes_issues to retrieve data' do
+ expect(subject).to receive(:closes_issues)
+ expect(subject).not_to receive(:cached_closes_issues)
+
+ subject.visible_closing_issues_for
+ end
+ end
+ end
+
describe '#cache_merge_request_closes_issues!' do
before do
subject.project.add_developer(subject.author)
@@ -324,6 +370,25 @@ describe MergeRequest do
expect { subject.cache_merge_request_closes_issues!(subject.author) }.to change(subject.merge_requests_closing_issues, :count).by(1)
end
+ it 'does not cache closed issues when merge request is closed' do
+ issue = create :issue, project: subject.project
+ commit = double('commit1', safe_message: "Fixes #{issue.to_reference}")
+
+ allow(subject).to receive(:commits).and_return([commit])
+ allow(subject).to receive(:state).and_return("closed")
+
+ expect { subject.cache_merge_request_closes_issues!(subject.author) }.not_to change(subject.merge_requests_closing_issues, :count)
+ end
+
+ it 'does not cache closed issues when merge request is merged' do
+ issue = create :issue, project: subject.project
+ commit = double('commit1', safe_message: "Fixes #{issue.to_reference}")
+ allow(subject).to receive(:commits).and_return([commit])
+ allow(subject).to receive(:state).and_return("merged")
+
+ expect { subject.cache_merge_request_closes_issues!(subject.author) }.not_to change(subject.merge_requests_closing_issues, :count)
+ end
+
context 'when both internal and external issue trackers are enabled' do
before do
subject.project.has_external_issue_tracker = true
@@ -632,6 +697,7 @@ describe MergeRequest do
allow(subject).to receive(:commits).and_return([commit])
allow(subject.project).to receive(:default_branch)
.and_return(subject.target_branch)
+ subject.cache_merge_request_closes_issues!
expect(subject.issues_mentioned_but_not_closing(subject.author)).to match_array([mentioned_issue])
end
@@ -649,6 +715,8 @@ describe MergeRequest do
end
it 'detects issues mentioned in description but not closed' do
+ subject.cache_merge_request_closes_issues!
+
expect(subject.issues_mentioned_but_not_closing(subject.author).map(&:to_s)).to match_array(['TEST-2'])
end
end
@@ -779,9 +847,8 @@ describe MergeRequest do
subject.project.add_developer(subject.author)
subject.description = "This issue Closes #{issue.to_reference}"
-
- allow(subject.project).to receive(:default_branch)
- .and_return(subject.target_branch)
+ allow(subject.project).to receive(:default_branch).and_return(subject.target_branch)
+ subject.cache_merge_request_closes_issues!
expect(subject.merge_commit_message)
.to match("Closes #{issue.to_reference}")
@@ -1079,6 +1146,86 @@ describe MergeRequest do
end
end
+ describe '#has_test_reports?' do
+ subject { merge_request.has_test_reports? }
+
+ let(:project) { create(:project, :repository) }
+
+ context 'when head pipeline has test reports' do
+ let(:merge_request) { create(:merge_request, :with_test_reports, source_project: project) }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when head pipeline does not have test reports' do
+ let(:merge_request) { create(:merge_request, source_project: project) }
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#compare_test_reports' do
+ subject { merge_request.compare_test_reports }
+
+ let(:project) { create(:project, :repository) }
+ let(:merge_request) { create(:merge_request, source_project: project) }
+
+ let!(:base_pipeline) do
+ create(:ci_pipeline,
+ :with_test_reports,
+ project: project,
+ ref: merge_request.target_branch,
+ sha: merge_request.diff_base_sha)
+ end
+
+ before do
+ merge_request.update!(head_pipeline_id: head_pipeline.id)
+ end
+
+ context 'when head pipeline has test reports' do
+ let!(:head_pipeline) do
+ create(:ci_pipeline,
+ :with_test_reports,
+ project: project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha)
+ end
+
+ context 'when reactive cache worker is parsing asynchronously' do
+ it 'returns status' do
+ expect(subject[:status]).to eq(:parsing)
+ end
+ end
+
+ context 'when reactive cache worker is inline' do
+ before do
+ synchronous_reactive_cache(merge_request)
+ end
+
+ it 'returns status and data' do
+ expect_any_instance_of(Ci::CompareTestReportsService)
+ .to receive(:execute).with(base_pipeline.iid, head_pipeline.iid)
+
+ subject
+ end
+ end
+ end
+
+ context 'when head pipeline does not have test reports' do
+ let!(:head_pipeline) do
+ create(:ci_pipeline,
+ project: project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha)
+ end
+
+ it 'returns status and error message' do
+ expect(subject[:status]).to eq(:error)
+ expect(subject[:status_reason]).to eq('This merge request does not have test reports')
+ end
+ end
+ end
+
describe '#all_commit_shas' do
context 'when merge request is persisted' do
let(:all_commit_shas) do
@@ -1207,6 +1354,16 @@ describe MergeRequest do
project.default_branch == branch)
end
+ context 'but merged at timestamp cannot be found' do
+ before do
+ allow(subject).to receive(:merged_at) { nil }
+ end
+
+ it 'returns false' do
+ expect(subject.can_be_reverted?(current_user)).to be_falsey
+ end
+ end
+
context 'when the revert commit is mentioned in a note after the MR was merged' do
it 'returns false' do
expect(subject.can_be_reverted?(current_user)).to be_falsey
@@ -1246,6 +1403,63 @@ describe MergeRequest do
end
end
+ describe '#merged_at' do
+ context 'when MR is not merged' do
+ let(:merge_request) { create(:merge_request, :closed) }
+
+ it 'returns nil' do
+ expect(merge_request.merged_at).to be_nil
+ end
+ end
+
+ context 'when metrics has merged_at data' do
+ let(:merge_request) { create(:merge_request, :merged) }
+
+ before do
+ merge_request.metrics.update!(merged_at: 1.day.ago)
+ end
+
+ it 'returns metrics merged_at' do
+ expect(merge_request.merged_at).to eq(merge_request.metrics.merged_at)
+ end
+ end
+
+ context 'when merged event is persisted, but no metrics merged_at is persisted' do
+ let(:user) { create(:user) }
+ let(:merge_request) { create(:merge_request, :merged) }
+
+ before do
+ EventCreateService.new.merge_mr(merge_request, user)
+ end
+
+ it 'returns merged event creation date' do
+ expect(merge_request.merge_event).to be_persisted
+ expect(merge_request.merged_at).to eq(merge_request.merge_event.created_at)
+ end
+ end
+
+ context 'when merging note is persisted, but no metrics or merge event exists' do
+ let(:user) { create(:user) }
+ let(:merge_request) { create(:merge_request, :merged) }
+
+ before do
+ merge_request.metrics.destroy!
+
+ SystemNoteService.change_status(merge_request,
+ merge_request.target_project,
+ user,
+ merge_request.state, nil)
+ end
+
+ it 'returns merging note creation date' do
+ expect(merge_request.reload.metrics).to be_nil
+ expect(merge_request.merge_event).to be_nil
+ expect(merge_request.notes.count).to eq(1)
+ expect(merge_request.merged_at).to eq(merge_request.notes.first.created_at)
+ end
+ end
+ end
+
describe '#participants' do
let(:project) { create(:project, :public) }
@@ -2010,6 +2224,26 @@ describe MergeRequest do
end
end
+ describe '#base_pipeline' do
+ let(:pipeline_arguments) do
+ {
+ project: project,
+ ref: merge_request.target_branch,
+ sha: merge_request.diff_base_sha
+ }
+ end
+
+ let(:project) { create(:project, :public, :repository) }
+ let(:merge_request) { create(:merge_request, source_project: project) }
+
+ let!(:first_pipeline) { create(:ci_pipeline_without_jobs, pipeline_arguments) }
+ let!(:last_pipeline) { create(:ci_pipeline_without_jobs, pipeline_arguments) }
+
+ it 'returns latest pipeline' do
+ expect(merge_request.base_pipeline).to eq(last_pipeline)
+ end
+ end
+
describe '#has_commits?' do
before do
allow(subject.merge_request_diff).to receive(:commits_count)
diff --git a/spec/models/postgresql/replication_slot_spec.rb b/spec/models/postgresql/replication_slot_spec.rb
new file mode 100644
index 00000000000..919a7526803
--- /dev/null
+++ b/spec/models/postgresql/replication_slot_spec.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Postgresql::ReplicationSlot, :postgresql do
+ describe '.lag_too_great?' do
+ it 'returns true when replication lag is too great' do
+ expect(described_class)
+ .to receive(:pluck)
+ .and_return([125.megabytes])
+
+ expect(described_class.lag_too_great?).to eq(true)
+ end
+
+ it 'returns false when more than one replicas is up to date enough' do
+ expect(described_class)
+ .to receive(:pluck)
+ .and_return([125.megabytes, 0.megabytes, 0.megabytes])
+
+ expect(described_class.lag_too_great?).to eq(false)
+ end
+
+ it 'returns false when replication lag is not too great' do
+ expect(described_class)
+ .to receive(:pluck)
+ .and_return([0.megabytes])
+
+ expect(described_class.lag_too_great?).to eq(false)
+ end
+ end
+end
diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb
index 6c637533c6b..ac9ff59b9b5 100644
--- a/spec/models/project_services/jira_service_spec.rb
+++ b/spec/models/project_services/jira_service_spec.rb
@@ -30,6 +30,10 @@ describe JiraService do
describe "Associations" do
it { is_expected.to belong_to :project }
it { is_expected.to have_one :service_hook }
+ it { is_expected.to allow_value(nil).for(:jira_issue_transition_id) }
+ it { is_expected.to allow_value("1,2,3").for(:jira_issue_transition_id) }
+ it { is_expected.to allow_value("1;2;3").for(:jira_issue_transition_id) }
+ it { is_expected.not_to allow_value("a,b,cd").for(:jira_issue_transition_id) }
end
describe 'Validations' do
@@ -124,7 +128,7 @@ describe JiraService do
url: 'http://jira.example.com',
username: 'gitlab_jira_username',
password: 'gitlab_jira_password',
- jira_issue_transition_id: "custom-id"
+ jira_issue_transition_id: "999"
)
# These stubs are needed to test JiraService#close_issue.
@@ -226,12 +230,49 @@ describe JiraService do
).once
end
- it "calls the api with jira_issue_transition_id" do
- @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+ context '#close_issue' do
+ it "logs exception when transition id is not valid" do
+ allow(Rails.logger).to receive(:info)
+ WebMock.stub_request(:post, @transitions_url).with(basic_auth: %w(gitlab_jira_username gitlab_jira_password)).and_raise("Bad Request")
- expect(WebMock).to have_requested(:post, @transitions_url).with(
- body: /custom-id/
- ).once
+ @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+
+ expect(Rails.logger).to have_received(:info).with("JiraService Issue Transition failed message ERROR: http://jira.example.com - Bad Request")
+ end
+
+ it "calls the api with jira_issue_transition_id" do
+ @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+
+ expect(WebMock).to have_requested(:post, @transitions_url).with(
+ body: /999/
+ ).once
+ end
+
+ context "when have multiple transition ids" do
+ it "calls the api with transition ids separated by comma" do
+ allow(@jira_service).to receive_messages(jira_issue_transition_id: "1,2,3")
+
+ @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+
+ 1.upto(3) do |transition_id|
+ expect(WebMock).to have_requested(:post, @transitions_url).with(
+ body: /#{transition_id}/
+ ).once
+ end
+ end
+
+ it "calls the api with transition ids separated by semicolon" do
+ allow(@jira_service).to receive_messages(jira_issue_transition_id: "1;2;3")
+
+ @jira_service.close_issue(merge_request, ExternalIssue.new("JIRA-123", project))
+
+ 1.upto(3) do |transition_id|
+ expect(WebMock).to have_requested(:post, @transitions_url).with(
+ body: /#{transition_id}/
+ ).once
+ end
+ end
+ end
end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 340d2d95500..03beb9187ed 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -3107,6 +3107,19 @@ describe Project do
allow(project).to receive(:previous_changes).and_return('path' => ['foo'])
end
+ context 'migration to hashed storage' do
+ it 'calls HashedStorageMigrationService with correct options' do
+ project = create(:project, :repository, :legacy_storage)
+ allow(project).to receive(:previous_changes).and_return('path' => ['foo'])
+
+ expect_next_instance_of(::Projects::HashedStorageMigrationService) do |service|
+ expect(service).to receive(:execute).and_return(true)
+ end
+
+ project.rename_repo
+ end
+ end
+
it 'renames a repository' do
stub_container_registry_config(enabled: false)
@@ -3153,8 +3166,10 @@ describe Project do
context 'when not rolled out' do
let(:project) { create(:project, :repository, storage_version: 1, skip_disk_validation: true) }
- it 'moves pages folder to new location' do
- expect_any_instance_of(Gitlab::UploadsTransfer).to receive(:rename_project)
+ it 'moves pages folder to hashed storage' do
+ expect_next_instance_of(Projects::HashedStorage::MigrateAttachmentsService) do |service|
+ expect(service).to receive(:execute)
+ end
project.rename_repo
end
@@ -3292,6 +3307,50 @@ describe Project do
end
end
+ describe '#has_auto_devops_implicitly_enabled?' do
+ set(:project) { create(:project) }
+
+ context 'when disabled in settings' do
+ before do
+ stub_application_setting(auto_devops_enabled: false)
+ end
+
+ it 'does not have auto devops implicitly disabled' do
+ expect(project).not_to have_auto_devops_implicitly_enabled
+ end
+ end
+
+ context 'when enabled in settings' do
+ before do
+ stub_application_setting(auto_devops_enabled: true)
+ end
+
+ it 'auto devops is implicitly disabled' do
+ expect(project).to have_auto_devops_implicitly_enabled
+ end
+
+ context 'when explicitly disabled' do
+ before do
+ create(:project_auto_devops, project: project, enabled: false)
+ end
+
+ it 'does not have auto devops implicitly disabled' do
+ expect(project).not_to have_auto_devops_implicitly_enabled
+ end
+ end
+
+ context 'when explicitly enabled' do
+ before do
+ create(:project_auto_devops, project: project, enabled: true)
+ end
+
+ it 'does not have auto devops implicitly disabled' do
+ expect(project).not_to have_auto_devops_implicitly_enabled
+ end
+ end
+ end
+ end
+
describe '#has_auto_devops_implicitly_disabled?' do
set(:project) { create(:project) }
@@ -3326,7 +3385,7 @@ describe Project do
context 'when explicitly enabled' do
before do
- create(:project_auto_devops, project: project)
+ create(:project_auto_devops, project: project, enabled: true)
end
it 'does not have auto devops implicitly disabled' do
diff --git a/spec/presenters/merge_request_presenter_spec.rb b/spec/presenters/merge_request_presenter_spec.rb
index 46ba6f442f5..a1b52d8692d 100644
--- a/spec/presenters/merge_request_presenter_spec.rb
+++ b/spec/presenters/merge_request_presenter_spec.rb
@@ -117,9 +117,9 @@ describe MergeRequestPresenter do
before do
project.add_developer(user)
-
allow(resource.project).to receive(:default_branch)
.and_return(resource.target_branch)
+ resource.cache_merge_request_closes_issues!
end
describe '#closing_issues_links' do
diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb
index b537b6e1667..85c93f35c20 100644
--- a/spec/requests/api/internal_spec.rb
+++ b/spec/requests/api/internal_spec.rb
@@ -429,7 +429,7 @@ describe API::Internal do
context "archived project" do
before do
project.add_developer(user)
- project.archive!
+ ::Projects::UpdateService.new(project, user, archived: true).execute
end
context "git pull" do
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 1716d182782..4de834bf93a 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -954,6 +954,7 @@ describe API::MergeRequests do
issue = create(:issue, project: project)
mr = merge_request.tap do |mr|
mr.update_attribute(:description, "Closes #{issue.to_reference(mr.project)}")
+ mr.cache_merge_request_closes_issues!
end
get api("/projects/#{project.id}/merge_requests/#{mr.iid}/closes_issues", user)
diff --git a/spec/requests/api/project_import_spec.rb b/spec/requests/api/project_import_spec.rb
index 55332f56508..e3fb6cecce9 100644
--- a/spec/requests/api/project_import_spec.rb
+++ b/spec/requests/api/project_import_spec.rb
@@ -7,6 +7,8 @@ describe API::ProjectImport do
let(:namespace) { create(:group) }
before do
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
namespace.add_owner(user)
end
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 71e3436fa76..eb41750bf47 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -1677,7 +1677,7 @@ describe API::Projects do
context 'on an archived project' do
before do
- project.archive!
+ ::Projects::UpdateService.new(project, user, archived: true).execute
end
it 'remains archived' do
@@ -1713,7 +1713,7 @@ describe API::Projects do
context 'on an archived project' do
before do
- project.archive!
+ ::Projects::UpdateService.new(project, user, archived: true).execute
end
it 'unarchives the project' do
diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb
index 0f41e46cdd5..43ceb332cfb 100644
--- a/spec/requests/api/runner_spec.rb
+++ b/spec/requests/api/runner_spec.rb
@@ -1449,7 +1449,7 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
context 'when artifact_type is junit' do
context 'when artifact_format is gzip' do
- let(:file_upload) { fixture_file_upload('spec/fixtures/junit.xml.gz') }
+ let(:file_upload) { fixture_file_upload('spec/fixtures/junit/junit.xml.gz') }
let(:params) { { artifact_type: :junit, artifact_format: :gzip } }
it 'stores junit test report' do
@@ -1461,7 +1461,7 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
end
context 'when artifact_format is raw' do
- let(:file_upload) { fixture_file_upload('spec/fixtures/junit.xml.gz') }
+ let(:file_upload) { fixture_file_upload('spec/fixtures/junit/junit.xml.gz') }
let(:params) { { artifact_type: :junit, artifact_format: :raw } }
it 'returns an error' do
diff --git a/spec/serializers/test_case_entity_spec.rb b/spec/serializers/test_case_entity_spec.rb
new file mode 100644
index 00000000000..a55910f98bb
--- /dev/null
+++ b/spec/serializers/test_case_entity_spec.rb
@@ -0,0 +1,31 @@
+require 'spec_helper'
+
+describe TestCaseEntity do
+ include TestReportsHelper
+
+ let(:entity) { described_class.new(test_case) }
+
+ describe '#as_json' do
+ subject { entity.as_json }
+
+ context 'when test case is success' do
+ let(:test_case) { create_test_case_rspec_success }
+
+ it 'contains correct test case details' do
+ expect(subject[:status]).to eq('success')
+ expect(subject[:name]).to eq('Test#sum when a is 1 and b is 3 returns summary')
+ expect(subject[:execution_time]).to eq(1.11)
+ end
+ end
+
+ context 'when test case is failed' do
+ let(:test_case) { create_test_case_rspec_failed }
+
+ it 'contains correct test case details' do
+ expect(subject[:status]).to eq('failed')
+ expect(subject[:name]).to eq('Test#sum when a is 2 and b is 2 returns summary')
+ expect(subject[:execution_time]).to eq(2.22)
+ end
+ end
+ end
+end
diff --git a/spec/serializers/test_reports_comparer_entity_spec.rb b/spec/serializers/test_reports_comparer_entity_spec.rb
new file mode 100644
index 00000000000..59c058fe368
--- /dev/null
+++ b/spec/serializers/test_reports_comparer_entity_spec.rb
@@ -0,0 +1,76 @@
+require 'spec_helper'
+
+describe TestReportsComparerEntity do
+ include TestReportsHelper
+
+ let(:entity) { described_class.new(comparer) }
+ let(:comparer) { Gitlab::Ci::Reports::TestReportsComparer.new(base_reports, head_reports) }
+ let(:base_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:head_reports) { Gitlab::Ci::Reports::TestReports.new }
+
+ describe '#as_json' do
+ subject { entity.as_json }
+
+ context 'when head and base reports include two test suites' do
+ context 'when the status of head report is success' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'contains correct compared test reports details' do
+ expect(subject[:status]).to eq('success')
+ expect(subject[:summary]).to include(total: 2, resolved: 0, failed: 0)
+ expect(subject[:suites].first[:name]).to eq('rspec')
+ expect(subject[:suites].first[:status]).to eq('success')
+ expect(subject[:suites].second[:name]).to eq('junit')
+ expect(subject[:suites].second[:status]).to eq('success')
+ end
+ end
+
+ context 'when the status of head report is failed' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'contains correct compared test reports details' do
+ expect(subject[:status]).to eq('failed')
+ expect(subject[:summary]).to include(total: 2, resolved: 0, failed: 1)
+ expect(subject[:suites].first[:name]).to eq('rspec')
+ expect(subject[:suites].first[:status]).to eq('success')
+ expect(subject[:suites].second[:name]).to eq('junit')
+ expect(subject[:suites].second[:status]).to eq('failed')
+ end
+ end
+
+ context 'when the status of head report is resolved' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_resolved)
+ end
+
+ let(:create_test_case_java_resolved) do
+ create_test_case_java_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ it 'contains correct compared test reports details' do
+ expect(subject[:status]).to eq('success')
+ expect(subject[:summary]).to include(total: 2, resolved: 1, failed: 0)
+ expect(subject[:suites].first[:name]).to eq('rspec')
+ expect(subject[:suites].first[:status]).to eq('success')
+ expect(subject[:suites].second[:name]).to eq('junit')
+ expect(subject[:suites].second[:status]).to eq('success')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/serializers/test_reports_comparer_serializer_spec.rb b/spec/serializers/test_reports_comparer_serializer_spec.rb
new file mode 100644
index 00000000000..9ea86c0dd83
--- /dev/null
+++ b/spec/serializers/test_reports_comparer_serializer_spec.rb
@@ -0,0 +1,62 @@
+require 'spec_helper'
+
+describe TestReportsComparerSerializer do
+ include TestReportsHelper
+
+ let(:project) { double(:project) }
+ let(:serializer) { described_class.new(project: project).represent(comparer) }
+ let(:comparer) { Gitlab::Ci::Reports::TestReportsComparer.new(base_reports, head_reports) }
+ let(:base_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:head_reports) { Gitlab::Ci::Reports::TestReports.new }
+
+ describe '#to_json' do
+ subject { serializer.to_json }
+
+ context 'when head and base reports include two test suites' do
+ context 'when the status of head report is success' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'matches the schema' do
+ expect(subject).to match_schema('entities/test_reports_comparer')
+ end
+ end
+
+ context 'when the status of head report is failed' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'matches the schema' do
+ expect(subject).to match_schema('entities/test_reports_comparer')
+ end
+ end
+
+ context 'when the status of head report is resolved' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_resolved)
+ end
+
+ let(:create_test_case_java_resolved) do
+ create_test_case_java_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ it 'matches the schema' do
+ expect(subject).to match_schema('entities/test_reports_comparer')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/serializers/test_suite_comparer_entity_spec.rb b/spec/serializers/test_suite_comparer_entity_spec.rb
new file mode 100644
index 00000000000..f61331f53a0
--- /dev/null
+++ b/spec/serializers/test_suite_comparer_entity_spec.rb
@@ -0,0 +1,86 @@
+require 'spec_helper'
+
+describe TestSuiteComparerEntity do
+ include TestReportsHelper
+
+ let(:entity) { described_class.new(comparer) }
+ let(:comparer) { Gitlab::Ci::Reports::TestSuiteComparer.new(name, base_suite, head_suite) }
+ let(:name) { 'rpsec' }
+ let(:base_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
+ let(:head_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
+ let(:test_case_success) { create_test_case_rspec_success }
+ let(:test_case_failed) { create_test_case_rspec_failed }
+
+ let(:test_case_resolved) do
+ create_test_case_rspec_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ describe '#as_json' do
+ subject { entity.as_json }
+
+ context 'when head sutie has a newly failed test case which does not exist in base' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'contains correct compared test suite details' do
+ expect(subject[:name]).to eq(name)
+ expect(subject[:status]).to eq('failed')
+ expect(subject[:summary]).to include(total: 1, resolved: 0, failed: 1)
+ subject[:new_failures].first.tap do |new_failure|
+ expect(new_failure[:status]).to eq(test_case_failed.status)
+ expect(new_failure[:name]).to eq(test_case_failed.name)
+ expect(new_failure[:execution_time]).to eq(test_case_failed.execution_time)
+ expect(new_failure[:system_output]).to eq(test_case_failed.system_output)
+ end
+ expect(subject[:resolved_failures]).to be_empty
+ expect(subject[:existing_failures]).to be_empty
+ end
+ end
+
+ context 'when head sutie still has a failed test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'contains correct compared test suite details' do
+ expect(subject[:name]).to eq(name)
+ expect(subject[:status]).to eq('failed')
+ expect(subject[:summary]).to include(total: 1, resolved: 0, failed: 1)
+ expect(subject[:new_failures]).to be_empty
+ expect(subject[:resolved_failures]).to be_empty
+ subject[:existing_failures].first.tap do |existing_failure|
+ expect(existing_failure[:status]).to eq(test_case_failed.status)
+ expect(existing_failure[:name]).to eq(test_case_failed.name)
+ expect(existing_failure[:execution_time]).to eq(test_case_failed.execution_time)
+ expect(existing_failure[:system_output]).to eq(test_case_failed.system_output)
+ end
+ end
+ end
+
+ context 'when head sutie has a success test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_resolved)
+ end
+
+ it 'contains correct compared test suite details' do
+ expect(subject[:name]).to eq(name)
+ expect(subject[:status]).to eq('success')
+ expect(subject[:summary]).to include(total: 1, resolved: 1, failed: 0)
+ expect(subject[:new_failures]).to be_empty
+ subject[:resolved_failures].first.tap do |resolved_failure|
+ expect(resolved_failure[:status]).to eq(test_case_resolved.status)
+ expect(resolved_failure[:name]).to eq(test_case_resolved.name)
+ expect(resolved_failure[:execution_time]).to eq(test_case_resolved.execution_time)
+ expect(resolved_failure[:system_output]).to eq(test_case_resolved.system_output)
+ end
+ expect(subject[:existing_failures]).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/compare_test_reports_service_spec.rb b/spec/services/ci/compare_test_reports_service_spec.rb
new file mode 100644
index 00000000000..d3bbf17cc5c
--- /dev/null
+++ b/spec/services/ci/compare_test_reports_service_spec.rb
@@ -0,0 +1,45 @@
+require 'spec_helper'
+
+describe Ci::CompareTestReportsService do
+ let(:service) { described_class.new(project) }
+ let(:project) { create(:project, :repository) }
+
+ describe '#execute' do
+ subject { service.execute(base_pipeline&.iid, head_pipeline.iid) }
+
+ context 'when head pipeline has test reports' do
+ let!(:base_pipeline) { nil }
+ let!(:head_pipeline) { create(:ci_pipeline, :with_test_reports, project: project) }
+
+ it 'returns status and data' do
+ expect(subject[:status]).to eq(:parsed)
+ expect(subject[:data]).to match_schema('entities/test_reports_comparer')
+ end
+ end
+
+ context 'when base and head pipelines have test reports' do
+ let!(:base_pipeline) { create(:ci_pipeline, :with_test_reports, project: project) }
+ let!(:head_pipeline) { create(:ci_pipeline, :with_test_reports, project: project) }
+
+ it 'returns status and data' do
+ expect(subject[:status]).to eq(:parsed)
+ expect(subject[:data]).to match_schema('entities/test_reports_comparer')
+ end
+ end
+
+ context 'when head pipeline has corrupted test reports' do
+ let!(:base_pipeline) { nil }
+ let!(:head_pipeline) { create(:ci_pipeline, project: project) }
+
+ before do
+ build = create(:ci_build, pipeline: head_pipeline, project: head_pipeline.project)
+ create(:ci_job_artifact, :junit_with_corrupted_data, job: build, project: project)
+ end
+
+ it 'returns status and error message' do
+ expect(subject[:status]).to eq(:error)
+ expect(subject[:status_reason]).to include('XML parsing failed')
+ end
+ end
+ end
+end
diff --git a/spec/services/issues/reopen_service_spec.rb b/spec/services/issues/reopen_service_spec.rb
index 3b617d4ca54..2a56075419b 100644
--- a/spec/services/issues/reopen_service_spec.rb
+++ b/spec/services/issues/reopen_service_spec.rb
@@ -20,7 +20,7 @@ describe Issues::ReopenService do
end
end
- context 'when user is authrized to reopen issue' do
+ context 'when user is authorized to reopen issue' do
let(:user) { create(:user) }
before do
diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb
index 9dd235f6660..5d96b5ce27c 100644
--- a/spec/services/merge_requests/merge_service_spec.rb
+++ b/spec/services/merge_requests/merge_service_spec.rb
@@ -49,6 +49,7 @@ describe MergeRequests::MergeService do
issue = create :issue, project: project
commit = double('commit', safe_message: "Fixes #{issue.to_reference}")
allow(merge_request).to receive(:commits).and_return([commit])
+ merge_request.cache_merge_request_closes_issues!
service.execute(merge_request)
diff --git a/spec/services/merge_requests/post_merge_service_spec.rb b/spec/services/merge_requests/post_merge_service_spec.rb
index ba2b062875b..5ad6f5528f9 100644
--- a/spec/services/merge_requests/post_merge_service_spec.rb
+++ b/spec/services/merge_requests/post_merge_service_spec.rb
@@ -53,7 +53,7 @@ describe MergeRequests::PostMergeService do
allow(project).to receive(:default_branch).and_return('foo')
issue = create(:issue, project: project)
- allow(merge_request).to receive(:closes_issues).and_return([issue])
+ allow(merge_request).to receive(:visible_closing_issues_for).and_return([issue])
allow_any_instance_of(Issues::CloseService).to receive(:execute).with(issue, commit: merge_request).and_raise
expect { described_class.new(project, user, {}).execute(merge_request) }.to raise_error
diff --git a/spec/services/merge_requests/reopen_service_spec.rb b/spec/services/merge_requests/reopen_service_spec.rb
index e10eaa95da4..21e71509ed6 100644
--- a/spec/services/merge_requests/reopen_service_spec.rb
+++ b/spec/services/merge_requests/reopen_service_spec.rb
@@ -47,6 +47,12 @@ describe MergeRequests::ReopenService do
end
end
+ it 'caches merge request closing issues' do
+ expect(merge_request).to receive(:cache_merge_request_closes_issues!)
+
+ described_class.new(project, user, {}).execute(merge_request)
+ end
+
it 'updates metrics' do
metrics = merge_request.metrics
service = double(MergeRequestMetricsService)
diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb
index fd69fe04053..bb3f1501f0e 100644
--- a/spec/services/projects/create_service_spec.rb
+++ b/spec/services/projects/create_service_spec.rb
@@ -114,6 +114,17 @@ describe Projects::CreateService, '#execute' do
end
end
+ context 'import data' do
+ it 'stores import data and URL' do
+ import_data = { data: { 'test' => 'some data' } }
+ project = create_project(user, { name: 'test', import_url: 'http://import-url', import_data: import_data })
+
+ expect(project.import_data).to be_persisted
+ expect(project.import_data.data).to eq(import_data[:data])
+ expect(project.import_url).to eq('http://import-url')
+ end
+ end
+
context 'builds_enabled global setting' do
let(:project) { create_project(user, opts) }
diff --git a/spec/services/projects/gitlab_projects_import_service_spec.rb b/spec/services/projects/gitlab_projects_import_service_spec.rb
index a2061127698..b5f2c826c97 100644
--- a/spec/services/projects/gitlab_projects_import_service_spec.rb
+++ b/spec/services/projects/gitlab_projects_import_service_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
describe Projects::GitlabProjectsImportService do
set(:namespace) { create(:namespace) }
let(:path) { 'test-path' }
- let(:file) { fixture_file_upload('spec/fixtures/doc_sample.txt', 'text/plain') }
+ let(:file) { fixture_file_upload('spec/fixtures/project_export.tar.gz') }
let(:overwrite) { false }
let(:import_params) { { namespace_id: namespace.id, path: path, file: file, overwrite: overwrite } }
diff --git a/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb b/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
index fb6d7171ac3..28d8a95fe07 100644
--- a/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
+++ b/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
@@ -1,21 +1,22 @@
require 'spec_helper'
describe Projects::HashedStorage::MigrateAttachmentsService do
- subject(:service) { described_class.new(project) }
+ subject(:service) { described_class.new(project, project.full_path, logger: nil) }
+
let(:project) { create(:project, :legacy_storage) }
let(:legacy_storage) { Storage::LegacyProject.new(project) }
let(:hashed_storage) { Storage::HashedProject.new(project) }
let!(:upload) { Upload.find_by(path: file_uploader.upload_path) }
let(:file_uploader) { build(:file_uploader, project: project) }
- let(:old_path) { File.join(base_path(legacy_storage), upload.path) }
- let(:new_path) { File.join(base_path(hashed_storage), upload.path) }
+ let(:old_disk_path) { File.join(base_path(legacy_storage), upload.path) }
+ let(:new_disk_path) { File.join(base_path(hashed_storage), upload.path) }
context '#execute' do
context 'when succeeds' do
it 'moves attachments to hashed storage layout' do
- expect(File.file?(old_path)).to be_truthy
- expect(File.file?(new_path)).to be_falsey
+ expect(File.file?(old_disk_path)).to be_truthy
+ expect(File.file?(new_disk_path)).to be_falsey
expect(File.exist?(base_path(legacy_storage))).to be_truthy
expect(File.exist?(base_path(hashed_storage))).to be_falsey
expect(FileUtils).to receive(:mv).with(base_path(legacy_storage), base_path(hashed_storage)).and_call_original
@@ -24,8 +25,8 @@ describe Projects::HashedStorage::MigrateAttachmentsService do
expect(File.exist?(base_path(hashed_storage))).to be_truthy
expect(File.exist?(base_path(legacy_storage))).to be_falsey
- expect(File.file?(old_path)).to be_falsey
- expect(File.file?(new_path)).to be_truthy
+ expect(File.file?(old_disk_path)).to be_falsey
+ expect(File.file?(new_disk_path)).to be_truthy
end
end
@@ -40,7 +41,7 @@ describe Projects::HashedStorage::MigrateAttachmentsService do
service.execute
expect(File.exist?(base_path(hashed_storage))).to be_falsey
- expect(File.file?(new_path)).to be_falsey
+ expect(File.file?(new_disk_path)).to be_falsey
end
end
diff --git a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
index ed4930313c5..5f67c325223 100644
--- a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
+++ b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
@@ -3,10 +3,11 @@ require 'spec_helper'
describe Projects::HashedStorage::MigrateRepositoryService do
let(:gitlab_shell) { Gitlab::Shell.new }
let(:project) { create(:project, :legacy_storage, :repository, :wiki_repo) }
- let(:service) { described_class.new(project) }
let(:legacy_storage) { Storage::LegacyProject.new(project) }
let(:hashed_storage) { Storage::HashedProject.new(project) }
+ subject(:service) { described_class.new(project, project.full_path) }
+
describe '#execute' do
before do
allow(service).to receive(:gitlab_shell) { gitlab_shell }
diff --git a/spec/services/projects/hashed_storage_migration_service_spec.rb b/spec/services/projects/hashed_storage_migration_service_spec.rb
index e8e18bb3ac0..5368c3828dd 100644
--- a/spec/services/projects/hashed_storage_migration_service_spec.rb
+++ b/spec/services/projects/hashed_storage_migration_service_spec.rb
@@ -2,14 +2,19 @@ require 'spec_helper'
describe Projects::HashedStorageMigrationService do
let(:project) { create(:project, :empty_repo, :wiki_repo, :legacy_storage) }
- subject(:service) { described_class.new(project) }
+ let(:logger) { double }
+
+ subject(:service) { described_class.new(project, project.full_path, logger: logger) }
describe '#execute' do
context 'repository migration' do
- let(:repository_service) { Projects::HashedStorage::MigrateRepositoryService.new(project, subject.logger) }
+ let(:repository_service) { Projects::HashedStorage::MigrateRepositoryService.new(project, project.full_path, logger: logger) }
it 'delegates migration to Projects::HashedStorage::MigrateRepositoryService' do
- expect(Projects::HashedStorage::MigrateRepositoryService).to receive(:new).with(project, subject.logger).and_return(repository_service)
+ expect(Projects::HashedStorage::MigrateRepositoryService)
+ .to receive(:new)
+ .with(project, project.full_path, logger: logger)
+ .and_return(repository_service)
expect(repository_service).to receive(:execute)
service.execute
@@ -24,10 +29,13 @@ describe Projects::HashedStorageMigrationService do
end
context 'attachments migration' do
- let(:attachments_service) { Projects::HashedStorage::MigrateAttachmentsService.new(project, subject.logger) }
+ let(:attachments_service) { Projects::HashedStorage::MigrateAttachmentsService.new(project, project.full_path, logger: logger) }
it 'delegates migration to Projects::HashedStorage::MigrateRepositoryService' do
- expect(Projects::HashedStorage::MigrateAttachmentsService).to receive(:new).with(project, subject.logger).and_return(attachments_service)
+ expect(Projects::HashedStorage::MigrateAttachmentsService)
+ .to receive(:new)
+ .with(project, project.full_path, logger: logger)
+ .and_return(attachments_service)
expect(attachments_service).to receive(:execute)
service.execute
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index e6871545a0b..9572b4110d5 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -248,6 +248,21 @@ describe Projects::UpdateService do
expect(project.errors.messages).to have_key(:base)
expect(project.errors.messages[:base]).to include('There is already a repository with that name on disk')
end
+
+ context 'when hashed storage enabled' do
+ before do
+ stub_application_setting(hashed_storage_enabled: true)
+ end
+
+ it 'migrates project to a hashed storage instead of renaming the repo to another legacy name' do
+ result = update_project(project, admin, path: 'new-path')
+
+ expect(result).not_to include(status: :error)
+ expect(project).to be_valid
+ expect(project.errors).to be_empty
+ expect(project.reload.hashed_storage?(:repository)).to be_truthy
+ end
+ end
end
context 'with hashed storage' do
diff --git a/spec/services/users/activity_service_spec.rb b/spec/services/users/activity_service_spec.rb
index f20849e6924..719b4adf212 100644
--- a/spec/services/users/activity_service_spec.rb
+++ b/spec/services/users/activity_service_spec.rb
@@ -28,6 +28,18 @@ describe Users::ActivityService do
end
end
+ context 'when a bad object is passed' do
+ let(:fake_object) { double(username: 'hello') }
+
+ it 'does not record activity' do
+ service = described_class.new(fake_object, 'pull')
+
+ expect(service).not_to receive(:record_activity)
+
+ service.execute
+ end
+ end
+
context 'when last activity is today' do
let(:last_activity_on) { Date.today }
diff --git a/spec/support/helpers/reactive_caching_helpers.rb b/spec/support/helpers/reactive_caching_helpers.rb
index e22dd974c6a..a575aa99b79 100644
--- a/spec/support/helpers/reactive_caching_helpers.rb
+++ b/spec/support/helpers/reactive_caching_helpers.rb
@@ -14,8 +14,8 @@ module ReactiveCachingHelpers
end
def synchronous_reactive_cache(subject)
- allow(service).to receive(:with_reactive_cache) do |*args, &block|
- block.call(service.calculate_reactive_cache(*args))
+ allow(subject).to receive(:with_reactive_cache) do |*args, &block|
+ block.call(subject.calculate_reactive_cache(*args))
end
end
diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb
index 8e1d4cfe269..9c6486a35c4 100644
--- a/spec/support/helpers/test_env.rb
+++ b/spec/support/helpers/test_env.rb
@@ -51,7 +51,8 @@ module TestEnv
'add-pdf-text-binary' => '79faa7b',
'add_images_and_changes' => '010d106',
'update-gitlab-shell-v-6-0-1' => '2f61d70',
- 'update-gitlab-shell-v-6-0-3' => 'de78448'
+ 'update-gitlab-shell-v-6-0-3' => 'de78448',
+ '2-mb-file' => 'bf12d25'
}.freeze
# gitlab-test-fork is a fork of gitlab-fork, but we don't necessarily
diff --git a/spec/support/shared_examples/helm_generated_script.rb b/spec/support/shared_examples/helm_generated_script.rb
index 05d53a13fd3..ef9bb7f5533 100644
--- a/spec/support/shared_examples/helm_generated_script.rb
+++ b/spec/support/shared_examples/helm_generated_script.rb
@@ -7,7 +7,7 @@ shared_examples 'helm commands' do
echo http://mirror.clarkson.edu/alpine/v$ALPINE_VERSION/main >> /etc/apk/repositories
echo http://mirror1.hs-esslingen.de/pub/Mirrors/alpine/v$ALPINE_VERSION/main >> /etc/apk/repositories
apk add -U wget ca-certificates openssl >/dev/null
- wget -q -O - https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-linux-amd64.tar.gz | tar zxC /tmp >/dev/null
+ wget -q -O - https://kubernetes-helm.storage.googleapis.com/helm-v2.7.2-linux-amd64.tar.gz | tar zxC /tmp >/dev/null
mv /tmp/linux-amd64/helm /usr/bin/
EOS
end
diff --git a/spec/support/shared_examples/notify_shared_examples.rb b/spec/support/shared_examples/notify_shared_examples.rb
index 5beae005cf7..5fb9ced3b63 100644
--- a/spec/support/shared_examples/notify_shared_examples.rb
+++ b/spec/support/shared_examples/notify_shared_examples.rb
@@ -87,6 +87,10 @@ shared_examples 'an email starting a new thread with reply-by-email enabled' do
include_examples 'an email with X-GitLab headers containing project details'
include_examples 'a new thread email with reply-by-email enabled'
+ it 'includes "Reply to this email directly or <View it on GitLab>"' do
+ expect(subject.default_part.body).to include(%(Reply to this email directly or <a href="#{Gitlab::UrlBuilder.build(model)}">view it on GitLab</a>.))
+ end
+
context 'when reply-by-email is enabled with incoming address with %{key}' do
it 'has a Reply-To header' do
is_expected.to have_header 'Reply-To', /<reply+(.*)@#{Gitlab.config.gitlab.host}>\Z/
diff --git a/spec/support/shared_examples/gitlab_projects_import_service_shared_examples.rb b/spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb
index b8db35a6ef9..b8db35a6ef9 100644
--- a/spec/support/shared_examples/gitlab_projects_import_service_shared_examples.rb
+++ b/spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb
diff --git a/spec/support/test_reports/test_reports_helper.rb b/spec/support/test_reports/test_reports_helper.rb
new file mode 100644
index 00000000000..45c6e04dbf3
--- /dev/null
+++ b/spec/support/test_reports/test_reports_helper.rb
@@ -0,0 +1,93 @@
+module TestReportsHelper
+ def create_test_case_rspec_success
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'Test#sum when a is 1 and b is 3 returns summary',
+ classname: 'spec.test_spec',
+ file: './spec/test_spec.rb',
+ execution_time: 1.11,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+
+ def create_test_case_rspec_failed
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'Test#sum when a is 2 and b is 2 returns summary',
+ classname: 'spec.test_spec',
+ file: './spec/test_spec.rb',
+ execution_time: 2.22,
+ system_output: sample_rspec_failed_message,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+
+ def create_test_case_rspec_skipped
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'Test#sum when a is 3 and b is 3 returns summary',
+ classname: 'spec.test_spec',
+ file: './spec/test_spec.rb',
+ execution_time: 3.33,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_SKIPPED)
+ end
+
+ def create_test_case_rspec_error
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'Test#sum when a is 4 and b is 4 returns summary',
+ classname: 'spec.test_spec',
+ file: './spec/test_spec.rb',
+ execution_time: 4.44,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_ERROR)
+ end
+
+ def sample_rspec_failed_message
+ <<-EOF.strip_heredoc
+ Failure/Error: is_expected.to eq(3)
+
+ expected: 3
+ got: -1
+
+ (compared using ==)
+ ./spec/test_spec.rb:12:in `block (4 levels) in &lt;top (required)&gt;&apos;
+ EOF
+ end
+
+ def create_test_case_java_success
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'addTest',
+ classname: 'CalculatorTest',
+ execution_time: 5.55,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+
+ def create_test_case_java_failed
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'subtractTest',
+ classname: 'CalculatorTest',
+ execution_time: 6.66,
+ system_output: sample_java_failed_message,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+
+ def create_test_case_java_skipped
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'multiplyTest',
+ classname: 'CalculatorTest',
+ execution_time: 7.77,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_SKIPPED)
+ end
+
+ def create_test_case_java_error
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'divideTest',
+ classname: 'CalculatorTest',
+ execution_time: 8.88,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_ERROR)
+ end
+
+ def sample_java_failed_message
+ <<-EOF.strip_heredoc
+ junit.framework.AssertionFailedError: expected:&lt;1&gt; but was:&lt;3&gt;
+ at CalculatorTest.subtractExpression(Unknown Source)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ EOF
+ end
+end
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index 93a436cb2b5..3ba6caf1337 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -87,6 +87,27 @@ describe 'gitlab:app namespace rake task' do
expect { run_rake_task('gitlab:backup:restore') }.to output.to_stdout
end
end
+
+ context 'when the restore directory is not empty' do
+ before do
+ # We only need a backup of the repositories for this test
+ stub_env('SKIP', 'db,uploads,builds,artifacts,lfs,registry')
+ end
+
+ it 'removes stale data' do
+ expect { run_rake_task('gitlab:backup:create') }.to output.to_stdout
+
+ excluded_project = create(:project, :repository, name: 'mepmep')
+
+ expect { run_rake_task('gitlab:backup:restore') }.to output.to_stdout
+
+ raw_repo = excluded_project.repository.raw
+
+ # The restore will not find the repository in the backup, but will create
+ # an empty one in its place
+ expect(raw_repo.empty?).to be(true)
+ end
+ end
end # backup_restore task
describe 'backup' do
diff --git a/spec/tasks/gitlab/cleanup_rake_spec.rb b/spec/tasks/gitlab/cleanup_rake_spec.rb
index ba08ece1b4b..cc2cca10f58 100644
--- a/spec/tasks/gitlab/cleanup_rake_spec.rb
+++ b/spec/tasks/gitlab/cleanup_rake_spec.rb
@@ -68,317 +68,86 @@ describe 'gitlab:cleanup rake tasks' do
end
end
+ # A single integration test that is redundant with one part of the
+ # Gitlab::Cleanup::ProjectUploads spec.
+ #
+ # Additionally, this tests DRY_RUN env var values, and the extra line of
+ # output that says you can disable DRY_RUN if it's enabled.
describe 'cleanup:project_uploads' do
- context 'orphaned project upload file' do
- context 'when an upload record matching the secret and filename is found' do
- context 'when the project is still in legacy storage' do
- let!(:orphaned) { create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage)) }
- let!(:correct_path) { orphaned.absolute_path }
- let!(:other_project) { create(:project, :legacy_storage) }
- let!(:orphaned_path) { correct_path.sub(/#{orphaned.model.full_path}/, other_project.full_path) }
+ let!(:logger) { double(:logger) }
- before do
- FileUtils.mkdir_p(File.dirname(orphaned_path))
- FileUtils.mv(correct_path, orphaned_path)
- end
-
- it 'moves the file to its proper location' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Did fix #{orphaned_path} -> #{correct_path}")
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(correct_path)).to be_falsey
-
- stub_env('DRY_RUN', 'false')
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(orphaned_path)).to be_falsey
- expect(File.exist?(correct_path)).to be_truthy
- end
-
- it 'a dry run does not move the file' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Can fix #{orphaned_path} -> #{correct_path}")
- expect(Rails.logger).to receive(:info)
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(correct_path)).to be_falsey
-
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(correct_path)).to be_falsey
- end
-
- context 'when the project record is missing (Upload#absolute_path raises error)' do
- let!(:lost_and_found_path) { File.join(FileUploader.root, '-', 'project-lost-found', other_project.full_path, orphaned.path) }
-
- before do
- orphaned.model.delete
- end
-
- it 'moves the file to lost and found' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Did move to lost and found #{orphaned_path} -> #{lost_and_found_path}")
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(lost_and_found_path)).to be_falsey
-
- stub_env('DRY_RUN', 'false')
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(orphaned_path)).to be_falsey
- expect(File.exist?(lost_and_found_path)).to be_truthy
- end
-
- it 'a dry run does not move the file' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Can move to lost and found #{orphaned_path} -> #{lost_and_found_path}")
- expect(Rails.logger).to receive(:info)
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(lost_and_found_path)).to be_falsey
-
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(lost_and_found_path)).to be_falsey
- end
- end
- end
-
- context 'when the project was moved to hashed storage' do
- let!(:orphaned) { create(:upload, :issuable_upload, :with_file) }
- let!(:correct_path) { orphaned.absolute_path }
- let!(:orphaned_path) { File.join(FileUploader.root, 'foo', 'bar', orphaned.path) }
-
- before do
- FileUtils.mkdir_p(File.dirname(orphaned_path))
- FileUtils.mv(correct_path, orphaned_path)
- end
-
- it 'moves the file to its proper location' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Did fix #{orphaned_path} -> #{correct_path}")
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(correct_path)).to be_falsey
-
- stub_env('DRY_RUN', 'false')
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(orphaned_path)).to be_falsey
- expect(File.exist?(correct_path)).to be_truthy
- end
-
- it 'a dry run does not move the file' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Can fix #{orphaned_path} -> #{correct_path}")
- expect(Rails.logger).to receive(:info)
+ before do
+ expect(main_object).to receive(:logger).and_return(logger).at_least(1).times
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(correct_path)).to be_falsey
+ allow(logger).to receive(:info).at_least(1).times
+ allow(logger).to receive(:debug).at_least(1).times
+ end
- run_rake_task('gitlab:cleanup:project_uploads')
+ context 'with a fixable orphaned project upload file' do
+ let(:orphaned) { create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage)) }
+ let(:new_path) { orphaned.absolute_path }
+ let(:path) { File.join(FileUploader.root, 'some', 'wrong', 'location', orphaned.path) }
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(correct_path)).to be_falsey
- end
- end
+ before do
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.mv(new_path, path)
end
- context 'when a matching upload record can not be found' do
- context 'when the file path fits the known pattern' do
- let!(:orphaned) { create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage)) }
- let!(:orphaned_path) { orphaned.absolute_path }
- let!(:lost_and_found_path) { File.join(FileUploader.root, '-', 'project-lost-found', orphaned.model.full_path, orphaned.path) }
-
- before do
- orphaned.delete
- end
-
- it 'moves the file to lost and found' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Did move to lost and found #{orphaned_path} -> #{lost_and_found_path}")
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(lost_and_found_path)).to be_falsey
-
- stub_env('DRY_RUN', 'false')
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(orphaned_path)).to be_falsey
- expect(File.exist?(lost_and_found_path)).to be_truthy
- end
-
- it 'a dry run does not move the file' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Can move to lost and found #{orphaned_path} -> #{lost_and_found_path}")
- expect(Rails.logger).to receive(:info)
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(lost_and_found_path)).to be_falsey
-
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(lost_and_found_path)).to be_falsey
- end
+ context 'with DRY_RUN disabled' do
+ before do
+ stub_env('DRY_RUN', 'false')
end
- context 'when the file path does not fit the known pattern' do
- let!(:invalid_path) { File.join('group', 'file.jpg') }
- let!(:orphaned_path) { File.join(FileUploader.root, invalid_path) }
- let!(:lost_and_found_path) { File.join(FileUploader.root, '-', 'project-lost-found', invalid_path) }
-
- before do
- FileUtils.mkdir_p(File.dirname(orphaned_path))
- FileUtils.touch(orphaned_path)
- end
-
- after do
- File.delete(orphaned_path) if File.exist?(orphaned_path)
- end
-
- it 'moves the file to lost and found' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Did move to lost and found #{orphaned_path} -> #{lost_and_found_path}")
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(lost_and_found_path)).to be_falsey
-
- stub_env('DRY_RUN', 'false')
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(orphaned_path)).to be_falsey
- expect(File.exist?(lost_and_found_path)).to be_truthy
- end
-
- it 'a dry run does not move the file' do
- expect(Rails.logger).to receive(:info).twice
- expect(Rails.logger).to receive(:info).with("Can move to lost and found #{orphaned_path} -> #{lost_and_found_path}")
- expect(Rails.logger).to receive(:info)
-
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(lost_and_found_path)).to be_falsey
-
- run_rake_task('gitlab:cleanup:project_uploads')
+ it 'moves the file to its proper location' do
+ run_rake_task('gitlab:cleanup:project_uploads')
- expect(File.exist?(orphaned_path)).to be_truthy
- expect(File.exist?(lost_and_found_path)).to be_falsey
- end
+ expect(File.exist?(path)).to be_falsey
+ expect(File.exist?(new_path)).to be_truthy
end
- end
- end
-
- context 'non-orphaned project upload file' do
- it 'does not move the file' do
- tracked = create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage))
- tracked_path = tracked.absolute_path
- expect(Rails.logger).not_to receive(:info).with(/move|fix/i)
- expect(File.exist?(tracked_path)).to be_truthy
-
- stub_env('DRY_RUN', 'false')
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(tracked_path)).to be_truthy
- end
- end
-
- context 'ignorable cases' do
- shared_examples_for 'does not move anything' do
- it 'does not move even an orphan file' do
- orphaned = create(:upload, :issuable_upload, :with_file, model: project)
- orphaned_path = orphaned.absolute_path
- orphaned.delete
-
- expect(File.exist?(orphaned_path)).to be_truthy
+ it 'logs action as done' do
+ expect(logger).to receive(:info).with("Looking for orphaned project uploads to clean up...")
+ expect(logger).to receive(:info).with("Did fix #{path} -> #{new_path}")
run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(orphaned_path)).to be_truthy
end
end
- # Because we aren't concerned about these, and can save a lot of
- # processing time by ignoring them. If we wish to cleanup hashed storage
- # directories, it should simply require removing this test and modifying
- # the find command.
- context 'when the file is already in hashed storage' do
- let(:project) { create(:project) }
+ shared_examples_for 'does not move the file' do
+ it 'does not move the file' do
+ run_rake_task('gitlab:cleanup:project_uploads')
- before do
- stub_env('DRY_RUN', 'false')
- expect(Rails.logger).not_to receive(:info).with(/move|fix/i)
+ expect(File.exist?(path)).to be_truthy
+ expect(File.exist?(new_path)).to be_falsey
end
- it_behaves_like 'does not move anything'
- end
-
- context 'when DRY_RUN env var is unset' do
- let(:project) { create(:project, :legacy_storage) }
+ it 'logs action as able to be done' do
+ expect(logger).to receive(:info).with("Looking for orphaned project uploads to clean up. Dry run...")
+ expect(logger).to receive(:info).with("Can fix #{path} -> #{new_path}")
+ expect(logger).to receive(:info).with(/To clean up these files run this command with DRY_RUN=false/)
- it_behaves_like 'does not move anything'
+ run_rake_task('gitlab:cleanup:project_uploads')
+ end
end
- context 'when DRY_RUN env var is true' do
- let(:project) { create(:project, :legacy_storage) }
-
+ context 'with DRY_RUN explicitly enabled' do
before do
stub_env('DRY_RUN', 'true')
end
- it_behaves_like 'does not move anything'
+ it_behaves_like 'does not move the file'
end
- context 'when DRY_RUN env var is foo' do
- let(:project) { create(:project, :legacy_storage) }
-
+ context 'with DRY_RUN set to an unknown value' do
before do
stub_env('DRY_RUN', 'foo')
end
- it_behaves_like 'does not move anything'
+ it_behaves_like 'does not move the file'
end
- it 'does not move any non-project (FileUploader) uploads' do
- stub_env('DRY_RUN', 'false')
-
- paths = []
- orphaned1 = create(:upload, :personal_snippet_upload, :with_file)
- orphaned2 = create(:upload, :namespace_upload, :with_file)
- orphaned3 = create(:upload, :attachment_upload, :with_file)
- paths << orphaned1.absolute_path
- paths << orphaned2.absolute_path
- paths << orphaned3.absolute_path
- Upload.delete_all
-
- expect(Rails.logger).not_to receive(:info).with(/move|fix/i)
- paths.each do |path|
- expect(File.exist?(path)).to be_truthy
- end
-
- run_rake_task('gitlab:cleanup:project_uploads')
-
- paths.each do |path|
- expect(File.exist?(path)).to be_truthy
- end
- end
-
- it 'does not move any uploads in tmp (which would interfere with ongoing upload activity)' do
- stub_env('DRY_RUN', 'false')
-
- path = File.join(FileUploader.root, 'tmp', 'foo.jpg')
- FileUtils.mkdir_p(File.dirname(path))
- FileUtils.touch(path)
-
- expect(Rails.logger).not_to receive(:info).with(/move|fix/i)
- expect(File.exist?(path)).to be_truthy
-
- run_rake_task('gitlab:cleanup:project_uploads')
-
- expect(File.exist?(path)).to be_truthy
+ context 'with DRY_RUN unset' do
+ it_behaves_like 'does not move the file'
end
end
end
diff --git a/spec/workers/background_migration_worker_spec.rb b/spec/workers/background_migration_worker_spec.rb
index d67e7698635..3bd072e7125 100644
--- a/spec/workers/background_migration_worker_spec.rb
+++ b/spec/workers/background_migration_worker_spec.rb
@@ -3,6 +3,12 @@ require 'spec_helper'
describe BackgroundMigrationWorker, :sidekiq, :clean_gitlab_redis_shared_state do
let(:worker) { described_class.new }
+ describe '.minimum_interval' do
+ it 'returns 2 minutes' do
+ expect(described_class.minimum_interval).to eq(2.minutes.to_i)
+ end
+ end
+
describe '.perform' do
it 'performs a background migration' do
expect(Gitlab::BackgroundMigration)
@@ -28,5 +34,51 @@ describe BackgroundMigrationWorker, :sidekiq, :clean_gitlab_redis_shared_state d
worker.perform('Foo', [10, 20])
end
+
+ it 'reschedules a migration if the database is not healthy' do
+ allow(worker)
+ .to receive(:always_perform?)
+ .and_return(false)
+
+ allow(worker)
+ .to receive(:healthy_database?)
+ .and_return(false)
+
+ expect(described_class)
+ .to receive(:perform_in)
+ .with(a_kind_of(Numeric), 'Foo', [10, 20])
+
+ worker.perform('Foo', [10, 20])
+ end
+ end
+
+ describe '#healthy_database?' do
+ context 'using MySQL', :mysql do
+ it 'returns true' do
+ expect(worker.healthy_database?).to eq(true)
+ end
+ end
+
+ context 'using PostgreSQL', :postgresql do
+ context 'when replication lag is too great' do
+ it 'returns false' do
+ allow(Postgresql::ReplicationSlot)
+ .to receive(:lag_too_great?)
+ .and_return(true)
+
+ expect(worker.healthy_database?).to eq(false)
+ end
+ end
+
+ context 'when replication lag is small enough' do
+ it 'returns true' do
+ allow(Postgresql::ReplicationSlot)
+ .to receive(:lag_too_great?)
+ .and_return(false)
+
+ expect(worker.healthy_database?).to eq(true)
+ end
+ end
+ end
end
end
diff --git a/spec/workers/create_gpg_signature_worker_spec.rb b/spec/workers/create_gpg_signature_worker_spec.rb
index 502765e9786..f5479e57260 100644
--- a/spec/workers/create_gpg_signature_worker_spec.rb
+++ b/spec/workers/create_gpg_signature_worker_spec.rb
@@ -4,10 +4,9 @@ describe CreateGpgSignatureWorker do
let(:project) { create(:project, :repository) }
let(:commits) { project.repository.commits('HEAD', limit: 3).commits }
let(:commit_shas) { commits.map(&:id) }
+ let(:gpg_commit) { instance_double(Gitlab::Gpg::Commit) }
context 'when GpgKey is found' do
- let(:gpg_commit) { instance_double(Gitlab::Gpg::Commit) }
-
before do
allow(Project).to receive(:find_by).with(id: project.id).and_return(project)
allow(project).to receive(:commits_by).with(oids: commit_shas).and_return(commits)
@@ -36,6 +35,16 @@ describe CreateGpgSignatureWorker do
end
end
+ context 'handles when a string is passed in for the commit SHA' do
+ it 'creates a signature once' do
+ allow(Gitlab::Gpg::Commit).to receive(:new).with(commits.first).and_return(gpg_commit)
+
+ expect(gpg_commit).to receive(:signature).once
+
+ described_class.new.perform(commit_shas.first, project.id)
+ end
+ end
+
context 'when Commit is not found' do
let(:nonexisting_commit_sha) { '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a34' }
diff --git a/spec/workers/project_migrate_hashed_storage_worker_spec.rb b/spec/workers/project_migrate_hashed_storage_worker_spec.rb
index 9551e358af1..3703320418b 100644
--- a/spec/workers/project_migrate_hashed_storage_worker_spec.rb
+++ b/spec/workers/project_migrate_hashed_storage_worker_spec.rb
@@ -28,7 +28,7 @@ describe ProjectMigrateHashedStorageWorker, :clean_gitlab_redis_shared_state do
migration_service = spy
allow(::Projects::HashedStorageMigrationService)
- .to receive(:new).with(project, subject.logger)
+ .to receive(:new).with(project, project.full_path, logger: subject.logger)
.and_return(migration_service)
subject.perform(project.id)