shipit-engine 0.30.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +19 -4
- data/Rakefile +4 -2
- data/app/assets/images/magic-solid.svg +1 -0
- data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
- data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
- data/app/assets/stylesheets/_pages/_deploy.scss +0 -2
- data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
- data/app/assets/stylesheets/_pages/_stacks.scss +19 -3
- data/app/assets/stylesheets/merge_status.scss +0 -3
- data/app/assets/stylesheets/shipit.scss +1 -0
- data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +1 -0
- data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
- data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
- data/app/controllers/concerns/shipit/api/rendering.rb +5 -4
- data/app/controllers/concerns/shipit/authentication.rb +3 -2
- data/app/controllers/concerns/shipit/pagination.rb +2 -1
- data/app/controllers/shipit/api/base_controller.rb +11 -6
- data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
- data/app/controllers/shipit/api/commits_controller.rb +2 -1
- data/app/controllers/shipit/api/deploys_controller.rb +6 -3
- data/app/controllers/shipit/api/hooks_controller.rb +6 -5
- data/app/controllers/shipit/api/locks_controller.rb +5 -4
- data/app/controllers/shipit/api/merge_requests_controller.rb +37 -0
- data/app/controllers/shipit/api/outputs_controller.rb +2 -1
- data/app/controllers/shipit/api/release_statuses_controller.rb +3 -2
- data/app/controllers/shipit/api/rollbacks_controller.rb +34 -0
- data/app/controllers/shipit/api/stacks_controller.rb +32 -5
- data/app/controllers/shipit/api/tasks_controller.rb +6 -5
- data/app/controllers/shipit/api_clients_controller.rb +4 -3
- data/app/controllers/shipit/ccmenu_url_controller.rb +4 -3
- data/app/controllers/shipit/commit_checks_controller.rb +2 -1
- data/app/controllers/shipit/commits_controller.rb +2 -1
- data/app/controllers/shipit/deploys_controller.rb +4 -3
- data/app/controllers/shipit/github_authentication_controller.rb +4 -3
- data/app/controllers/shipit/merge_requests_controller.rb +31 -0
- data/app/controllers/shipit/merge_status_controller.rb +31 -30
- data/app/controllers/shipit/release_statuses_controller.rb +3 -2
- data/app/controllers/shipit/repositories_controller.rb +74 -0
- data/app/controllers/shipit/rollbacks_controller.rb +3 -2
- data/app/controllers/shipit/shipit_controller.rb +2 -1
- data/app/controllers/shipit/stacks_controller.rb +24 -9
- data/app/controllers/shipit/status_controller.rb +2 -1
- data/app/controllers/shipit/tasks_controller.rb +7 -6
- data/app/controllers/shipit/webhooks_controller.rb +26 -6
- data/app/helpers/shipit/chunks_helper.rb +3 -2
- data/app/helpers/shipit/deploys_helper.rb +4 -3
- data/app/helpers/shipit/github_url_helper.rb +9 -0
- data/app/helpers/shipit/merge_status_helper.rb +1 -0
- data/app/helpers/shipit/shipit_helper.rb +1 -1
- data/app/helpers/shipit/stacks_helper.rb +5 -0
- data/app/helpers/shipit/tasks_helper.rb +1 -0
- data/app/jobs/shipit/background_job.rb +4 -0
- data/app/jobs/shipit/background_job/unique.rb +1 -0
- data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -0
- data/app/jobs/shipit/chunk_rollup_job.rb +4 -0
- data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
- data/app/jobs/shipit/continuous_delivery_job.rb +2 -1
- data/app/jobs/shipit/create_on_github_job.rb +7 -1
- data/app/jobs/shipit/create_release_statuses_job.rb +1 -0
- data/app/jobs/shipit/deferred_touch_job.rb +4 -0
- data/app/jobs/shipit/deliver_hook_job.rb +2 -1
- data/app/jobs/shipit/destroy_job.rb +1 -0
- data/app/jobs/shipit/destroy_repository_job.rb +24 -0
- data/app/jobs/shipit/destroy_stack_job.rb +3 -2
- data/app/jobs/shipit/emit_event_job.rb +2 -1
- data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
- data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
- data/app/jobs/shipit/github_sync_job.rb +15 -10
- data/app/jobs/shipit/mark_deploy_healthy_job.rb +1 -0
- data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
- data/app/jobs/shipit/perform_task_job.rb +5 -92
- data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
- data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
- data/app/jobs/shipit/reap_dead_tasks_job.rb +21 -0
- data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
- data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
- data/app/jobs/shipit/refresh_merge_request_job.rb +11 -0
- data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
- data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
- data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
- data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +5 -4
- data/app/models/concerns/shipit/deferred_touch.rb +4 -3
- data/app/models/shipit/anonymous_user.rb +15 -2
- data/app/models/shipit/api_client.rb +3 -2
- data/app/models/shipit/application_record.rb +2 -1
- data/app/models/shipit/check_run.rb +41 -4
- data/app/models/shipit/command_line_user.rb +5 -0
- data/app/models/shipit/commit.rb +42 -24
- data/app/models/shipit/commit_checks.rb +15 -13
- data/app/models/shipit/commit_deployment.rb +6 -5
- data/app/models/shipit/commit_deployment_status.rb +5 -4
- data/app/models/shipit/commit_message.rb +1 -0
- data/app/models/shipit/delivery.rb +4 -3
- data/app/models/shipit/deploy.rb +23 -28
- data/app/models/shipit/deploy_spec.rb +38 -7
- data/app/models/shipit/deploy_spec/bundler_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/file_system.rb +20 -7
- data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/lerna_discovery.rb +13 -4
- data/app/models/shipit/deploy_spec/npm_discovery.rb +5 -4
- data/app/models/shipit/deploy_spec/pypi_discovery.rb +1 -0
- data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
- data/app/models/shipit/deploy_stats.rb +2 -1
- data/app/models/shipit/duration.rb +5 -2
- data/app/models/shipit/ephemeral_commit_checks.rb +1 -0
- data/app/models/shipit/github_hook.rb +2 -1
- data/app/models/shipit/github_status.rb +2 -1
- data/app/models/shipit/hook.rb +34 -7
- data/app/models/shipit/membership.rb +3 -2
- data/app/models/shipit/merge_request.rb +304 -0
- data/app/models/shipit/output_chunk.rb +7 -2
- data/app/models/shipit/provisioning_handler.rb +32 -0
- data/app/models/shipit/provisioning_handler/base.rb +30 -0
- data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
- data/app/models/shipit/pull_request.rb +28 -266
- data/app/models/shipit/pull_request_assignment.rb +10 -0
- data/app/models/shipit/record.rb +18 -0
- data/app/models/shipit/release_status.rb +4 -3
- data/app/models/shipit/repository.rb +71 -6
- data/app/models/shipit/review_stack.rb +130 -0
- data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
- data/app/models/shipit/rollback.rb +1 -0
- data/app/models/shipit/stack.rb +144 -44
- data/app/models/shipit/status.rb +3 -2
- data/app/models/shipit/status/common.rb +7 -6
- data/app/models/shipit/status/group.rb +2 -1
- data/app/models/shipit/status/missing.rb +2 -1
- data/app/models/shipit/status/unknown.rb +2 -1
- data/app/models/shipit/task.rb +98 -12
- data/app/models/shipit/task_definition.rb +1 -0
- data/app/models/shipit/task_execution_strategy/base.rb +20 -0
- data/app/models/shipit/task_execution_strategy/default.rb +109 -0
- data/app/models/shipit/team.rb +6 -3
- data/app/models/shipit/undeployed_commit.rb +1 -0
- data/app/models/shipit/unlimited_api_client.rb +1 -0
- data/app/models/shipit/user.rb +19 -8
- data/app/models/shipit/variable_definition.rb +1 -0
- data/app/models/shipit/webhooks.rb +11 -0
- data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
- data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
- data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -0
- data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +74 -0
- data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
- data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
- data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
- data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
- data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
- data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
- data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
- data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
- data/app/models/shipit/webhooks/handlers/push_handler.rb +5 -1
- data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
- data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
- data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
- data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
- data/app/serializers/shipit/commit_serializer.rb +1 -0
- data/app/serializers/shipit/deploy_serializer.rb +8 -1
- data/app/serializers/shipit/hook_serializer.rb +1 -0
- data/app/serializers/shipit/merge_request_serializer.rb +21 -0
- data/app/serializers/shipit/pull_request_serializer.rb +6 -8
- data/app/serializers/shipit/review_stack_serializer.rb +7 -0
- data/app/serializers/shipit/rollback_serializer.rb +1 -0
- data/app/serializers/shipit/short_commit_serializer.rb +1 -0
- data/app/serializers/shipit/stack_serializer.rb +8 -6
- data/app/serializers/shipit/tail_task_serializer.rb +11 -2
- data/app/serializers/shipit/task_serializer.rb +2 -17
- data/app/serializers/shipit/user_serializer.rb +6 -1
- data/app/validators/ascii_only_validator.rb +1 -0
- data/app/validators/subset_validator.rb +2 -1
- data/app/views/layouts/merge_status.html.erb +1 -1
- data/app/views/layouts/shipit.html.erb +1 -1
- data/app/views/shipit/_variables.html.erb +1 -1
- data/app/views/shipit/ccmenu/project.xml.builder +2 -1
- data/app/views/shipit/deploys/show.html.erb +2 -2
- data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
- data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
- data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
- data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
- data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
- data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
- data/app/views/shipit/merge_status/failure.html.erb +1 -1
- data/app/views/shipit/merge_status/locked.html.erb +1 -1
- data/app/views/shipit/merge_status/success.html.erb +2 -2
- data/app/views/shipit/repositories/_header.html.erb +19 -0
- data/app/views/shipit/repositories/index.html.erb +31 -0
- data/app/views/shipit/repositories/new.html.erb +23 -0
- data/app/views/shipit/repositories/settings.html.erb +53 -0
- data/app/views/shipit/repositories/show.html.erb +30 -0
- data/app/views/shipit/stacks/_banners.html.erb +15 -1
- data/app/views/shipit/stacks/_header.html.erb +20 -7
- data/app/views/shipit/stacks/_stack.html.erb +8 -0
- data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
- data/app/views/shipit/stacks/index.html.erb +3 -2
- data/app/views/shipit/stacks/new.html.erb +1 -1
- data/app/views/shipit/stacks/settings.html.erb +5 -5
- data/app/views/shipit/stacks/show.html.erb +1 -1
- data/app/views/shipit/tasks/_task_output.html.erb +1 -1
- data/app/views/shipit/tasks/show.html.erb +1 -1
- data/config/initializers/inflections.rb +2 -1
- data/config/locales/en.yml +4 -3
- data/config/routes.rb +25 -7
- data/config/secrets.development.example.yml +24 -0
- data/config/secrets.development.shopify.yml +20 -9
- data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
- data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
- data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
- data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
- data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
- data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
- data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
- data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
- data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
- data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
- data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
- data/db/migrate/20210325194053_remove_stacks_branch_default.rb +5 -0
- data/db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb +5 -0
- data/lib/shipit.rb +61 -17
- data/lib/shipit/cast_value.rb +1 -0
- data/lib/shipit/command.rb +20 -21
- data/lib/shipit/commands.rb +14 -6
- data/lib/shipit/csv_serializer.rb +1 -0
- data/lib/shipit/deploy_commands.rb +1 -0
- data/lib/shipit/engine.rb +9 -2
- data/lib/shipit/environment_variables.rb +11 -1
- data/lib/shipit/first_parent_commits_iterator.rb +1 -0
- data/lib/shipit/flock.rb +9 -1
- data/lib/shipit/github_app.rb +15 -12
- data/lib/shipit/github_http_cache_middleware.rb +1 -0
- data/lib/shipit/null_serializer.rb +1 -0
- data/lib/shipit/octokit_check_runs.rb +3 -2
- data/lib/shipit/octokit_iterator.rb +4 -3
- data/lib/shipit/paginator.rb +3 -2
- data/lib/shipit/review_stack_commands.rb +8 -0
- data/lib/shipit/rollback_commands.rb +1 -0
- data/lib/shipit/same_site_cookie_middleware.rb +29 -0
- data/lib/shipit/simple_message_verifier.rb +3 -2
- data/lib/shipit/stack_commands.rb +37 -7
- data/lib/shipit/stat.rb +1 -0
- data/lib/shipit/task_commands.rb +23 -16
- data/lib/shipit/version.rb +2 -1
- data/lib/snippets/publish-lerna-independent-packages +35 -34
- data/lib/snippets/publish-lerna-independent-packages-legacy +39 -0
- data/lib/snippets/release-gem +5 -1
- data/lib/tasks/cron.rake +13 -2
- data/lib/tasks/dev.rake +3 -2
- data/lib/tasks/shipit.rake +15 -14
- data/lib/tasks/teams.rake +1 -0
- data/test/controllers/api/base_controller_test.rb +3 -2
- data/test/controllers/api/ccmenu_controller_test.rb +9 -8
- data/test/controllers/api/commits_controller_test.rb +3 -2
- data/test/controllers/api/deploys_controller_test.rb +32 -14
- data/test/controllers/api/hooks_controller_test.rb +8 -7
- data/test/controllers/api/locks_controller_test.rb +7 -6
- data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +17 -16
- data/test/controllers/api/outputs_controller_test.rb +3 -1
- data/test/controllers/api/release_statuses_controller_test.rb +2 -1
- data/test/controllers/api/rollback_controller_test.rb +113 -0
- data/test/controllers/api/stacks_controller_test.rb +71 -16
- data/test/controllers/api/tasks_controller_test.rb +13 -12
- data/test/controllers/api_clients_controller_test.rb +5 -4
- data/test/controllers/ccmenu_controller_test.rb +4 -3
- data/test/controllers/commit_checks_controller_test.rb +4 -3
- data/test/controllers/commits_controller_test.rb +3 -2
- data/test/controllers/deploys_controller_test.rb +32 -21
- data/test/controllers/github_authentication_controller_test.rb +1 -0
- data/test/controllers/merge_requests_controller_test.rb +32 -0
- data/test/controllers/merge_status_controller_test.rb +7 -6
- data/test/controllers/release_statuses_controller_test.rb +3 -2
- data/test/controllers/repositories_controller_test.rb +71 -0
- data/test/controllers/rollbacks_controller_test.rb +9 -8
- data/test/controllers/stacks_controller_test.rb +41 -19
- data/test/controllers/status_controller_test.rb +1 -0
- data/test/controllers/tasks_controller_test.rb +32 -19
- data/test/controllers/webhooks_controller_test.rb +33 -17
- data/test/dummy/app/assets/config/manifest.js +3 -0
- data/test/dummy/config/application.rb +7 -2
- data/test/dummy/config/database.yml +9 -0
- data/test/dummy/config/environments/development.rb +3 -4
- data/test/dummy/config/environments/test.rb +2 -5
- data/test/dummy/config/secrets_double_github_app.yml +79 -0
- data/test/dummy/db/schema.rb +59 -17
- data/test/dummy/db/seeds.rb +2 -1
- data/test/fixtures/payloads/check_suite_master.json +4 -32
- data/test/fixtures/payloads/invalid_pull_request.json +117 -0
- data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
- data/test/fixtures/payloads/pull_request_assigned.json +480 -0
- data/test/fixtures/payloads/pull_request_closed.json +454 -0
- data/test/fixtures/payloads/pull_request_labeled.json +461 -0
- data/test/fixtures/payloads/pull_request_opened.json +454 -0
- data/test/fixtures/payloads/pull_request_reopened.json +454 -0
- data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
- data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
- data/test/fixtures/payloads/push_master.json +1 -1
- data/test/fixtures/payloads/push_not_master.json +1 -1
- data/test/fixtures/shipit/commits.yml +31 -3
- data/test/fixtures/shipit/hooks.yml +1 -0
- data/test/fixtures/shipit/merge_requests.yml +141 -0
- data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
- data/test/fixtures/shipit/pull_requests.yml +10 -131
- data/test/fixtures/shipit/repositories.yml +5 -0
- data/test/fixtures/shipit/stacks.yml +235 -14
- data/test/fixtures/shipit/statuses.yml +9 -0
- data/test/fixtures/shipit/tasks.yml +4 -1
- data/test/fixtures/shipit/users.yml +7 -0
- data/test/fixtures/timeout +2 -1
- data/test/helpers/api_helper.rb +1 -0
- data/test/helpers/fixture_aliases_helper.rb +1 -0
- data/test/helpers/hooks_helper.rb +2 -1
- data/test/helpers/json_helper.rb +20 -12
- data/test/helpers/links_helper.rb +4 -3
- data/test/helpers/payloads_helper.rb +5 -0
- data/test/helpers/queries_helper.rb +3 -2
- data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
- data/test/jobs/chunk_rollup_job_test.rb +16 -1
- data/test/jobs/deliver_hook_job_test.rb +1 -0
- data/test/jobs/destroy_repository_job_test.rb +27 -0
- data/test/jobs/destroy_stack_job_test.rb +1 -0
- data/test/jobs/emit_event_job_test.rb +2 -1
- data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
- data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
- data/test/jobs/github_sync_job_test.rb +3 -1
- data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
- data/test/jobs/perform_task_job_test.rb +12 -11
- data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +19 -18
- data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
- data/test/jobs/reap_dead_tasks_job_test.rb +68 -0
- data/test/jobs/refresh_github_user_job_test.rb +1 -0
- data/test/jobs/refresh_status_job_test.rb +1 -0
- data/test/jobs/unique_job_test.rb +1 -0
- data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
- data/test/lib/shipit/deploy_commands_test.rb +16 -0
- data/test/lib/shipit/task_commands_test.rb +17 -0
- data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
- data/test/models/api_client_test.rb +1 -0
- data/test/models/commit_checks_test.rb +1 -0
- data/test/models/commit_deployment_status_test.rb +4 -3
- data/test/models/commit_deployment_test.rb +2 -1
- data/test/models/commits_test.rb +96 -19
- data/test/models/delivery_test.rb +2 -1
- data/test/models/deploy_spec_test.rb +110 -65
- data/test/models/deploy_stats_test.rb +1 -0
- data/test/models/deploys_test.rb +197 -36
- data/test/models/duration_test.rb +1 -0
- data/test/models/github_hook_test.rb +1 -0
- data/test/models/hook_test.rb +47 -10
- data/test/models/membership_test.rb +1 -0
- data/test/models/{pull_request_test.rb → merge_request_test.rb} +53 -37
- data/test/models/pull_request_assignment_test.rb +16 -0
- data/test/models/release_statuses_test.rb +1 -0
- data/test/models/rollbacks_test.rb +1 -0
- data/test/models/shipit/check_run_test.rb +125 -5
- data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
- data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
- data/test/models/shipit/provisioning_handler_test.rb +64 -0
- data/test/models/shipit/pull_request_test.rb +52 -0
- data/test/models/shipit/repository_test.rb +6 -1
- data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
- data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
- data/test/models/shipit/review_stack_test.rb +91 -0
- data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +121 -16
- data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
- data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
- data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
- data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
- data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
- data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
- data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
- data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +107 -0
- data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
- data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +1 -0
- data/test/models/status/group_test.rb +1 -0
- data/test/models/status/missing_test.rb +1 -0
- data/test/models/status_test.rb +1 -0
- data/test/models/task_definitions_test.rb +9 -8
- data/test/models/tasks_test.rb +81 -1
- data/test/models/team_test.rb +4 -2
- data/test/models/undeployed_commits_test.rb +1 -0
- data/test/models/users_test.rb +13 -5
- data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
- data/test/test_command_integration.rb +3 -2
- data/test/test_helper.rb +49 -31
- data/test/unit/anonymous_user_serializer_test.rb +14 -0
- data/test/unit/command_test.rb +16 -10
- data/test/unit/commands_test.rb +1 -0
- data/test/unit/commit_serializer_test.rb +16 -0
- data/test/unit/csv_serializer_test.rb +3 -2
- data/test/unit/deploy_commands_test.rb +75 -18
- data/test/unit/deploy_serializer_test.rb +17 -0
- data/test/unit/environment_variables_test.rb +5 -4
- data/test/unit/github_app_test.rb +3 -3
- data/test/unit/github_apps_test.rb +416 -0
- data/test/unit/github_url_helper_test.rb +6 -0
- data/test/unit/rollback_commands_test.rb +2 -1
- data/test/unit/shipit_deployment_checks_test.rb +77 -0
- data/test/unit/shipit_helper_test.rb +17 -0
- data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
- data/test/unit/shipit_test.rb +15 -0
- data/test/unit/user_serializer_test.rb +14 -0
- data/test/unit/variable_definition_test.rb +1 -0
- metadata +320 -178
- data/app/controllers/shipit/api/pull_requests_controller.rb +0 -36
- data/app/controllers/shipit/pull_requests_controller.rb +0 -30
- data/app/jobs/shipit/merge_pull_requests_job.rb +0 -31
- data/app/jobs/shipit/refresh_pull_request_job.rb +0 -10
- data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
- data/test/controllers/pull_requests_controller_test.rb +0 -31
- data/test/fixtures/shipit/output_chunks.yml +0 -47
- data/test/models/output_chunk_test.rb +0 -20
data/test/models/status_test.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
@@ -11,10 +12,10 @@ module Shipit
|
|
|
11
12
|
'steps' => ['touch tmp/restart'],
|
|
12
13
|
'allow_concurrency' => true,
|
|
13
14
|
'variables' => [
|
|
14
|
-
{'name' => 'FOO', 'title' => 'Set to 0 to foo', 'default' => '1'},
|
|
15
|
-
{'name' => 'BAR', 'title' => 'Set to 1 to bar', 'default' => '0'},
|
|
16
|
-
{'name' => 'WALRUS', 'title' => 'Use with caution', 'default' => ' '},
|
|
17
|
-
{'name' => 'NODEFAULT', 'title' => 'Variable without default'},
|
|
15
|
+
{ 'name' => 'FOO', 'title' => 'Set to 0 to foo', 'default' => '1' },
|
|
16
|
+
{ 'name' => 'BAR', 'title' => 'Set to 1 to bar', 'default' => '0' },
|
|
17
|
+
{ 'name' => 'WALRUS', 'title' => 'Use with caution', 'default' => ' ' },
|
|
18
|
+
{ 'name' => 'NODEFAULT', 'title' => 'Variable without default' },
|
|
18
19
|
],
|
|
19
20
|
)
|
|
20
21
|
end
|
|
@@ -43,10 +44,10 @@ module Shipit
|
|
|
43
44
|
checklist: [],
|
|
44
45
|
allow_concurrency: true,
|
|
45
46
|
variables: [
|
|
46
|
-
{'name' => 'FOO', 'title' => 'Set to 0 to foo', 'default' => '1', 'select' => nil},
|
|
47
|
-
{'name' => 'BAR', 'title' => 'Set to 1 to bar', 'default' => '0', 'select' => nil},
|
|
48
|
-
{'name' => 'WALRUS', 'title' => 'Use with caution', 'default' => ' ', 'select' => nil},
|
|
49
|
-
{'name' => 'NODEFAULT', 'title' => 'Variable without default', 'default' => '', 'select' => nil},
|
|
47
|
+
{ 'name' => 'FOO', 'title' => 'Set to 0 to foo', 'default' => '1', 'select' => nil },
|
|
48
|
+
{ 'name' => 'BAR', 'title' => 'Set to 1 to bar', 'default' => '0', 'select' => nil },
|
|
49
|
+
{ 'name' => 'WALRUS', 'title' => 'Use with caution', 'default' => ' ', 'select' => nil },
|
|
50
|
+
{ 'name' => 'NODEFAULT', 'title' => 'Variable without default', 'default' => '', 'select' => nil },
|
|
50
51
|
],
|
|
51
52
|
}
|
|
52
53
|
assert_equal as_json, TaskDefinition.load(TaskDefinition.dump(@definition)).as_json
|
data/test/models/tasks_test.rb
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
4
5
|
class TasksTest < ActiveSupport::TestCase
|
|
5
6
|
test "#title interpolates env" do
|
|
6
7
|
task = shipit_tasks(:shipit_rendered_failover)
|
|
7
|
-
assert_equal({'POD_ID' => '12'}, task.env)
|
|
8
|
+
assert_equal({ 'POD_ID' => '12' }, task.env)
|
|
8
9
|
assert_equal 'Failover pod 12', task.title
|
|
9
10
|
end
|
|
10
11
|
|
|
@@ -30,5 +31,84 @@ module Shipit
|
|
|
30
31
|
|
|
31
32
|
task.write("hello\nworld")
|
|
32
33
|
end
|
|
34
|
+
|
|
35
|
+
test "#chunk_output truncates output exceeding the storage limit" do
|
|
36
|
+
task = shipit_tasks(:shipit)
|
|
37
|
+
Shipit.redis.del(task.send(:output_key))
|
|
38
|
+
|
|
39
|
+
task.write('a' * (Task::OUTPUT_SIZE_LIMIT * 1.1))
|
|
40
|
+
|
|
41
|
+
output = task.chunk_output
|
|
42
|
+
|
|
43
|
+
assert output.size <= Task::OUTPUT_SIZE_LIMIT, "Output was not truncated to the limit"
|
|
44
|
+
# We don't use assert_includes because it will print the whole message
|
|
45
|
+
assert(
|
|
46
|
+
output.include?(Task::OUTPUT_TRUNCATED_MESSAGE),
|
|
47
|
+
"'#{Task::OUTPUT_TRUNCATED_MESSAGE.chomp}' was not present in the output",
|
|
48
|
+
)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
test "#retry_if_necessary creates a duplicated task object with pending status and nil created_at and ended_at" do
|
|
52
|
+
task = shipit_tasks(:shipit)
|
|
53
|
+
task_stack = task.stack
|
|
54
|
+
task.retry_if_necessary
|
|
55
|
+
|
|
56
|
+
retried_task = task_stack.deploys.last
|
|
57
|
+
|
|
58
|
+
assert_not_equal task.id, retried_task.id
|
|
59
|
+
assert_nil retried_task.started_at
|
|
60
|
+
assert_nil retried_task.ended_at
|
|
61
|
+
assert_equal 'pending', retried_task.status
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
test "#retry_if_necessary does not create a new task object if max_retries is nil" do
|
|
65
|
+
task = shipit_tasks(:shipit2)
|
|
66
|
+
|
|
67
|
+
assert_no_difference 'Task.count', 'No new task should be created' do
|
|
68
|
+
task.retry_if_necessary
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
test "#retry_if_necessary does not create a new task object if the stack is locked" do
|
|
73
|
+
task = shipit_tasks(:shipit2)
|
|
74
|
+
task.stack.lock("test", task.user)
|
|
75
|
+
|
|
76
|
+
assert_no_difference 'Task.count', 'No new task should be created' do
|
|
77
|
+
task.retry_if_necessary
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
test "#retries_configured? returns true when max_retries is not nil and is greater than zero" do
|
|
82
|
+
task_with_three_retries = shipit_tasks(:shipit)
|
|
83
|
+
assert_predicate task_with_three_retries, :retries_configured?
|
|
84
|
+
|
|
85
|
+
task_with_nil_retries = shipit_tasks(:shipit2)
|
|
86
|
+
refute_predicate task_with_nil_retries, :retries_configured?
|
|
87
|
+
|
|
88
|
+
task_with_zero_retries = shipit_tasks(:shipit_restart)
|
|
89
|
+
refute_predicate task_with_zero_retries, :retries_configured?
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
test ".due_for_rollup includes tasks in successful terminal states" do
|
|
93
|
+
task = shipit_tasks(:shipit)
|
|
94
|
+
task.update(
|
|
95
|
+
rolled_up: false,
|
|
96
|
+
created_at: (60 + 1).minutes.ago.to_s(:db),
|
|
97
|
+
status: "success",
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
assert_includes Shipit::Task.due_for_rollup, task
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
test ".due_for_rollup includes tasks in unsuccessful terminal states" do
|
|
104
|
+
task = shipit_tasks(:shipit)
|
|
105
|
+
task.update(
|
|
106
|
+
rolled_up: false,
|
|
107
|
+
created_at: (60 + 1).minutes.ago.to_s(:db),
|
|
108
|
+
status: "error",
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
assert_includes Shipit::Task.due_for_rollup, task
|
|
112
|
+
end
|
|
33
113
|
end
|
|
34
114
|
end
|
data/test/models/team_test.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
@@ -11,16 +12,17 @@ module Shipit
|
|
|
11
12
|
end
|
|
12
13
|
|
|
13
14
|
test ".find_or_create_by_handle fetch the team from github if it's not in the db already" do
|
|
14
|
-
Shipit.github.api.expects(:org_teams).with('shopify', per_page: 100)
|
|
15
15
|
response = stub(rels: {}, data: [new_team])
|
|
16
|
+
Shipit.github.api.expects(:org_teams).with('shopify', per_page: 100).returns(response.data)
|
|
16
17
|
Shipit.github.api.expects(:last_response).returns(response)
|
|
18
|
+
|
|
17
19
|
assert_difference -> { Team.count }, 1 do
|
|
18
20
|
Team.find_or_create_by_handle('Shopify/new-team')
|
|
19
21
|
end
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
test "#refresh_members! fetch all the team members from github" do
|
|
23
|
-
response = stub(rels: {members: members_resource})
|
|
25
|
+
response = stub(rels: { members: members_resource })
|
|
24
26
|
Shipit.github.api.expects(:get).with(@team.api_url).returns(response)
|
|
25
27
|
assert_difference -> { User.count }, 1 do
|
|
26
28
|
@team.refresh_members!
|
data/test/models/users_test.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
@@ -91,8 +92,8 @@ module Shipit
|
|
|
91
92
|
|
|
92
93
|
stub_request(:get, @emails_url).to_return(
|
|
93
94
|
status: %w(200 OK),
|
|
94
|
-
body: [{email: expected_email}].to_json,
|
|
95
|
-
headers: {"Content-Type" => "application/json"},
|
|
95
|
+
body: [{ email: expected_email }].to_json,
|
|
96
|
+
headers: { "Content-Type" => "application/json" },
|
|
96
97
|
)
|
|
97
98
|
|
|
98
99
|
user = User.find_or_create_from_github(@github_user)
|
|
@@ -119,7 +120,7 @@ module Shipit
|
|
|
119
120
|
stub_request(:get, @emails_url).to_return(
|
|
120
121
|
status: %w(200 OK),
|
|
121
122
|
body: result_email_records.to_json,
|
|
122
|
-
headers: {"Content-Type" => "application/json"},
|
|
123
|
+
headers: { "Content-Type" => "application/json" },
|
|
123
124
|
)
|
|
124
125
|
|
|
125
126
|
user = User.find_or_create_from_github(@github_user)
|
|
@@ -141,7 +142,7 @@ module Shipit
|
|
|
141
142
|
stub_request(:get, @emails_url).to_return(
|
|
142
143
|
status: %w(200 OK),
|
|
143
144
|
body: result_email_records.to_json,
|
|
144
|
-
headers: {"Content-Type" => "application/json"},
|
|
145
|
+
headers: { "Content-Type" => "application/json" },
|
|
145
146
|
)
|
|
146
147
|
|
|
147
148
|
user = User.find_or_create_from_github(@github_user)
|
|
@@ -162,9 +163,16 @@ module Shipit
|
|
|
162
163
|
assert_nil user.email
|
|
163
164
|
end
|
|
164
165
|
|
|
166
|
+
test "find_or_create_from_github handles user 401" do
|
|
167
|
+
Shipit.preferred_org_emails = [@org_domain]
|
|
168
|
+
Octokit::Client.any_instance.expects(:emails).raises(Octokit::Unauthorized)
|
|
169
|
+
user = User.find_or_create_from_github(@minimal_github_user)
|
|
170
|
+
assert_nil user.email
|
|
171
|
+
end
|
|
172
|
+
|
|
165
173
|
test "#identifiers_for_ping returns a hash with the user's github_id, name, email and github_login" do
|
|
166
174
|
user = shipit_users(:bob)
|
|
167
|
-
expected_ouput = {github_id: user.github_id, name: user.name, email: user.email, github_login: user.login}
|
|
175
|
+
expected_ouput = { github_id: user.github_id, name: user.name, email: user.email, github_login: user.login }
|
|
168
176
|
assert_equal expected_ouput, user.identifiers_for_ping
|
|
169
177
|
end
|
|
170
178
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
class PulLRequestSerializerTest < ActiveSupport::TestCase
|
|
7
|
+
test "structure" do
|
|
8
|
+
pull_request = shipit_pull_requests(:review_stack_review)
|
|
9
|
+
|
|
10
|
+
serialized = serializer.new(pull_request).as_json
|
|
11
|
+
|
|
12
|
+
assert_includes serialized.keys, :id
|
|
13
|
+
assert_includes serialized.keys, :number
|
|
14
|
+
assert_includes serialized.keys, :title
|
|
15
|
+
assert_includes serialized.keys, :github_id
|
|
16
|
+
assert_includes serialized.keys, :additions
|
|
17
|
+
assert_includes serialized.keys, :deletions
|
|
18
|
+
assert_includes serialized.keys, :state
|
|
19
|
+
assert_includes serialized.keys, :html_url
|
|
20
|
+
assert_includes serialized.keys, :user
|
|
21
|
+
assert_includes serialized.keys, :assignees
|
|
22
|
+
assert_includes serialized.keys, :head
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def serializer
|
|
26
|
+
Shipit::PullRequestSerializer
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
2
3
|
|
|
3
4
|
path = './fixtures/timeout'
|
|
4
5
|
buffer = []
|
|
5
|
-
command = Shipit::Command.new({path => {'timeout' => 2}}, env: {}, chdir: __dir__)
|
|
6
|
+
command = Shipit::Command.new({ path => { 'timeout' => 2 } }, env: {}, chdir: __dir__)
|
|
6
7
|
begin
|
|
7
8
|
command.stream! do |chunk|
|
|
8
9
|
buffer << chunk
|
|
@@ -24,5 +25,5 @@ unless buffer.join == expected_output.join
|
|
|
24
25
|
puts "Got: ------------"
|
|
25
26
|
puts buffer.map(&:inspect).join("\n")
|
|
26
27
|
puts "-----------------"
|
|
27
|
-
exit
|
|
28
|
+
exit(1)
|
|
28
29
|
end
|
data/test/test_helper.rb
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
ENV["RAILS_ENV"] ||= "test"
|
|
2
3
|
|
|
4
|
+
if Warning.respond_to?(:[]=)
|
|
5
|
+
Warning[:deprecated] = true
|
|
6
|
+
end
|
|
7
|
+
|
|
3
8
|
require 'simplecov'
|
|
4
|
-
SimpleCov.start
|
|
9
|
+
SimpleCov.start('rails') do
|
|
5
10
|
enable_coverage :branch
|
|
6
11
|
end
|
|
7
12
|
|
|
@@ -19,7 +24,7 @@ require 'spy/integration'
|
|
|
19
24
|
# Load fixtures from the engine
|
|
20
25
|
if ActiveSupport::TestCase.respond_to?(:fixture_path=)
|
|
21
26
|
ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
|
|
22
|
-
ActiveSupport::TestCase.fixtures
|
|
27
|
+
ActiveSupport::TestCase.fixtures(:all)
|
|
23
28
|
end
|
|
24
29
|
|
|
25
30
|
Dir[File.expand_path('../helpers/**/*.rb', __FILE__)].each do |helper|
|
|
@@ -31,41 +36,54 @@ begin
|
|
|
31
36
|
rescue LoadError
|
|
32
37
|
end
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
include ActiveJob::TestHelper
|
|
43
|
-
|
|
44
|
-
setup do
|
|
45
|
-
@routes = Shipit::Engine.routes
|
|
46
|
-
Shipit.github.api.stubs(:login).returns('shipit')
|
|
39
|
+
# FIXME: We need to get rid of active_model_serializers
|
|
40
|
+
# This is a monkey patch for Ruby 2.7+ compatibility
|
|
41
|
+
module ActionController
|
|
42
|
+
module SerializationAssertions
|
|
43
|
+
def process(*, **)
|
|
44
|
+
@serializers = Hash.new(0)
|
|
45
|
+
super
|
|
46
|
+
end
|
|
47
47
|
end
|
|
48
|
+
end
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
module ActiveSupport
|
|
51
|
+
class TestCase
|
|
52
|
+
include PayloadsHelper
|
|
53
|
+
include FixtureAliasesHelper
|
|
54
|
+
include QueriesHelper
|
|
55
|
+
include JSONHelper
|
|
56
|
+
include LinksHelper
|
|
57
|
+
include ApiHelper
|
|
58
|
+
include HooksHelper
|
|
59
|
+
include ActiveJob::TestHelper
|
|
60
|
+
|
|
61
|
+
setup do
|
|
62
|
+
@routes = Shipit::Engine.routes
|
|
63
|
+
Shipit.github.api.stubs(:login).returns('shipit')
|
|
54
64
|
end
|
|
55
|
-
end
|
|
56
65
|
|
|
57
|
-
|
|
66
|
+
teardown do
|
|
67
|
+
Shipit.redis.flushdb
|
|
68
|
+
Shipit.instance_variable_names.each do |name|
|
|
69
|
+
next if %w(@mocha @redis).include?(name)
|
|
70
|
+
Shipit.remove_instance_variable(name)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
58
73
|
|
|
59
|
-
|
|
60
|
-
#
|
|
61
|
-
# Note: You'll currently still have to declare fixtures explicitly in integration tests
|
|
62
|
-
# -- they do not yet inherit this setting
|
|
63
|
-
fixtures :all
|
|
74
|
+
ActiveRecord::Migration.check_pending!
|
|
64
75
|
|
|
65
|
-
|
|
66
|
-
|
|
76
|
+
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
|
|
77
|
+
#
|
|
78
|
+
# Note: You'll currently still have to declare fixtures explicitly in integration tests
|
|
79
|
+
# -- they do not yet inherit this setting
|
|
80
|
+
fixtures :all
|
|
67
81
|
|
|
68
|
-
|
|
69
|
-
|
|
82
|
+
# Add more helper methods to be used by all tests here...
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
def resource(data)
|
|
86
|
+
Sawyer::Resource.new(Sawyer::Agent.new('http://example.com'), data)
|
|
87
|
+
end
|
|
70
88
|
end
|
|
71
89
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
module Shipit
|
|
5
|
+
class AnonymousUserSerializerTest < ActiveSupport::TestCase
|
|
6
|
+
test 'sets anonymous to true' do
|
|
7
|
+
user = AnonymousUser.new
|
|
8
|
+
serializer = ActiveModel::Serializer.serializer_for(user)
|
|
9
|
+
assert_equal AnonymousUserSerializer, serializer
|
|
10
|
+
serialized = serializer.new(user).to_json
|
|
11
|
+
assert_json_document(serialized, "anonymous", true)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
data/test/unit/command_test.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'test_helper'
|
|
2
3
|
|
|
3
4
|
module Shipit
|
|
@@ -9,32 +10,37 @@ module Shipit
|
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
test "#interpolate_environment_variables replace environment variables by their value" do
|
|
12
|
-
command = Command.new('cap $ENVIRONMENT deploy', env: {'ENVIRONMENT' => 'production'}, chdir: '.')
|
|
13
|
+
command = Command.new('cap $ENVIRONMENT deploy', env: { 'ENVIRONMENT' => 'production' }, chdir: '.')
|
|
13
14
|
assert_equal [%(cap production deploy)], command.interpolated_arguments
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
test "#interpolate_environment_variables coerce nil to empty string" do
|
|
17
|
-
command = Command.new('cap $FOO deploy', env: {'ENVIRONMENT' => 'production'}, chdir: '.')
|
|
18
|
+
command = Command.new('cap $FOO deploy', env: { 'ENVIRONMENT' => 'production' }, chdir: '.')
|
|
18
19
|
assert_equal [%(cap '' deploy)], command.interpolated_arguments
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
test '#interpolate_environment_variables escape the variable contents' do
|
|
22
23
|
malicious_string = '$(echo pwnd)'
|
|
23
|
-
command = Command.new('echo $FOO', env: {'FOO' => malicious_string}, chdir: '.')
|
|
24
|
+
command = Command.new('echo $FOO', env: { 'FOO' => malicious_string }, chdir: '.')
|
|
24
25
|
assert_equal malicious_string, command.run.chomp
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
test "#interpolate_environment_variables fallback to ENV" do
|
|
28
29
|
previous = ENV['SHIPIT_TEST']
|
|
29
30
|
ENV['SHIPIT_TEST'] = 'quux'
|
|
30
|
-
command = Command.new('cap $SHIPIT_TEST deploy', env: {'ENVIRONMENT' => 'production'}, chdir: '.')
|
|
31
|
-
assert_equal
|
|
31
|
+
command = Command.new('cap $SHIPIT_TEST deploy', env: { 'ENVIRONMENT' => 'production' }, chdir: '.')
|
|
32
|
+
assert_equal([%(cap quux deploy)], command.interpolated_arguments)
|
|
32
33
|
ensure
|
|
33
34
|
ENV['SHIPIT_TEST'] = previous
|
|
34
35
|
end
|
|
35
36
|
|
|
37
|
+
test "#env cast to strings except for `nil`" do
|
|
38
|
+
command = Command.new('echo foo', env: { 'SOME_PATH' => Pathname.new('/foo'), 'HOST' => nil }, chdir: '.')
|
|
39
|
+
assert_equal({ 'SOME_PATH' => '/foo', 'HOST' => nil }, command.env)
|
|
40
|
+
end
|
|
41
|
+
|
|
36
42
|
test "#timeout is 5 minutes by default" do
|
|
37
|
-
command = Command.new('cap $LANG deploy', env: {'ENVIRONMENT' => 'production'}, chdir: '.')
|
|
43
|
+
command = Command.new('cap $LANG deploy', env: { 'ENVIRONMENT' => 'production' }, chdir: '.')
|
|
38
44
|
assert_equal 5.minutes.to_i, command.timeout
|
|
39
45
|
end
|
|
40
46
|
|
|
@@ -44,7 +50,7 @@ module Shipit
|
|
|
44
50
|
end
|
|
45
51
|
|
|
46
52
|
test "#timeout returns the command option timeout over the `default_timeout` if present" do
|
|
47
|
-
command = Command.new({'cap $LANG deploy' => {'timeout' => 10}}, default_timeout: 5, env: {}, chdir: '.')
|
|
53
|
+
command = Command.new({ 'cap $LANG deploy' => { 'timeout' => 10 } }, default_timeout: 5, env: {}, chdir: '.')
|
|
48
54
|
assert_equal 10, command.timeout
|
|
49
55
|
end
|
|
50
56
|
|
|
@@ -58,14 +64,14 @@ module Shipit
|
|
|
58
64
|
end
|
|
59
65
|
|
|
60
66
|
test "command not found" do
|
|
61
|
-
error = assert_raises
|
|
67
|
+
error = assert_raises(Command::NotFound) do
|
|
62
68
|
Command.new('does-not-exist foo bar', env: {}, chdir: '.').run
|
|
63
69
|
end
|
|
64
70
|
assert_equal 'does-not-exist: command not found', error.message
|
|
65
71
|
end
|
|
66
72
|
|
|
67
73
|
test "permission denied" do
|
|
68
|
-
error = assert_raises
|
|
74
|
+
error = assert_raises(Command::Denied) do
|
|
69
75
|
Command.new('/etc/passwd foo bar', env: {}, chdir: '.').run
|
|
70
76
|
end
|
|
71
77
|
assert_equal '/etc/passwd: Permission denied', error.message
|
|
@@ -120,7 +126,7 @@ module Shipit
|
|
|
120
126
|
signalled = true
|
|
121
127
|
break
|
|
122
128
|
end
|
|
123
|
-
sleep
|
|
129
|
+
sleep(0.1)
|
|
124
130
|
end
|
|
125
131
|
signalled
|
|
126
132
|
end
|