From 7c3731e5476b326c333c37d76402b1e7d38874ee Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Thu, 12 Jun 2025 11:27:06 +0200 Subject: [PATCH] tests: Replace `assert_eq!` with `assert_snapshot!` for status code checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit updates test assertions to use `insta::assert_snapshot!` for HTTP status code checks across various test files. This makes it easier to update the assertions in case status codes for certain errors are changed/fixed. Unfortunately, this changes the numbering of the file-based snapshots, which causes the diff to look much larger than it actually is... 🙈 --- src/controllers/helpers/pagination.rs | 2 +- src/controllers/krate/delete.rs | 26 +++---- ...elete__tests__happy_path_new_crate-3.snap} | 0 ...elete__tests__happy_path_old_crate-3.snap} | 0 ...tests__happy_path_really_old_crate-3.snap} | 0 ..._configs__create__tests__happy_path-2.snap | 34 ++++------ ..._configs__create__tests__happy_path-3.snap | 24 +++++++ ...ub_configs__create__tests__happy_path.snap | 16 ----- ...tests__happy_path_with_environment-2.snap} | 0 .../trustpub/github_configs/create/tests.rs | 31 +++++---- ...configs__delete__tests__happy_path-2.snap} | 0 .../trustpub/github_configs/delete/tests.rs | 15 ++--- ...list__tests__crate_with_no_configs-2.snap} | 0 ...ub_configs__list__tests__happy_path-2.snap | 16 ++++- ...ub_configs__list__tests__happy_path-4.snap | 18 +++++ ...thub_configs__list__tests__happy_path.snap | 28 -------- .../trustpub/github_configs/list/tests.rs | 19 +++--- .../trustpub/tokens/exchange/tests.rs | 37 +++++----- .../trustpub/tokens/revoke/tests.rs | 11 ++- src/controllers/user/email_verification.rs | 7 +- ...il_verification__tests__happy_path-3.snap} | 0 src/controllers/version/docs.rs | 8 +-- src/openapi.rs | 5 +- ...__openapi__tests__openapi_snapshot-2.snap} | 0 src/tests/account_lock.rs | 5 +- src/tests/authentication.rs | 4 +- src/tests/cors.rs | 7 +- src/tests/github_secret_scanning.rs | 19 +++--- src/tests/issues/issue1205.rs | 7 +- src/tests/issues/issue2736.rs | 5 +- src/tests/krate/following.rs | 12 ++-- src/tests/krate/publish/auth.rs | 7 +- src/tests/krate/publish/basics.rs | 13 ++-- src/tests/krate/publish/categories.rs | 7 +- src/tests/krate/publish/deleted_crates.rs | 3 +- src/tests/krate/publish/dependencies.rs | 31 +++++---- src/tests/krate/publish/edition.rs | 7 +- src/tests/krate/publish/emails.rs | 5 +- src/tests/krate/publish/features.rs | 17 +++-- src/tests/krate/publish/inheritance.rs | 5 +- src/tests/krate/publish/keywords.rs | 11 ++- src/tests/krate/publish/links.rs | 6 +- src/tests/krate/publish/manifest.rs | 29 ++++---- src/tests/krate/publish/max_size.rs | 9 ++- src/tests/krate/publish/rate_limit.rs | 7 +- src/tests/krate/publish/readme.rs | 7 +- src/tests/krate/publish/similar_names.rs | 7 +- ...__krate__publish__basics__new_krate-2.snap | 44 +++++++++--- ...__krate__publish__basics__new_krate-3.snap | 14 ++++ ..._krate__publish__basics__new_krate-5.snap} | 0 ...e__publish__basics__new_krate_twice-2.snap | 50 +++++++++----- ...e__publish__basics__new_krate_twice-3.snap | 22 ++++++ ...ate__publish__basics__new_krate_twice.snap | 42 ------------ ...ublish__basics__new_krate_twice_alt-2.snap | 50 +++++++++----- ...ublish__basics__new_krate_twice_alt-3.snap | 22 ++++++ ..._publish__basics__new_krate_twice_alt.snap | 42 ------------ ...h__basics__new_krate_weird_version-2.snap} | 0 ...lish__basics__new_krate_with_token-2.snap} | 0 ...publish__basics__new_krate_with_token.snap | 42 ------------ ...blish__categories__good_categories-2.snap} | 0 ...__publish__dependencies__dep_limit-4.snap} | 0 ..._publish__edition__edition_is_saved-2.snap | 64 +++++++----------- ..._publish__edition__edition_is_saved-4.snap | 56 ++++++++++++++++ ...e__publish__edition__edition_is_saved.snap | 42 ------------ ...__publish__keywords__good_keywords-2.snap} | 0 ...lish__links__crate_with_links_field-3.snap | 61 ++++++++++++++--- ...lish__links__crate_with_links_field-5.snap | 15 +++++ ...__publish__manifest__boolean_readme-2.snap | 64 +++++++----------- ..._publish__manifest__boolean_readme-4.snap} | 14 ++-- ...te__publish__manifest__boolean_readme.snap | 42 ------------ ...ublish__manifest__lib_and_bin_crate-2.snap | 67 +++++++------------ ...ublish__manifest__lib_and_bin_crate-4.snap | 59 ++++++++++++++++ ..._publish__manifest__lib_and_bin_crate.snap | 42 ------------ ...ult_axum_limit_and_max_upload_size-2.snap} | 0 ...eadme__new_krate_with_empty_readme-2.snap} | 0 ...ish__readme__new_krate_with_readme-2.snap} | 0 ...krate_with_readme_and_plus_version-2.snap} | 0 ...ate__publish__trustpub__full_flow-11.snap} | 0 ...rate__publish__trustpub__full_flow-7.snap} | 0 ...rate__publish__trustpub__full_flow-9.snap} | 0 ...ate__publish__trustpub__happy_path-2.snap} | 0 ..._happy_path_with_fancy_auth_header-2.snap} | 0 src/tests/krate/publish/tarball.rs | 15 ++--- src/tests/krate/publish/trustpub.rs | 27 ++++---- src/tests/krate/publish/validation.rs | 16 ++--- src/tests/krate/yanking.rs | 5 +- src/tests/not_found_error.rs | 5 +- src/tests/owners.rs | 24 +++---- src/tests/pagination.rs | 3 +- src/tests/read_only_mode.rs | 9 ++- src/tests/routes/categories/get.rs | 5 +- ...sts__routes__categories__get__show-2.snap} | 0 src/tests/routes/crates/downloads.rs | 16 ++--- src/tests/routes/crates/following.rs | 17 ++--- src/tests/routes/crates/list.rs | 6 +- src/tests/routes/crates/new.rs | 3 +- src/tests/routes/crates/owners/add.rs | 43 ++++++------ src/tests/routes/crates/owners/remove.rs | 19 +++--- src/tests/routes/crates/read.rs | 12 ++-- .../routes/crates/reverse_dependencies.rs | 21 +++--- ...crates__downloads__crate_downloads-2.snap} | 0 ...ates__downloads__version_downloads-2.snap} | 0 ...tes__read__include_default_version-2.snap} | 0 ...ts__routes__crates__read__new_name-2.snap} | 0 ..._tests__routes__crates__read__show-2.snap} | 0 ...tes__crates__read__show_all_yanked-2.snap} | 0 ...routes__crates__read__show_minimal-2.snap} | 0 ...t_included_in_reverse_dependencies-2.snap} | 0 ..._dependencies__reverse_dependencies-2.snap | 58 +++++++++++++++- ...dependencies__reverse_dependencies-4.snap} | 0 ...se_dependencies__reverse_dependencies.snap | 63 ----------------- ...des_published_by_user_when_present-2.snap} | 0 ..._supports_u64_version_number_parts-2.snap} | 0 ...old_version_depended_but_new_doesnt-2.snap | 11 +++ ...version_doesnt_depend_but_new_does-2.snap} | 0 ...ot_included_in_reverse_dependencies-2.snap | 58 +++++++++++++++- ...ot_included_in_reverse_dependencies-4.snap | 11 +++ ..._not_included_in_reverse_dependencies.snap | 63 ----------------- .../routes/crates/versions/dependencies.rs | 5 +- src/tests/routes/crates/versions/list.rs | 11 ++- ...__crates__versions__list__versions-2.snap} | 0 .../routes/crates/versions/yank_unyank.rs | 51 +++++++------- src/tests/routes/keywords/read.rs | 6 +- src/tests/routes/me/get.rs | 7 +- ...tes_io__tests__routes__me__get__me-4.snap} | 0 ...tes_io__tests__routes__me__get__me-6.snap} | 0 src/tests/routes/me/tokens/create.rs | 23 +++---- src/tests/routes/me/tokens/delete_current.rs | 7 +- src/tests/routes/me/tokens/get.rs | 13 ++-- src/tests/routes/me/tokens/list.rs | 19 +++--- ...okens__create__create_token_success-2.snap | 25 +++---- ...okens__create__create_token_success-3.snap | 15 +++++ ..._tokens__create__create_token_success.snap | 16 ----- ...eate__create_token_with_expiry_date-2.snap | 25 +++---- ...eate__create_token_with_expiry_date-3.snap | 15 +++++ ...create__create_token_with_expiry_date.snap | 16 ----- ...eate__create_token_with_null_scopes-2.snap | 25 +++---- ...eate__create_token_with_null_scopes-3.snap | 15 +++++ ...create__create_token_with_null_scopes.snap | 16 ----- ...s__create__create_token_with_scopes-2.snap | 30 +++++---- ...s__create__create_token_with_scopes-3.snap | 15 +++++ ...ens__create__create_token_with_scopes.snap | 21 ------ ...sts__routes__me__tokens__get__show-2.snap} | 0 ...okens__get__show_token_with_scopes-2.snap} | 0 ...tes__me__tokens__list__list_tokens-2.snap} | 0 src/tests/routes/me/updates.rs | 5 +- src/tests/routes/session/authorize.rs | 3 +- src/tests/routes/users/update.rs | 14 ++-- .../users/update/publish_notifications.rs | 11 ++- ...ions__unsubscribe_and_resubscribe-11.snap} | 0 ...tions__unsubscribe_and_resubscribe-2.snap} | 0 ...tions__unsubscribe_and_resubscribe-5.snap} | 0 ...tions__unsubscribe_and_resubscribe-7.snap} | 0 ...hub_secret_alert_for_revoked_token-2.snap} | 0 ...hub_secret_alert_for_unknown_token-2.snap} | 0 ...__github_secret_alert_revokes_token-2.snap | 22 +++--- ...__github_secret_alert_revokes_token-3.snap | 17 +++++ ...ng__github_secret_alert_revokes_token.snap | 11 --- ...s__owners__modify_multiple_owners-10.snap} | 0 ..._which_writes_db_in_read_only_mode-2.snap} | 0 src/tests/team.rs | 29 ++++---- src/tests/token.rs | 6 +- src/tests/unhealthy_database.rs | 20 +++--- src/tests/user.rs | 4 +- src/tests/worker/git.rs | 10 +-- 165 files changed, 1185 insertions(+), 1234 deletions(-) rename src/controllers/krate/snapshots/{crates_io__controllers__krate__delete__tests__happy_path_new_crate-2.snap => crates_io__controllers__krate__delete__tests__happy_path_new_crate-3.snap} (100%) rename src/controllers/krate/snapshots/{crates_io__controllers__krate__delete__tests__happy_path_old_crate-2.snap => crates_io__controllers__krate__delete__tests__happy_path_old_crate-3.snap} (100%) rename src/controllers/krate/snapshots/{crates_io__controllers__krate__delete__tests__happy_path_really_old_crate-2.snap => crates_io__controllers__krate__delete__tests__happy_path_really_old_crate-3.snap} (100%) create mode 100644 src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path-3.snap delete mode 100644 src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path.snap rename src/controllers/trustpub/github_configs/create/snapshots/{crates_io__controllers__trustpub__github_configs__create__tests__happy_path_with_environment.snap => crates_io__controllers__trustpub__github_configs__create__tests__happy_path_with_environment-2.snap} (100%) rename src/controllers/trustpub/github_configs/delete/snapshots/{crates_io__controllers__trustpub__github_configs__delete__tests__happy_path.snap => crates_io__controllers__trustpub__github_configs__delete__tests__happy_path-2.snap} (100%) rename src/controllers/trustpub/github_configs/list/snapshots/{crates_io__controllers__trustpub__github_configs__list__tests__crate_with_no_configs.snap => crates_io__controllers__trustpub__github_configs__list__tests__crate_with_no_configs-2.snap} (100%) create mode 100644 src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path-4.snap delete mode 100644 src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path.snap rename src/controllers/user/snapshots/{crates_io__controllers__user__email_verification__tests__happy_path-2.snap => crates_io__controllers__user__email_verification__tests__happy_path-3.snap} (100%) rename src/snapshots/{crates_io__openapi__tests__openapi_snapshot.snap => crates_io__openapi__tests__openapi_snapshot-2.snap} (100%) create mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-3.snap rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__basics__new_krate-4.snap => crates_io__tests__krate__publish__basics__new_krate-5.snap} (100%) create mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice-3.snap delete mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice.snap create mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt-3.snap delete mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt.snap rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__basics__new_krate_weird_version.snap => crates_io__tests__krate__publish__basics__new_krate_weird_version-2.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__basics__new_krate.snap => crates_io__tests__krate__publish__basics__new_krate_with_token-2.snap} (100%) delete mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_with_token.snap rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__categories__good_categories.snap => crates_io__tests__krate__publish__categories__good_categories-2.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__dependencies__dep_limit-2.snap => crates_io__tests__krate__publish__dependencies__dep_limit-4.snap} (100%) create mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved-4.snap delete mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved.snap rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__keywords__good_keywords.snap => crates_io__tests__krate__publish__keywords__good_keywords-2.snap} (100%) create mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-5.snap rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__links__crate_with_links_field-2.snap => crates_io__tests__krate__publish__manifest__boolean_readme-4.snap} (81%) delete mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme.snap create mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate-4.snap delete mode 100644 src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate.snap rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__max_size__tarball_between_default_axum_limit_and_max_upload_size.snap => crates_io__tests__krate__publish__max_size__tarball_between_default_axum_limit_and_max_upload_size-2.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__readme__new_krate_with_empty_readme.snap => crates_io__tests__krate__publish__readme__new_krate_with_empty_readme-2.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__readme__new_krate_with_readme.snap => crates_io__tests__krate__publish__readme__new_krate_with_readme-2.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__readme__new_krate_with_readme_and_plus_version.snap => crates_io__tests__krate__publish__readme__new_krate_with_readme_and_plus_version-2.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__trustpub__full_flow-5.snap => crates_io__tests__krate__publish__trustpub__full_flow-11.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__trustpub__full_flow-3.snap => crates_io__tests__krate__publish__trustpub__full_flow-7.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__trustpub__full_flow-4.snap => crates_io__tests__krate__publish__trustpub__full_flow-9.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__trustpub__happy_path.snap => crates_io__tests__krate__publish__trustpub__happy_path-2.snap} (100%) rename src/tests/krate/publish/snapshots/{crates_io__tests__krate__publish__trustpub__happy_path_with_fancy_auth_header.snap => crates_io__tests__krate__publish__trustpub__happy_path_with_fancy_auth_header-2.snap} (100%) rename src/tests/routes/categories/snapshots/{crates_io__tests__routes__categories__get__show.snap => crates_io__tests__routes__categories__get__show-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__downloads__crate_downloads.snap => crates_io__tests__routes__crates__downloads__crate_downloads-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__downloads__version_downloads.snap => crates_io__tests__routes__crates__downloads__version_downloads-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__read__include_default_version.snap => crates_io__tests__routes__crates__read__include_default_version-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__read__new_name.snap => crates_io__tests__routes__crates__read__new_name-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__read__show.snap => crates_io__tests__routes__crates__read__show-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__read__show_all_yanked.snap => crates_io__tests__routes__crates__read__show_all_yanked-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__read__show_minimal.snap => crates_io__tests__routes__crates__read__show_minimal-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__reverse_dependencies__prerelease_versions_not_included_in_reverse_dependencies.snap => crates_io__tests__routes__crates__reverse_dependencies__prerelease_versions_not_included_in_reverse_dependencies-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_depended_but_new_doesnt.snap => crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies-4.snap} (100%) delete mode 100644 src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies.snap rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_includes_published_by_user_when_present.snap => crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_includes_published_by_user_when_present-2.snap} (100%) rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_query_supports_u64_version_number_parts.snap => crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_query_supports_u64_version_number_parts-2.snap} (100%) create mode 100644 src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_depended_but_new_doesnt-2.snap rename src/tests/routes/crates/snapshots/{crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_doesnt_depend_but_new_does.snap => crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_doesnt_depend_but_new_does-2.snap} (100%) create mode 100644 src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies-4.snap delete mode 100644 src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies.snap rename src/tests/routes/crates/versions/snapshots/{crates_io__tests__routes__crates__versions__list__versions.snap => crates_io__tests__routes__crates__versions__list__versions-2.snap} (100%) rename src/tests/routes/me/snapshots/{crates_io__tests__routes__me__get__me-2.snap => crates_io__tests__routes__me__get__me-4.snap} (100%) rename src/tests/routes/me/snapshots/{crates_io__tests__routes__me__get__me-3.snap => crates_io__tests__routes__me__get__me-6.snap} (100%) create mode 100644 src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success-3.snap delete mode 100644 src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success.snap create mode 100644 src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date-3.snap delete mode 100644 src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date.snap create mode 100644 src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes-3.snap delete mode 100644 src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes.snap create mode 100644 src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes-3.snap delete mode 100644 src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes.snap rename src/tests/routes/me/tokens/snapshots/{crates_io__tests__routes__me__tokens__get__show.snap => crates_io__tests__routes__me__tokens__get__show-2.snap} (100%) rename src/tests/routes/me/tokens/snapshots/{crates_io__tests__routes__me__tokens__get__show_token_with_scopes.snap => crates_io__tests__routes__me__tokens__get__show_token_with_scopes-2.snap} (100%) rename src/tests/routes/me/tokens/snapshots/{crates_io__tests__routes__me__tokens__list__list_tokens.snap => crates_io__tests__routes__me__tokens__list__list_tokens-2.snap} (100%) rename src/tests/routes/users/update/snapshots/{crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-6.snap => crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-11.snap} (100%) rename src/tests/routes/users/update/snapshots/{crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe.snap => crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-2.snap} (100%) rename src/tests/routes/users/update/snapshots/{crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-3.snap => crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-5.snap} (100%) rename src/tests/routes/users/update/snapshots/{crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-4.snap => crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-7.snap} (100%) rename src/tests/snapshots/{crates_io__tests__github_secret_scanning__github_secret_alert_for_revoked_token.snap => crates_io__tests__github_secret_scanning__github_secret_alert_for_revoked_token-2.snap} (100%) rename src/tests/snapshots/{crates_io__tests__github_secret_scanning__github_secret_alert_for_unknown_token.snap => crates_io__tests__github_secret_scanning__github_secret_alert_for_unknown_token-2.snap} (100%) create mode 100644 src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token-3.snap delete mode 100644 src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token.snap rename src/tests/snapshots/{crates_io__tests__owners__modify_multiple_owners-6.snap => crates_io__tests__owners__modify_multiple_owners-10.snap} (100%) rename src/tests/snapshots/{crates_io__tests__read_only_mode__cannot_hit_endpoint_which_writes_db_in_read_only_mode.snap => crates_io__tests__read_only_mode__cannot_hit_endpoint_which_writes_db_in_read_only_mode-2.snap} (100%) diff --git a/src/controllers/helpers/pagination.rs b/src/controllers/helpers/pagination.rs index 094a613bff9..b13d5b29674 100644 --- a/src/controllers/helpers/pagination.rs +++ b/src/controllers/helpers/pagination.rs @@ -709,7 +709,7 @@ mod tests { let error = seek.after(&pagination.page).unwrap_err(); assert_eq!(error.to_string(), "invalid seek parameter"); let response = error.response(); - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); // Ensures it still encodes compactly with a field struct #[derive(Debug, Default, Serialize, PartialEq)] diff --git a/src/controllers/krate/delete.rs b/src/controllers/krate/delete.rs index fc240b575a1..bc23449b15d 100644 --- a/src/controllers/krate/delete.rs +++ b/src/controllers/krate/delete.rs @@ -279,7 +279,7 @@ mod tests { "); let response = delete_crate(&user, "foo").await; - assert_eq!(response.status(), StatusCode::NO_CONTENT); + assert_snapshot!(response.status(), @"204 No Content"); assert!(response.body().is_empty()); assert_snapshot!(app.emails_snapshot().await); @@ -316,7 +316,7 @@ mod tests { "); let response = delete_crate(&user, "foo").await; - assert_eq!(response.status(), StatusCode::NO_CONTENT); + assert_snapshot!(response.status(), @"204 No Content"); assert!(response.body().is_empty()); assert_snapshot!(app.emails_snapshot().await); @@ -353,7 +353,7 @@ mod tests { "); let response = delete_crate(&user, "foo").await; - assert_eq!(response.status(), StatusCode::NO_CONTENT); + assert_snapshot!(response.status(), @"204 No Content"); assert!(response.body().is_empty()); assert_snapshot!(app.emails_snapshot().await); @@ -376,7 +376,7 @@ mod tests { publish_crate(&user, "foo").await; let response = delete_crate(&anon, "foo").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); assert_crate_exists(&anon, "foo", true).await; @@ -391,7 +391,7 @@ mod tests { publish_crate(&user, "foo").await; let response = delete_crate(&token, "foo").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action can only be performed on the crates.io website"}]}"#); assert_crate_exists(&anon, "foo", true).await; @@ -404,7 +404,7 @@ mod tests { let (_app, _anon, user) = TestApp::full().with_user().await; let response = delete_crate(&user, "foo").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `foo` does not exist"}]}"#); Ok(()) @@ -418,7 +418,7 @@ mod tests { publish_crate(&user, "foo").await; let response = delete_crate(&user2, "foo").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"only owners have permission to delete crates"}]}"#); assert_crate_exists(&anon, "foo", true).await; @@ -437,10 +437,10 @@ mod tests { // Add team owner let body = json!({ "owners": ["github:test-org:all"] }).to_string(); let response = user.put::<()>("/api/v1/crates/foo/owners", body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let response = delete_crate(&user2, "foo").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"team members don't have permission to delete crates"}]}"#); assert_crate_exists(&anon, "foo", true).await; @@ -468,7 +468,7 @@ mod tests { .await?; let response = delete_crate(&user, "foo").await; - assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + assert_snapshot!(response.status(), @"422 Unprocessable Entity"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"only crates with a single owner can be deleted after 72 hours"}]}"#); assert_crate_exists(&anon, "foo", true).await; @@ -486,7 +486,7 @@ mod tests { adjust_downloads(&mut conn, crate_id, DOWNLOADS_PER_MONTH_LIMIT + 1).await?; let response = delete_crate(&user, "foo").await; - assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + assert_snapshot!(response.status(), @"422 Unprocessable Entity"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"only crates with less than 500 downloads per month can be deleted after 72 hours"}]}"#); assert_crate_exists(&anon, "foo", true).await; @@ -503,10 +503,10 @@ mod tests { // Publish another crate let pb = PublishBuilder::new("bar", "1.0.0").dependency(DependencyBuilder::new("foo")); let response = user.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let response = delete_crate(&user, "foo").await; - assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + assert_snapshot!(response.status(), @"422 Unprocessable Entity"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"only crates without reverse dependencies can be deleted"}]}"#); assert_crate_exists(&anon, "foo", true).await; diff --git a/src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_new_crate-2.snap b/src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_new_crate-3.snap similarity index 100% rename from src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_new_crate-2.snap rename to src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_new_crate-3.snap diff --git a/src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_old_crate-2.snap b/src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_old_crate-3.snap similarity index 100% rename from src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_old_crate-2.snap rename to src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_old_crate-3.snap diff --git a/src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_really_old_crate-2.snap b/src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_really_old_crate-3.snap similarity index 100% rename from src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_really_old_crate-2.snap rename to src/controllers/krate/snapshots/crates_io__controllers__krate__delete__tests__happy_path_really_old_crate-3.snap diff --git a/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path-2.snap b/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path-2.snap index e796331ee39..9b76d1fe41b 100644 --- a/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path-2.snap +++ b/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path-2.snap @@ -1,24 +1,16 @@ --- source: src/controllers/trustpub/github_configs/create/tests.rs -expression: app.emails_snapshot().await +expression: response.json() --- -To: foo@example.com -From: crates.io -Subject: crates.io: Trusted Publishing configration added to foo -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: quoted-printable - -Hello foo! - -crates.io user foo has added a new "Trusted Publishing" configuration for GitHub Actions to a crate that you manage (foo). Trusted publishers act as trusted users and can publish new versions of the crate automatically. - -Trusted Publishing configuration: - -- Repository owner: rust-lang -- Repository name: foo-rs -- Workflow filename: publish.yml -- Environment: (not set) - -If you did not make this change and you think it was made maliciously, you can remove the configuration from the crate via the "Settings" tab on the crate's page. - -If you are unable to revert the change and need to do so, you can email help@crates.io to communicate with the crates.io support team. +{ + "github_config": { + "crate": "foo", + "created_at": "[datetime]", + "environment": null, + "id": 1, + "repository_name": "foo-rs", + "repository_owner": "rust-lang", + "repository_owner_id": 42, + "workflow_filename": "publish.yml" + } +} diff --git a/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path-3.snap b/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path-3.snap new file mode 100644 index 00000000000..e796331ee39 --- /dev/null +++ b/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path-3.snap @@ -0,0 +1,24 @@ +--- +source: src/controllers/trustpub/github_configs/create/tests.rs +expression: app.emails_snapshot().await +--- +To: foo@example.com +From: crates.io +Subject: crates.io: Trusted Publishing configration added to foo +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +Hello foo! + +crates.io user foo has added a new "Trusted Publishing" configuration for GitHub Actions to a crate that you manage (foo). Trusted publishers act as trusted users and can publish new versions of the crate automatically. + +Trusted Publishing configuration: + +- Repository owner: rust-lang +- Repository name: foo-rs +- Workflow filename: publish.yml +- Environment: (not set) + +If you did not make this change and you think it was made maliciously, you can remove the configuration from the crate via the "Settings" tab on the crate's page. + +If you are unable to revert the change and need to do so, you can email help@crates.io to communicate with the crates.io support team. diff --git a/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path.snap b/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path.snap deleted file mode 100644 index 9b76d1fe41b..00000000000 --- a/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: src/controllers/trustpub/github_configs/create/tests.rs -expression: response.json() ---- -{ - "github_config": { - "crate": "foo", - "created_at": "[datetime]", - "environment": null, - "id": 1, - "repository_name": "foo-rs", - "repository_owner": "rust-lang", - "repository_owner_id": 42, - "workflow_filename": "publish.yml" - } -} diff --git a/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path_with_environment.snap b/src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path_with_environment-2.snap similarity index 100% rename from src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path_with_environment.snap rename to src/controllers/trustpub/github_configs/create/snapshots/crates_io__controllers__trustpub__github_configs__create__tests__happy_path_with_environment-2.snap diff --git a/src/controllers/trustpub/github_configs/create/tests.rs b/src/controllers/trustpub/github_configs/create/tests.rs index 9cdc91bfa11..6e9d32c77c1 100644 --- a/src/controllers/trustpub/github_configs/create/tests.rs +++ b/src/controllers/trustpub/github_configs/create/tests.rs @@ -6,7 +6,6 @@ use crates_io_database::schema::{emails, trustpub_configs_github}; use crates_io_github::{GitHubError, GitHubUser, MockGitHubClient}; use diesel::prelude::*; use diesel_async::RunQueryDsl; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; use serde_json::json; @@ -61,7 +60,7 @@ async fn test_happy_path() -> anyhow::Result<()> { }))?; let (app, response) = run_test(body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".github_config.created_at" => "[datetime]" }); assert_snapshot!(app.emails_snapshot().await); @@ -91,7 +90,7 @@ async fn test_happy_path_with_environment() -> anyhow::Result<()> { }))?; let (_app, response) = run_test(body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".github_config.created_at" => "[datetime]" }); Ok(()) @@ -100,7 +99,7 @@ async fn test_happy_path_with_environment() -> anyhow::Result<()> { #[tokio::test(flavor = "multi_thread")] async fn test_empty_body() -> anyhow::Result<()> { let (_app, response) = run_test("").await; - assert_eq!(response.status(), StatusCode::UNSUPPORTED_MEDIA_TYPE); + assert_snapshot!(response.status(), @"415 Unsupported Media Type"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Expected request with `Content-Type: application/json`"}]}"#); Ok(()) @@ -109,7 +108,7 @@ async fn test_empty_body() -> anyhow::Result<()> { #[tokio::test(flavor = "multi_thread")] async fn test_empty_json_object() -> anyhow::Result<()> { let (_app, response) = run_test("{}").await; - assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + assert_snapshot!(response.status(), @"422 Unprocessable Entity"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize the JSON body into the target type: missing field `github_config` at line 1 column 2"}]}"#); Ok(()) @@ -128,7 +127,7 @@ async fn test_invalid_owner() -> anyhow::Result<()> { }))?; let (_app, response) = run_test(body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Invalid GitHub repository owner name"}]}"#); Ok(()) @@ -147,7 +146,7 @@ async fn test_invalid_repo() -> anyhow::Result<()> { }))?; let (_app, response) = run_test(body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Invalid GitHub repository name"}]}"#); Ok(()) @@ -166,7 +165,7 @@ async fn test_invalid_workflow() -> anyhow::Result<()> { }))?; let (_app, response) = run_test(body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Workflow filename must end with `.yml` or `.yaml`"}]}"#); Ok(()) @@ -185,7 +184,7 @@ async fn test_invalid_environment() -> anyhow::Result<()> { }))?; let (_app, response) = run_test(body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Environment name may not be empty (use `null` to omit)"}]}"#); Ok(()) @@ -215,7 +214,7 @@ async fn test_unauthenticated() -> anyhow::Result<()> { }))?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); Ok(()) @@ -245,7 +244,7 @@ async fn test_token_auth() -> anyhow::Result<()> { }))?; let response = token_client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action can only be performed on the crates.io website"}]}"#); Ok(()) @@ -269,7 +268,7 @@ async fn test_missing_crate() -> anyhow::Result<()> { }))?; let response = cookie_client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `foo` does not exist"}]}"#); Ok(()) @@ -301,7 +300,7 @@ async fn test_non_owner() -> anyhow::Result<()> { }))?; let response = other_client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"You are not an owner of this crate"}]}"#); Ok(()) @@ -333,7 +332,7 @@ async fn test_unknown_github_user() -> anyhow::Result<()> { }))?; let response = cookie_client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Unknown GitHub user or organization"}]}"#); Ok(()) @@ -365,7 +364,7 @@ async fn test_github_error() -> anyhow::Result<()> { }))?; let response = cookie_client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::INTERNAL_SERVER_ERROR); + assert_snapshot!(response.status(), @"500 Internal Server Error"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Internal Server Error"}]}"#); Ok(()) @@ -400,7 +399,7 @@ async fn test_unverified_email() -> anyhow::Result<()> { }))?; let response = cookie_client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"You must verify your email address to create a Trusted Publishing config"}]}"#); Ok(()) diff --git a/src/controllers/trustpub/github_configs/delete/snapshots/crates_io__controllers__trustpub__github_configs__delete__tests__happy_path.snap b/src/controllers/trustpub/github_configs/delete/snapshots/crates_io__controllers__trustpub__github_configs__delete__tests__happy_path-2.snap similarity index 100% rename from src/controllers/trustpub/github_configs/delete/snapshots/crates_io__controllers__trustpub__github_configs__delete__tests__happy_path.snap rename to src/controllers/trustpub/github_configs/delete/snapshots/crates_io__controllers__trustpub__github_configs__delete__tests__happy_path-2.snap diff --git a/src/controllers/trustpub/github_configs/delete/tests.rs b/src/controllers/trustpub/github_configs/delete/tests.rs index a5b6d14322e..509c006502d 100644 --- a/src/controllers/trustpub/github_configs/delete/tests.rs +++ b/src/controllers/trustpub/github_configs/delete/tests.rs @@ -5,7 +5,6 @@ use crates_io_database::models::trustpub::{GitHubConfig, NewGitHubConfig}; use crates_io_database::schema::trustpub_configs_github; use diesel::prelude::*; use diesel_async::{AsyncPgConnection, RunQueryDsl}; -use http::StatusCode; use insta::assert_snapshot; use serde_json::json; @@ -50,7 +49,7 @@ async fn test_happy_path() -> anyhow::Result<()> { let config = create_config(&mut conn, krate.id).await?; let response = cookie_client.delete::<()>(&delete_url(config.id)).await; - assert_eq!(response.status(), StatusCode::NO_CONTENT); + assert_snapshot!(response.status(), @"204 No Content"); assert_eq!(response.text(), ""); // Verify the config was deleted from the database @@ -73,7 +72,7 @@ async fn test_unauthenticated() -> anyhow::Result<()> { let config = create_config(&mut conn, krate.id).await?; let response = client.delete::<()>(&delete_url(config.id)).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); // Verify the config was not deleted @@ -96,7 +95,7 @@ async fn test_token_auth() -> anyhow::Result<()> { let config = create_config(&mut conn, krate.id).await?; let response = token_client.delete::<()>(&delete_url(config.id)).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action can only be performed on the crates.io website"}]}"#); // Verify the config was not deleted @@ -115,7 +114,7 @@ async fn test_config_not_found() -> anyhow::Result<()> { let (app, _client, cookie_client) = TestApp::full().with_user().await; let response = cookie_client.delete::<()>(&delete_url(42)).await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Not Found"}]}"#); // Verify no emails were sent to crate owners @@ -137,7 +136,7 @@ async fn test_non_owner() -> anyhow::Result<()> { let other_client = app.db_new_user("other_user").await; let response = other_client.delete::<()>(&delete_url(config.id)).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"You are not an owner of this crate"}]}"#); // Verify the config was not deleted @@ -165,10 +164,10 @@ async fn test_team_owner() -> anyhow::Result<()> { let body = json!({ "owners": ["github:test-org:all"] }).to_string(); let response = user.put::<()>("/api/v1/crates/foo/owners", body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let response = user2.delete::<()>(&delete_url(config.id)).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"You are not an owner of this crate"}]}"#); // Verify the config was not deleted diff --git a/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__crate_with_no_configs.snap b/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__crate_with_no_configs-2.snap similarity index 100% rename from src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__crate_with_no_configs.snap rename to src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__crate_with_no_configs-2.snap diff --git a/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path-2.snap b/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path-2.snap index 494dfefd992..755072a4dde 100644 --- a/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path-2.snap +++ b/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path-2.snap @@ -5,11 +5,21 @@ expression: response.json() { "github_configs": [ { - "crate": "bar", + "crate": "foo", "created_at": "[datetime]", "environment": null, - "id": 3, - "repository_name": "BAR", + "id": 1, + "repository_name": "foo-rs", + "repository_owner": "rust-lang", + "repository_owner_id": 42, + "workflow_filename": "publish.yml" + }, + { + "crate": "foo", + "created_at": "[datetime]", + "environment": null, + "id": 2, + "repository_name": "foo", "repository_owner": "rust-lang", "repository_owner_id": 42, "workflow_filename": "publish.yml" diff --git a/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path-4.snap b/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path-4.snap new file mode 100644 index 00000000000..494dfefd992 --- /dev/null +++ b/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path-4.snap @@ -0,0 +1,18 @@ +--- +source: src/controllers/trustpub/github_configs/list/tests.rs +expression: response.json() +--- +{ + "github_configs": [ + { + "crate": "bar", + "created_at": "[datetime]", + "environment": null, + "id": 3, + "repository_name": "BAR", + "repository_owner": "rust-lang", + "repository_owner_id": 42, + "workflow_filename": "publish.yml" + } + ] +} diff --git a/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path.snap b/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path.snap deleted file mode 100644 index 755072a4dde..00000000000 --- a/src/controllers/trustpub/github_configs/list/snapshots/crates_io__controllers__trustpub__github_configs__list__tests__happy_path.snap +++ /dev/null @@ -1,28 +0,0 @@ ---- -source: src/controllers/trustpub/github_configs/list/tests.rs -expression: response.json() ---- -{ - "github_configs": [ - { - "crate": "foo", - "created_at": "[datetime]", - "environment": null, - "id": 1, - "repository_name": "foo-rs", - "repository_owner": "rust-lang", - "repository_owner_id": 42, - "workflow_filename": "publish.yml" - }, - { - "crate": "foo", - "created_at": "[datetime]", - "environment": null, - "id": 2, - "repository_name": "foo", - "repository_owner": "rust-lang", - "repository_owner_id": 42, - "workflow_filename": "publish.yml" - } - ] -} diff --git a/src/controllers/trustpub/github_configs/list/tests.rs b/src/controllers/trustpub/github_configs/list/tests.rs index 7f01d4c657b..0c368656cb3 100644 --- a/src/controllers/trustpub/github_configs/list/tests.rs +++ b/src/controllers/trustpub/github_configs/list/tests.rs @@ -3,7 +3,6 @@ use crate::tests::util::{RequestHelper, TestApp}; use crates_io_database::models::trustpub::{GitHubConfig, NewGitHubConfig}; use diesel::prelude::*; use diesel_async::AsyncPgConnection; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; use serde_json::json; @@ -40,13 +39,13 @@ async fn test_happy_path() -> anyhow::Result<()> { create_config(&mut conn, bar.id, "BAR").await?; let response = cookie_client.get_with_query::<()>(URL, "crate=foo").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".github_configs[].created_at" => "[datetime]", }); let response = cookie_client.get_with_query::<()>(URL, "crate=Bar").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".github_configs[].created_at" => "[datetime]", }); @@ -64,7 +63,7 @@ async fn test_unauthorized() -> anyhow::Result<()> { create_config(&mut conn, krate.id, "foo-rs").await?; let response = anon_client.get_with_query::<()>(URL, "crate=foo").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); Ok(()) @@ -83,7 +82,7 @@ async fn test_not_owner() -> anyhow::Result<()> { // The authenticated user is not an owner of the crate let other_user = app.db_new_user("other").await; let response = other_user.get_with_query::<()>(URL, "crate=foo").await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"You are not an owner of this crate"}]}"#); Ok(()) @@ -103,10 +102,10 @@ async fn test_team_owner() -> anyhow::Result<()> { let body = json!({ "owners": ["github:test-org:all"] }).to_string(); let response = user.put::<()>("/api/v1/crates/foo/owners", body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let response = user2.get_with_query::<()>(URL, "crate=foo").await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"You are not an owner of this crate"}]}"#); Ok(()) @@ -117,7 +116,7 @@ async fn test_crate_not_found() -> anyhow::Result<()> { let (_, _, cookie_client) = TestApp::full().with_user().await; let response = cookie_client.get_with_query::<()>(URL, "crate=foo").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `foo` does not exist"}]}"#); Ok(()) @@ -128,7 +127,7 @@ async fn test_no_query_param() -> anyhow::Result<()> { let (_, _, cookie_client) = TestApp::full().with_user().await; let response = cookie_client.get::<()>(URL).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize query string: missing field `crate`"}]}"#); Ok(()) @@ -144,7 +143,7 @@ async fn test_crate_with_no_configs() -> anyhow::Result<()> { // No configs have been created for this crate let response = cookie_client.get_with_query::<()>(URL, "crate=foo").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".github_configs[].created_at" => "[datetime]", }); diff --git a/src/controllers/trustpub/tokens/exchange/tests.rs b/src/controllers/trustpub/tokens/exchange/tests.rs index 27d2820fcb3..8f5d8ac915d 100644 --- a/src/controllers/trustpub/tokens/exchange/tests.rs +++ b/src/controllers/trustpub/tokens/exchange/tests.rs @@ -8,7 +8,6 @@ use crates_io_trustpub::github::test_helpers::FullGitHubClaims; use crates_io_trustpub::keystore::MockOidcKeyStore; use diesel::prelude::*; use diesel_async::RunQueryDsl; -use http::StatusCode; use insta::{assert_compact_debug_snapshot, assert_json_snapshot, assert_snapshot}; use jsonwebtoken::{EncodingKey, Header}; use mockall::predicate::*; @@ -74,7 +73,7 @@ async fn test_happy_path() -> anyhow::Result<()> { let body = default_claims().as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let json = response.json(); assert_json_snapshot!(json, { ".token" => "[token]" }, @r#" @@ -110,7 +109,7 @@ async fn test_happy_path_with_environment() -> anyhow::Result<()> { let body = claims.as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); Ok(()) } @@ -124,7 +123,7 @@ async fn test_happy_path_with_ignored_environment() -> anyhow::Result<()> { let body = claims.as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); Ok(()) } @@ -135,7 +134,7 @@ async fn test_broken_jwt() -> anyhow::Result<()> { let body = serde_json::to_vec(&json!({ "jwt": "broken" }))?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"Failed to decode JWT"}]}"#); Ok(()) @@ -156,7 +155,7 @@ async fn test_unsupported_issuer() -> anyhow::Result<()> { let body = default_claims().as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"Unsupported JWT issuer"}]}"#); Ok(()) @@ -172,7 +171,7 @@ async fn test_missing_key_id() -> anyhow::Result<()> { let body = serde_json::to_vec(&json!({ "jwt": jwt }))?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"Missing JWT key ID"}]}"#); Ok(()) @@ -200,7 +199,7 @@ async fn test_unknown_key() -> anyhow::Result<()> { let body = default_claims().as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"Invalid JWT key ID"}]}"#); Ok(()) @@ -228,7 +227,7 @@ async fn test_key_store_error() -> anyhow::Result<()> { let body = default_claims().as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::INTERNAL_SERVER_ERROR); + assert_snapshot!(response.status(), @"500 Internal Server Error"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"Failed to load OIDC key set"}]}"#); Ok(()) @@ -243,7 +242,7 @@ async fn test_invalid_audience() -> anyhow::Result<()> { let body = claims.as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"Failed to decode JWT"}]}"#); Ok(()) @@ -258,11 +257,11 @@ async fn test_token_reuse() -> anyhow::Result<()> { // The first exchange should succeed let response = client.put::<()>(URL, body.clone()).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // The second exchange should fail let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"JWT has already been used"}]}"#); Ok(()) @@ -277,7 +276,7 @@ async fn test_invalid_repository() -> anyhow::Result<()> { let body = claims.as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"Unexpected `repository` value"}]}"#); Ok(()) @@ -292,7 +291,7 @@ async fn test_invalid_workflow() -> anyhow::Result<()> { let body = claims.as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"Unexpected `workflow_ref` value"}]}"#); Ok(()) @@ -307,7 +306,7 @@ async fn test_invalid_owner_id() -> anyhow::Result<()> { let body = claims.as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"Unexpected `repository_owner_id` value"}]}"#); Ok(()) @@ -322,7 +321,7 @@ async fn test_missing_config() -> anyhow::Result<()> { let body = default_claims().as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"No matching Trusted Publishing config found"}]}"#); Ok(()) @@ -334,7 +333,7 @@ async fn test_missing_environment() -> anyhow::Result<()> { let body = default_claims().as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"No matching Trusted Publishing config found"}]}"#); Ok(()) @@ -349,7 +348,7 @@ async fn test_wrong_environment() -> anyhow::Result<()> { let body = claims.as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.json(), @r#"{"errors":[{"detail":"No matching Trusted Publishing config found"}]}"#); Ok(()) @@ -371,7 +370,7 @@ async fn test_case_insensitive() -> anyhow::Result<()> { let body = claims.as_exchange_body()?; let response = client.put::<()>(URL, body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); Ok(()) } diff --git a/src/controllers/trustpub/tokens/revoke/tests.rs b/src/controllers/trustpub/tokens/revoke/tests.rs index fb58df72b5b..bac0ef954e0 100644 --- a/src/controllers/trustpub/tokens/revoke/tests.rs +++ b/src/controllers/trustpub/tokens/revoke/tests.rs @@ -5,7 +5,6 @@ use crates_io_database::schema::trustpub_tokens; use crates_io_trustpub::access_token::AccessToken; use diesel::prelude::*; use diesel_async::{AsyncPgConnection, RunQueryDsl}; -use http::StatusCode; use insta::assert_compact_debug_snapshot; use insta::assert_snapshot; use secrecy::ExposeSecret; @@ -53,7 +52,7 @@ async fn test_happy_path() -> anyhow::Result<()> { let token_client = MockTokenUser::with_auth_header(header, app.clone()); let response = token_client.delete::<()>(URL).await; - assert_eq!(response.status(), StatusCode::NO_CONTENT); + assert_snapshot!(response.status(), @"204 No Content"); assert_eq!(response.text(), ""); // Check that the token is deleted @@ -67,7 +66,7 @@ async fn test_missing_authorization_header() -> anyhow::Result<()> { let (_app, client) = TestApp::full().empty().await; let response = client.delete::<()>(URL).await; - assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + assert_snapshot!(response.status(), @"401 Unauthorized"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Missing authorization header"}]}"#); Ok(()) @@ -82,7 +81,7 @@ async fn test_invalid_authorization_header_format() -> anyhow::Result<()> { let token_client = MockTokenUser::with_auth_header(header, app.clone()); let response = token_client.delete::<()>(URL).await; - assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + assert_snapshot!(response.status(), @"401 Unauthorized"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Invalid authorization header"}]}"#); Ok(()) @@ -97,7 +96,7 @@ async fn test_invalid_token_format() -> anyhow::Result<()> { let token_client = MockTokenUser::with_auth_header(header, app.clone()); let response = token_client.delete::<()>(URL).await; - assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + assert_snapshot!(response.status(), @"401 Unauthorized"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Invalid authorization header"}]}"#); Ok(()) @@ -114,7 +113,7 @@ async fn test_non_existent_token() -> anyhow::Result<()> { // The request should succeed with 204 No Content even though the token doesn't exist let response = token_client.delete::<()>(URL).await; - assert_eq!(response.status(), StatusCode::NO_CONTENT); + assert_snapshot!(response.status(), @"204 No Content"); assert_eq!(response.text(), ""); Ok(()) diff --git a/src/controllers/user/email_verification.rs b/src/controllers/user/email_verification.rs index 55cc7248c8e..293d557ed5f 100644 --- a/src/controllers/user/email_verification.rs +++ b/src/controllers/user/email_verification.rs @@ -99,7 +99,6 @@ pub async fn resend_email_verification( #[cfg(test)] mod tests { use crate::tests::util::{RequestHelper, TestApp}; - use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -108,7 +107,7 @@ mod tests { let url = format!("/api/v1/users/{}/resend", user.as_model().id); let response = anon.put::<()>(&url, "").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); assert_eq!(app.emails().await.len(), 0); @@ -121,7 +120,7 @@ mod tests { let url = format!("/api/v1/users/{}/resend", user2.as_model().id); let response = user.put::<()>(&url, "").await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"current user does not match requested user"}]}"#); assert_eq!(app.emails().await.len(), 0); @@ -133,7 +132,7 @@ mod tests { let url = format!("/api/v1/users/{}/resend", user.as_model().id); let response = user.put::<()>(&url, "").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"ok":true}"#); assert_snapshot!(app.emails_snapshot().await); diff --git a/src/controllers/user/snapshots/crates_io__controllers__user__email_verification__tests__happy_path-2.snap b/src/controllers/user/snapshots/crates_io__controllers__user__email_verification__tests__happy_path-3.snap similarity index 100% rename from src/controllers/user/snapshots/crates_io__controllers__user__email_verification__tests__happy_path-2.snap rename to src/controllers/user/snapshots/crates_io__controllers__user__email_verification__tests__happy_path-3.snap diff --git a/src/controllers/version/docs.rs b/src/controllers/version/docs.rs index d64ddcc04fa..f6d907e6a05 100644 --- a/src/controllers/version/docs.rs +++ b/src/controllers/version/docs.rs @@ -53,13 +53,13 @@ pub async fn rebuild_version_docs( #[cfg(test)] mod tests { - use super::*; use crate::tests::{ builders::{CrateBuilder, VersionBuilder}, util::{RequestHelper as _, TestApp}, }; use crates_io_database::models::NewUser; use crates_io_docs_rs::MockDocsRsClient; + use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] async fn test_trigger_rebuild_ok() -> anyhow::Result<()> { @@ -82,7 +82,7 @@ mod tests { let response = cookie_client .post::<()>("/api/v1/crates/krate/0.1.0/rebuild_docs", "") .await; - assert_eq!(response.status(), StatusCode::CREATED); + assert_snapshot!(response.status(), @"201 Created"); app.run_pending_background_jobs().await; @@ -118,7 +118,7 @@ mod tests { let response = cookie_client .post::<()>("/api/v1/crates/krate/0.1.0/rebuild_docs", "") .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); app.run_pending_background_jobs().await; @@ -140,7 +140,7 @@ mod tests { .post::<()>("/api/v1/crates/krate/0.1.0/rebuild_docs", "") .await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); app.run_pending_background_jobs().await; diff --git a/src/openapi.rs b/src/openapi.rs index c628b49bb30..ca84b3cd3bf 100644 --- a/src/openapi.rs +++ b/src/openapi.rs @@ -86,15 +86,14 @@ impl Modify for SecurityAddon { #[cfg(test)] mod tests { use crate::tests::util::{RequestHelper, TestApp}; - use http::StatusCode; - use insta::assert_json_snapshot; + use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] async fn test_openapi_snapshot() { let (_app, anon) = TestApp::init().empty().await; let response = anon.get::<()>("/api/openapi.json").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json()); } } diff --git a/src/snapshots/crates_io__openapi__tests__openapi_snapshot.snap b/src/snapshots/crates_io__openapi__tests__openapi_snapshot-2.snap similarity index 100% rename from src/snapshots/crates_io__openapi__tests__openapi_snapshot.snap rename to src/snapshots/crates_io__openapi__tests__openapi_snapshot-2.snap diff --git a/src/tests/account_lock.rs b/src/tests/account_lock.rs index e1adbf2d208..8a015236331 100644 --- a/src/tests/account_lock.rs +++ b/src/tests/account_lock.rs @@ -1,6 +1,5 @@ use crate::tests::{TestApp, util::RequestHelper}; use chrono::{DateTime, Duration, Utc}; -use http::StatusCode; use insta::assert_snapshot; const URL: &str = "/api/v1/me"; @@ -30,7 +29,7 @@ async fn account_locked_indefinitely() { lock_account(&app, user.as_model().id, None).await; let response = user.get::<()>(URL).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"This account is indefinitely locked. Reason: test lock reason"}]}"#); } @@ -42,7 +41,7 @@ async fn account_locked_with_future_expiry() { lock_account(&app, user.as_model().id, Some(until)).await; let response = user.get::<()>(URL).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"This account is locked until 2099-12-12 at 12:12:12 UTC. Reason: test lock reason"}]}"#); } diff --git a/src/tests/authentication.rs b/src/tests/authentication.rs index 2a4a505dead..91b8774af09 100644 --- a/src/tests/authentication.rs +++ b/src/tests/authentication.rs @@ -12,7 +12,7 @@ async fn anonymous_user_unauthorized() { let (_, anon) = TestApp::init().empty().await; let response: Response<()> = anon.get(URL).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); } @@ -23,7 +23,7 @@ async fn token_auth_cannot_find_token() { request.header(header::AUTHORIZATION, "cio1tkfake-token"); let response: Response<()> = anon.run(request).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"authentication failed"}]}"#); } diff --git a/src/tests/cors.rs b/src/tests/cors.rs index a38c3dcdb7b..ad7300001aa 100644 --- a/src/tests/cors.rs +++ b/src/tests/cors.rs @@ -1,6 +1,5 @@ use crate::tests::TestApp; use crate::tests::util::{MockRequestExt, RequestHelper}; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -16,7 +15,7 @@ async fn test_with_matching_origin() { request.header("Origin", "https://crates.io"); let response = cookie.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); } #[tokio::test(flavor = "multi_thread")] @@ -32,7 +31,7 @@ async fn test_with_unknown_origin() { request.header("Origin", "https://evil.hacker.io"); let response = cookie.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid origin header"}]}"#); } @@ -50,6 +49,6 @@ async fn test_with_multiple_origins() { request.header("Origin", "https://crates.io"); let response = cookie.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid origin header"}]}"#); } diff --git a/src/tests/github_secret_scanning.rs b/src/tests/github_secret_scanning.rs index 77dd2f635ad..4a1c05365b6 100644 --- a/src/tests/github_secret_scanning.rs +++ b/src/tests/github_secret_scanning.rs @@ -6,7 +6,6 @@ use crates_io_github::{GitHubPublicKey, MockGitHubClient}; use diesel::prelude::*; use diesel_async::RunQueryDsl; use googletest::prelude::*; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; static URL: &str = "/api/github/secret-scanning/verify"; @@ -74,7 +73,7 @@ async fn github_secret_alert_revokes_token() { request.header("GITHUB-PUBLIC-KEY-IDENTIFIER", GITHUB_PUBLIC_KEY_IDENTIFIER); request.header("GITHUB-PUBLIC-KEY-SIGNATURE", GITHUB_PUBLIC_KEY_SIGNATURE); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json()); // Ensure that the token was revoked @@ -138,7 +137,7 @@ async fn github_secret_alert_for_revoked_token() { request.header("GITHUB-PUBLIC-KEY-IDENTIFIER", GITHUB_PUBLIC_KEY_IDENTIFIER); request.header("GITHUB-PUBLIC-KEY-SIGNATURE", GITHUB_PUBLIC_KEY_SIGNATURE); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json()); // Ensure that the token is still revoked @@ -191,7 +190,7 @@ async fn github_secret_alert_for_unknown_token() { request.header("GITHUB-PUBLIC-KEY-IDENTIFIER", GITHUB_PUBLIC_KEY_IDENTIFIER); request.header("GITHUB-PUBLIC-KEY-SIGNATURE", GITHUB_PUBLIC_KEY_SIGNATURE); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json()); // Ensure that the token was not revoked @@ -216,27 +215,27 @@ async fn github_secret_alert_invalid_signature_fails() { // No headers or request body let request = anon.post_request(URL); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); // Request body but no headers let mut request = anon.post_request(URL); *request.body_mut() = GITHUB_ALERT.into(); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); // Headers but no request body let mut request = anon.post_request(URL); request.header("GITHUB-PUBLIC-KEY-IDENTIFIER", GITHUB_PUBLIC_KEY_IDENTIFIER); request.header("GITHUB-PUBLIC-KEY-SIGNATURE", GITHUB_PUBLIC_KEY_SIGNATURE); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); // Request body but only key identifier header let mut request = anon.post_request(URL); *request.body_mut() = GITHUB_ALERT.into(); request.header("GITHUB-PUBLIC-KEY-IDENTIFIER", GITHUB_PUBLIC_KEY_IDENTIFIER); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); // Invalid signature let mut request = anon.post_request(URL); @@ -244,7 +243,7 @@ async fn github_secret_alert_invalid_signature_fails() { request.header("GITHUB-PUBLIC-KEY-IDENTIFIER", GITHUB_PUBLIC_KEY_IDENTIFIER); request.header("GITHUB-PUBLIC-KEY-SIGNATURE", "bad signature"); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); // Invalid signature that is valid base64 let mut request = anon.post_request(URL); @@ -252,5 +251,5 @@ async fn github_secret_alert_invalid_signature_fails() { request.header("GITHUB-PUBLIC-KEY-IDENTIFIER", GITHUB_PUBLIC_KEY_IDENTIFIER); request.header("GITHUB-PUBLIC-KEY-SIGNATURE", "YmFkIHNpZ25hdHVyZQ=="); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); } diff --git a/src/tests/issues/issue1205.rs b/src/tests/issues/issue1205.rs index 1229746dc0e..a21c0a5e709 100644 --- a/src/tests/issues/issue1205.rs +++ b/src/tests/issues/issue1205.rs @@ -1,7 +1,6 @@ use crate::tests::builders::CrateBuilder; use crate::tests::util::{RequestHelper, TestApp}; use crates_io_github::{GitHubOrganization, GitHubTeam, GitHubTeamMembership, MockGitHubClient}; -use http::StatusCode; use insta::assert_snapshot; /// See . @@ -23,7 +22,7 @@ async fn test_issue_1205() -> anyhow::Result<()> { let response = user .add_named_owner(CRATE_NAME, "github:rustaudio:owners") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"team github:rustaudio:owners has been added as an owner of crate deepspeech-sys","ok":true}"#); let owners = krate.owners(&mut conn).await?; @@ -34,7 +33,7 @@ async fn test_issue_1205() -> anyhow::Result<()> { let response = user .add_named_owner(CRATE_NAME, "github:rustaudio:cratesio-push") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"team github:rustaudio:cratesio-push has been added as an owner of crate deepspeech-sys","ok":true}"#); let owners = krate.owners(&mut conn).await?; @@ -45,7 +44,7 @@ async fn test_issue_1205() -> anyhow::Result<()> { let response = user .remove_named_owner(CRATE_NAME, "github:rustaudio:owners") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"could not find owner with login `github:rustaudio:owners`"}]}"#); Ok(()) diff --git a/src/tests/issues/issue2736.rs b/src/tests/issues/issue2736.rs index 18b50231ff6..5f4eabd663d 100644 --- a/src/tests/issues/issue2736.rs +++ b/src/tests/issues/issue2736.rs @@ -4,7 +4,6 @@ use crate::tests::util::{RequestHelper, TestApp}; use crates_io_database::schema::users; use diesel::prelude::*; use diesel_async::RunQueryDsl; -use http::StatusCode; use insta::assert_snapshot; /// See . @@ -52,7 +51,7 @@ async fn test_issue_2736() -> anyhow::Result<()> { // Removing an owner, whether it's valid/current or not, should always work (if performed by another valid owner, etc) let response = someone_else.remove_named_owner("crate1", "foo").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"owners successfully removed","ok":true}"#); let owners = krate.owners(&mut conn).await?; @@ -61,7 +60,7 @@ async fn test_issue_2736() -> anyhow::Result<()> { // Once that removal works, it should be possible to add the new account as an owner let response = someone_else.add_named_owner("crate1", "foo").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user foo has been invited to be an owner of crate crate1","ok":true}"#); Ok(()) diff --git a/src/tests/krate/following.rs b/src/tests/krate/following.rs index dac79ca7091..b7fafe0e2d0 100644 --- a/src/tests/krate/following.rs +++ b/src/tests/krate/following.rs @@ -43,19 +43,19 @@ async fn test_unauthenticated_requests() { let response = anon .get::<()>(&format!("/api/v1/crates/{CRATE_NAME}/following")) .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); let response = anon .put::<()>(&format!("/api/v1/crates/{CRATE_NAME}/follow"), b"" as &[u8]) .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); let response = anon .delete::<()>(&format!("/api/v1/crates/{CRATE_NAME}/follow")) .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); } @@ -105,19 +105,19 @@ async fn test_unknown_crate() { let response = user .get::<()>("/api/v1/crates/unknown-crate/following") .await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown-crate` does not exist"}]}"#); let response = user .put::<()>("/api/v1/crates/unknown-crate/follow", b"" as &[u8]) .await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown-crate` does not exist"}]}"#); let response = user .delete::<()>("/api/v1/crates/unknown-crate/follow") .await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown-crate` does not exist"}]}"#); } diff --git a/src/tests/krate/publish/auth.rs b/src/tests/krate/publish/auth.rs index 98c728c5045..14815909ae6 100644 --- a/src/tests/krate/publish/auth.rs +++ b/src/tests/krate/publish/auth.rs @@ -4,7 +4,6 @@ use crate::tests::util::{RequestHelper, TestApp}; use diesel::ExpressionMethods; use diesel_async::RunQueryDsl; use googletest::prelude::*; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -15,7 +14,7 @@ async fn new_wrong_token() { // Try to publish without a token let crate_to_publish = PublishBuilder::new("foo", "1.0.0"); let response = anon.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); // Try to publish with the wrong token (by changing the token in the database) @@ -27,7 +26,7 @@ async fn new_wrong_token() { let crate_to_publish = PublishBuilder::new("foo", "1.0.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"authentication failed"}]}"#); assert_that!(app.stored_files().await, empty()); assert_that!(app.emails().await, empty()); @@ -49,7 +48,7 @@ async fn new_krate_wrong_user() { let crate_to_publish = PublishBuilder::new("foo_wrong", "2.0.0"); let response = another_user.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this crate exists but you don't seem to be an owner. If you believe this is a mistake, perhaps you need to accept an invitation to be an owner before publishing."}]}"#); assert_that!(app.stored_files().await, empty()); diff --git a/src/tests/krate/publish/basics.rs b/src/tests/krate/publish/basics.rs index bf674e0fc4c..d346a82cee4 100644 --- a/src/tests/krate/publish/basics.rs +++ b/src/tests/krate/publish/basics.rs @@ -4,7 +4,6 @@ use crate::tests::util::{RequestHelper, TestApp}; use diesel::QueryDsl; use diesel_async::{AsyncPgConnection, RunQueryDsl}; use googletest::prelude::*; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] @@ -14,7 +13,7 @@ async fn new_krate() { let crate_to_publish = PublishBuilder::new("foo_new", "1.0.0"); let response = user.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -47,7 +46,7 @@ async fn new_krate_with_token() { let crate_to_publish = PublishBuilder::new("foo_new", "1.0.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -68,7 +67,7 @@ async fn new_krate_weird_version() { let crate_to_publish = PublishBuilder::new("foo_weird", "0.0.0-pre"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -93,7 +92,7 @@ async fn new_krate_twice() { let crate_to_publish = PublishBuilder::new("foo_twice", "2.0.0").description("2.0.0 description"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -124,7 +123,7 @@ async fn new_krate_twice_alt() { let crate_to_publish = PublishBuilder::new("foo_twice", "0.99.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -156,7 +155,7 @@ async fn new_krate_duplicate_version() { let crate_to_publish = PublishBuilder::new("foo_dupe", "1.0.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate version `1.0.0` is already uploaded"}]}"#); assert_that!(app.stored_files().await, empty()); diff --git a/src/tests/krate/publish/categories.rs b/src/tests/krate/publish/categories.rs index 36f4e397682..d823b89a748 100644 --- a/src/tests/krate/publish/categories.rs +++ b/src/tests/krate/publish/categories.rs @@ -5,7 +5,6 @@ use crates_io_database::schema::categories; use diesel::insert_into; use diesel_async::RunQueryDsl; use googletest::prelude::*; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] @@ -21,7 +20,7 @@ async fn good_categories() { let crate_to_publish = PublishBuilder::new("foo_good_cat", "1.0.0").category("cat1"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -34,7 +33,7 @@ async fn ignored_categories() { let crate_to_publish = PublishBuilder::new("foo_ignored_cat", "1.0.0").category("bar"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"The following category slugs are not currently supported on crates.io: bar\n\nSee https://crates.io/category_slugs for a list of supported slugs."}]}"#); } @@ -53,7 +52,7 @@ async fn too_many_categories() { .category("six"), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"expected at most 5 categories per crate"}]}"#); assert_that!(app.stored_files().await, empty()); } diff --git a/src/tests/krate/publish/deleted_crates.rs b/src/tests/krate/publish/deleted_crates.rs index 7fda17c508b..faf90aa3157 100644 --- a/src/tests/krate/publish/deleted_crates.rs +++ b/src/tests/krate/publish/deleted_crates.rs @@ -5,7 +5,6 @@ use chrono::{Duration, Utc}; use crates_io_database::schema::deleted_crates; use diesel_async::RunQueryDsl; use googletest::prelude::*; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -31,7 +30,7 @@ async fn test_recently_deleted_crate_with_same_name() -> anyhow::Result<()> { let crate_to_publish = PublishBuilder::new("actix-web", "1.0.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"A crate with the name `actix_web` was recently deleted. Reuse of this name will be available after 2099-12-25T12:34:56Z."}]}"#); assert_that!(app.stored_files().await, empty()); diff --git a/src/tests/krate/publish/dependencies.rs b/src/tests/krate/publish/dependencies.rs index 37fbe602c67..8675e496e46 100644 --- a/src/tests/krate/publish/dependencies.rs +++ b/src/tests/krate/publish/dependencies.rs @@ -1,7 +1,6 @@ use crate::tests::builders::{CrateBuilder, DependencyBuilder, PublishBuilder}; use crate::tests::util::{RequestHelper, TestApp}; use googletest::prelude::*; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] @@ -11,7 +10,7 @@ async fn invalid_dependency_name() { let response = token .publish_crate(PublishBuilder::new("foo", "1.0.0").dependency(DependencyBuilder::new("🦀"))) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid character `🦀` in dependency name: `🦀`, the first character must be an ASCII character"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -51,7 +50,7 @@ async fn invalid_dependency_rename() { .dependency(DependencyBuilder::new("package-name").rename("💩")), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid character `💩` in dependency name: `💩`, the first character must be an ASCII character, or `_`"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -72,7 +71,7 @@ async fn invalid_dependency_name_starts_with_digit() { .dependency(DependencyBuilder::new("package-name").rename("1-foo")), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"the name `1-foo` cannot be used as a dependency name, the name cannot start with a digit"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -93,7 +92,7 @@ async fn invalid_dependency_name_contains_unicode_chars() { .dependency(DependencyBuilder::new("package-name").rename("foo-🦀-bar")), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid character `🦀` in dependency name: `foo-🦀-bar`, characters must be an ASCII alphanumeric characters, `-`, or `_`"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -114,7 +113,7 @@ async fn invalid_too_long_dependency_name() { .dependency(DependencyBuilder::new("package-name").rename("f".repeat(65).as_str())), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"the dependency name `fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff` is too long (max 64 characters)"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -135,7 +134,7 @@ async fn empty_dependency_name() { .dependency(DependencyBuilder::new("package-name").rename("")), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"dependency name cannot be empty"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -211,7 +210,7 @@ async fn new_krate_with_broken_dependency_requirement() { let crate_to_publish = PublishBuilder::new("new_dep", "1.0.0").dependency(dependency); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"\"broken\" is an invalid version requirement"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -231,7 +230,7 @@ async fn reject_new_krate_with_non_exact_dependency() { let crate_to_publish = PublishBuilder::new("new_dep", "1.0.0").dependency(dependency); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"no known crate named `foo_dep`"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -260,7 +259,7 @@ async fn reject_new_crate_with_alternative_registry_dependency() { let crate_to_publish = PublishBuilder::new("depends-on-alt-registry", "1.0.0").dependency(dependency); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Dependency `dep` is hosted on another registry. Cross-registry dependencies are not permitted on crates.io."}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -280,7 +279,7 @@ async fn new_krate_with_wildcard_dependency() { let crate_to_publish = PublishBuilder::new("new_wild", "1.0.0").dependency(dependency); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"wildcard (`*`) dependency constraints are not allowed on crates.io. Crate with this problem: `foo_wild` See https://doc.rust-lang.org/cargo/faq.html#can-libraries-use--as-a-version-for-their-dependencies for more information"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -312,7 +311,7 @@ async fn new_krate_with_patch() { let crate_to_publish = PublishBuilder::new("new_patch", "1.0.0").custom_manifest(manifest); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"failed to parse `Cargo.toml` manifest file\n\ncrates cannot be published with `[patch]` tables"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -327,7 +326,7 @@ async fn new_krate_dependency_missing() { let crate_to_publish = PublishBuilder::new("foo_missing", "1.0.0").dependency(dependency); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"no known crate named `bar_missing`"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -368,7 +367,7 @@ async fn invalid_feature_name() { .dependency(DependencyBuilder::new("bar").add_feature("🍺")), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid character `🍺` in feature `🍺`, the first character must be a Unicode XID start character or digit (most letters or `_` or `0` to `9`)"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -394,14 +393,14 @@ async fn test_dep_limit() { .dependency(DependencyBuilder::new("dep-b")); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crates.io only allows a maximum number of 1 dependencies.\n\nIf you have a use case that requires an increase of this limit, please send us an email to help@crates.io to discuss the details."}]}"#); let crate_to_publish = PublishBuilder::new("foo", "1.0.0").dependency(DependencyBuilder::new("dep-a")); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", diff --git a/src/tests/krate/publish/edition.rs b/src/tests/krate/publish/edition.rs index 8afc7691c71..fd0bb839305 100644 --- a/src/tests/krate/publish/edition.rs +++ b/src/tests/krate/publish/edition.rs @@ -1,8 +1,7 @@ use crate::tests::builders::PublishBuilder; use crate::tests::util::insta::{any_id_redaction, id_redaction}; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; -use insta::assert_json_snapshot; +use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] async fn test_edition_is_saved() { @@ -19,14 +18,14 @@ async fn test_edition_is_saved() { "#; let pb = PublishBuilder::new("foo", "1.0.0").custom_manifest(manifest); let response = token.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", }); let response = token.get::<()>("/api/v1/crates/foo/1.0.0").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".version.id" => any_id_redaction(), ".version.created_at" => "[datetime]", diff --git a/src/tests/krate/publish/emails.rs b/src/tests/krate/publish/emails.rs index 22df3c83b98..1b85e4742f1 100644 --- a/src/tests/krate/publish/emails.rs +++ b/src/tests/krate/publish/emails.rs @@ -5,7 +5,6 @@ use diesel::{ExpressionMethods, delete, update}; use diesel_async::RunQueryDsl; use googletest::prelude::*; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -18,7 +17,7 @@ async fn new_krate_without_any_email_fails() { let crate_to_publish = PublishBuilder::new("foo_no_email", "1.0.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"A verified email address is required to publish crates to crates.io. Visit https://crates.io/settings/profile to set and verify your email address."}]}"#); assert_that!(app.stored_files().await, empty()); assert_that!(app.emails().await, empty()); @@ -38,7 +37,7 @@ async fn new_krate_with_unverified_email_fails() { let crate_to_publish = PublishBuilder::new("foo_unverified_email", "1.0.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"A verified email address is required to publish crates to crates.io. Visit https://crates.io/settings/profile to set and verify your email address."}]}"#); assert_that!(app.stored_files().await, empty()); assert_that!(app.emails().await, empty()); diff --git a/src/tests/krate/publish/features.rs b/src/tests/krate/publish/features.rs index d0bf2596226..860d76d6e47 100644 --- a/src/tests/krate/publish/features.rs +++ b/src/tests/krate/publish/features.rs @@ -1,7 +1,6 @@ use crate::tests::builders::{CrateBuilder, DependencyBuilder, PublishBuilder}; use crate::tests::util::{RequestHelper, TestApp}; use googletest::prelude::*; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] @@ -60,7 +59,7 @@ async fn empty_feature_name() { let (app, _, _, token) = TestApp::full().with_token().await; let crate_to_publish = PublishBuilder::new("foo", "1.0.0").feature("", &[]); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"feature cannot be empty"}]}"#); assert!(app.stored_files().await.is_empty()); } @@ -71,7 +70,7 @@ async fn invalid_feature_name1() { let crate_to_publish = PublishBuilder::new("foo", "1.0.0").feature("~foo", &[]); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid character `~` in feature `~foo`, the first character must be a Unicode XID start character or digit (most letters or `_` or `0` to `9`)"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -82,7 +81,7 @@ async fn invalid_feature_name2() { let crate_to_publish = PublishBuilder::new("foo", "1.0.0").feature("foo", &["!bar"]); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid character `!` in feature `!bar`, the first character must be a Unicode XID start character or digit (most letters or `_` or `0` to `9`)"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -92,7 +91,7 @@ async fn invalid_feature_name_start_with_hyphen() { let (app, _, _, token) = TestApp::full().with_token().await; let crate_to_publish = PublishBuilder::new("foo", "1.0.0").feature("-foo1.bar", &[]); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid character `-` in feature `-foo1.bar`, the first character must be a Unicode XID start character or digit (most letters or `_` or `0` to `9`)"}]}"#); assert!(app.stored_files().await.is_empty()); } @@ -113,7 +112,7 @@ async fn too_many_features() { .feature("four", &[]) .feature("five", &[]); let response = token.publish_crate(publish_builder).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crates.io only allows a maximum number of 3 features, but your crate is declaring 5 features.\n\nTake a look at https://blog.rust-lang.org/2023/10/26/broken-badges-and-23k-keywords.html to understand why this restriction was introduced.\n\nIf you have a use case that requires an increase of this limit, please send us an email to help@crates.io to discuss the details."}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -141,7 +140,7 @@ async fn too_many_features_with_custom_limit() { .feature("four", &[]) .feature("five", &[]); let response = token.publish_crate(publish_builder).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crates.io only allows a maximum number of 4 features, but your crate is declaring 5 features.\n\nTake a look at https://blog.rust-lang.org/2023/10/26/broken-badges-and-23k-keywords.html to understand why this restriction was introduced.\n\nIf you have a use case that requires an increase of this limit, please send us an email to help@crates.io to discuss the details."}]}"#); assert_that!(app.stored_files().await, empty()); @@ -173,7 +172,7 @@ async fn too_many_enabled_features() { let publish_builder = PublishBuilder::new("foo", "1.0.0") .feature("default", &["one", "two", "three", "four", "five"]); let response = token.publish_crate(publish_builder).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crates.io only allows a maximum number of 3 features or dependencies that another feature can enable, but the \"default\" feature of your crate is enabling 5 features or dependencies.\n\nTake a look at https://blog.rust-lang.org/2023/10/26/broken-badges-and-23k-keywords.html to understand why this restriction was introduced.\n\nIf you have a use case that requires an increase of this limit, please send us an email to help@crates.io to discuss the details."}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -197,7 +196,7 @@ async fn too_many_enabled_features_with_custom_limit() { let publish_builder = PublishBuilder::new("foo", "1.0.0") .feature("default", &["one", "two", "three", "four", "five"]); let response = token.publish_crate(publish_builder).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crates.io only allows a maximum number of 4 features or dependencies that another feature can enable, but the \"default\" feature of your crate is enabling 5 features or dependencies.\n\nTake a look at https://blog.rust-lang.org/2023/10/26/broken-badges-and-23k-keywords.html to understand why this restriction was introduced.\n\nIf you have a use case that requires an increase of this limit, please send us an email to help@crates.io to discuss the details."}]}"#); assert_that!(app.stored_files().await, empty()); diff --git a/src/tests/krate/publish/inheritance.rs b/src/tests/krate/publish/inheritance.rs index edb6e8d151b..ca4b92f7699 100644 --- a/src/tests/krate/publish/inheritance.rs +++ b/src/tests/krate/publish/inheritance.rs @@ -1,6 +1,5 @@ use crate::tests::builders::PublishBuilder; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -13,7 +12,7 @@ async fn workspace_inheritance() { .custom_manifest("[package]\nname = \"foo\"\nversion.workspace = true\n"), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"failed to parse `Cargo.toml` manifest file\n\nvalue from workspace hasn't been set"}]}"#); } @@ -24,6 +23,6 @@ async fn workspace_inheritance_with_dep() { let response = token.publish_crate(PublishBuilder::new("foo", "1.0.0").custom_manifest( "[package]\nname = \"foo\"\nversion = \"1.0.0\"\n\n[dependencies]\nserde.workspace = true\n", )).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"failed to parse `Cargo.toml` manifest file\n\nvalue from workspace hasn't been set"}]}"#); } diff --git a/src/tests/krate/publish/keywords.rs b/src/tests/krate/publish/keywords.rs index 56cd2fa69c5..5b85d45223d 100644 --- a/src/tests/krate/publish/keywords.rs +++ b/src/tests/krate/publish/keywords.rs @@ -1,7 +1,6 @@ use crate::tests::builders::PublishBuilder; use crate::tests::util::{RequestHelper, TestApp}; use googletest::prelude::*; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] @@ -12,7 +11,7 @@ async fn good_keywords() { .keyword("crates-io_index") .keyword("1password"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -25,17 +24,17 @@ async fn bad_keywords() { let crate_to_publish = PublishBuilder::new("foo_bad_key", "1.0.0").keyword("super-long-keyword-name-oh-no"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"\"super-long-keyword-name-oh-no\" is an invalid keyword (keywords must have less than 20 characters)"}]}"#); let crate_to_publish = PublishBuilder::new("foo_bad_key", "1.0.0").keyword("?@?%"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"\"?@?%\" is an invalid keyword"}]}"#); let crate_to_publish = PublishBuilder::new("foo_bad_key", "1.0.0").keyword("áccênts"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"\"áccênts\" is an invalid keyword"}]}"#); } @@ -53,7 +52,7 @@ async fn too_many_keywords() { .keyword("six"), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"expected at most 5 keywords per crate"}]}"#); assert_that!(app.stored_files().await, empty()); } diff --git a/src/tests/krate/publish/links.rs b/src/tests/krate/publish/links.rs index 515f91271e1..7bdad666ad2 100644 --- a/src/tests/krate/publish/links.rs +++ b/src/tests/krate/publish/links.rs @@ -1,7 +1,7 @@ use crate::tests::builders::PublishBuilder; use crate::tests::util::insta::{self, assert_json_snapshot}; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; +use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] async fn test_crate_with_links_field() { @@ -22,7 +22,7 @@ async fn test_crate_with_links_field() { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", }); - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let response = anon.get::<()>("/api/v1/crates/foo/1.0.0").await; assert_json_snapshot!(response.json(), { @@ -32,7 +32,7 @@ async fn test_crate_with_links_field() { ".version.audit_actions[].time" => "[datetime]", ".version.published_by.id" => insta::any_id_redaction(), }); - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let crates = app.crates_from_index_head("foo"); assert_json_snapshot!(crates); diff --git a/src/tests/krate/publish/manifest.rs b/src/tests/krate/publish/manifest.rs index c379ef78e66..e5d6583d644 100644 --- a/src/tests/krate/publish/manifest.rs +++ b/src/tests/krate/publish/manifest.rs @@ -1,7 +1,6 @@ use crate::tests::builders::PublishBuilder; use crate::tests::util::insta::{any_id_redaction, id_redaction}; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] @@ -21,14 +20,14 @@ async fn boolean_readme() { readme = false"#, )) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", }); let response = token.get::<()>("/api/v1/crates/foo/1.0.0").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".version.id" => any_id_redaction(), ".version.created_at" => "[datetime]", @@ -46,7 +45,7 @@ async fn missing_manifest() { let response = token .publish_crate(PublishBuilder::new("foo", "1.0.0").no_manifest()) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"uploaded tarball is missing a `Cargo.toml` manifest file"}]}"#); } @@ -64,7 +63,7 @@ async fn manifest_casing() { .no_manifest(), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"uploaded tarball is missing a `Cargo.toml` manifest file; `CARGO.TOML` was found, but must be named `Cargo.toml` with that exact casing"}]}"#); } @@ -86,7 +85,7 @@ async fn multiple_manifests() { .no_manifest(), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"uploaded tarball contains more than one `Cargo.toml` manifest file; found `Cargo.toml`, `cargo.toml`"}]}"#); } @@ -97,7 +96,7 @@ async fn invalid_manifest() { let response = token .publish_crate(PublishBuilder::new("foo", "1.0.0").custom_manifest("")) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"failed to parse `Cargo.toml` manifest file\n\nmissing field `name`\n"}]}"#); } @@ -110,7 +109,7 @@ async fn invalid_manifest_missing_name() { PublishBuilder::new("foo", "1.0.0").custom_manifest("[package]\nversion = \"1.0.0\""), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"failed to parse `Cargo.toml` manifest file\n\nTOML parse error at line 1, column 1\n |\n1 | [package]\n | ^^^^^^^^^\nmissing field `name`\n"}]}"#); } @@ -123,7 +122,7 @@ async fn invalid_manifest_missing_version() { PublishBuilder::new("foo", "1.0.0").custom_manifest("[package]\nname = \"foo\""), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"failed to parse `Cargo.toml` manifest file\n\nmissing field `version`"}]}"#); } @@ -135,7 +134,7 @@ async fn name_mismatch() { token.publish_crate(PublishBuilder::new("foo", "1.0.0").custom_manifest( "[package]\nname = \"bar\"\nversion = \"1.0.0\"\ndescription = \"description\"\nlicense = \"MIT\"\n", )).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"metadata name `foo` does not match manifest name `bar`"}]}"#); } @@ -147,7 +146,7 @@ async fn version_mismatch() { token.publish_crate(PublishBuilder::new("foo", "1.0.0").custom_manifest( "[package]\nname = \"foo\"\nversion = \"2.0.0\"\ndescription = \"description\"\nlicense = \"MIT\"\n", )).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"metadata version `1.0.0` does not match manifest version `2.0.0`"}]}"#); } @@ -159,13 +158,13 @@ async fn invalid_rust_version() { token.publish_crate(PublishBuilder::new("foo", "1.0.0").custom_manifest( "[package]\nname = \"foo\"\nversion = \"1.0.0\"\ndescription = \"description\"\nlicense = \"MIT\"\nrust-version = \"\"\n", )).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"failed to parse `Cargo.toml` manifest file\n\ninvalid `rust-version` value"}]}"#); let response = token.publish_crate(PublishBuilder::new("foo", "1.0.0").custom_manifest( "[package]\nname = \"foo\"\nversion = \"1.0.0\"\ndescription = \"description\"\nlicense = \"MIT\"\nrust-version = \"1.0.0-beta.2\"\n", )).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"failed to parse `Cargo.toml` manifest file\n\ninvalid `rust-version` value"}]}"#); } @@ -179,14 +178,14 @@ async fn test_lib_and_bin_crate() { .add_file("foo-1.0.0/src/bin/bar.rs", "fn main() {}"); let response = token.publish_crate(publish_builder).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", }); let response = token.get::<()>("/api/v1/crates/foo/1.0.0").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".version.id" => any_id_redaction(), ".version.created_at" => "[datetime]", diff --git a/src/tests/krate/publish/max_size.rs b/src/tests/krate/publish/max_size.rs index 7ed194a78cc..af1af94ef7e 100644 --- a/src/tests/krate/publish/max_size.rs +++ b/src/tests/krate/publish/max_size.rs @@ -3,7 +3,6 @@ use crate::tests::util::{RequestHelper, TestApp}; use crates_io_tarball::TarballBuilder; use flate2::Compression; use googletest::prelude::*; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] @@ -45,7 +44,7 @@ async fn tarball_between_default_axum_limit_and_max_upload_size() { let body = PublishBuilder::create_publish_body(&json, &tarball); let response = token.publish_crate(body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -90,7 +89,7 @@ async fn tarball_bigger_than_max_upload_size() { let body = PublishBuilder::create_publish_body(&json, &tarball); let response = token.publish_crate(body).await; - assert_eq!(response.status(), StatusCode::PAYLOAD_TOO_LARGE); + assert_snapshot!(response.status(), @"413 Payload Too Large"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"max upload size is: 5242880"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -109,7 +108,7 @@ async fn new_krate_gzip_bomb() { let crate_to_publish = PublishBuilder::new("foo", "1.1.0").add_file("foo-1.1.0/a", body); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"uploaded tarball is malformed or too large when decompressed"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -128,7 +127,7 @@ async fn new_krate_too_big() { PublishBuilder::new("foo_big", "1.0.0").add_file("foo_big-1.0.0/big", vec![b'a'; 2000]); let response = user.publish_crate(builder).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"uploaded tarball is malformed or too large when decompressed"}]}"#); assert_that!(app.stored_files().await, empty()); } diff --git a/src/tests/krate/publish/rate_limit.rs b/src/tests/krate/publish/rate_limit.rs index d9959bba7cc..822731f68a9 100644 --- a/src/tests/krate/publish/rate_limit.rs +++ b/src/tests/krate/publish/rate_limit.rs @@ -5,7 +5,6 @@ use crate::tests::util::{RequestHelper, TestApp}; use chrono::{DateTime, Utc}; use diesel::ExpressionMethods; use diesel_async::RunQueryDsl; -use http::StatusCode; use insta::assert_snapshot; use std::thread; use std::time::Duration; @@ -43,7 +42,7 @@ async fn publish_new_crate_ratelimit_hit() { assert_eq!(app.stored_files().await.len(), 0); let response = anon.get::<()>("/api/v1/crates/rate_limited").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); } #[tokio::test(flavor = "multi_thread")] @@ -160,7 +159,7 @@ async fn publish_new_crate_override_loosens_ratelimit() { "); let response = anon.get::<()>("/api/v1/crates/rate_limited3").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); } #[tokio::test(flavor = "multi_thread")] @@ -219,7 +218,7 @@ async fn publish_new_crate_expired_override_ignored() { "); let response = anon.get::<()>("/api/v1/crates/rate_limited2").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); } #[tokio::test(flavor = "multi_thread")] diff --git a/src/tests/krate/publish/readme.rs b/src/tests/krate/publish/readme.rs index 796299d3e34..13895edabde 100644 --- a/src/tests/krate/publish/readme.rs +++ b/src/tests/krate/publish/readme.rs @@ -1,6 +1,5 @@ use crate::tests::builders::{CrateBuilder, PublishBuilder}; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] @@ -9,7 +8,7 @@ async fn new_krate_with_readme() { let crate_to_publish = PublishBuilder::new("foo_readme", "1.0.0").readme("hello world"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -31,7 +30,7 @@ async fn new_krate_with_empty_readme() { let crate_to_publish = PublishBuilder::new("foo_readme", "1.0.0").readme(""); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -52,7 +51,7 @@ async fn new_krate_with_readme_and_plus_version() { let crate_to_publish = PublishBuilder::new("foo_readme", "1.0.0+foo").readme("hello world"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", diff --git a/src/tests/krate/publish/similar_names.rs b/src/tests/krate/publish/similar_names.rs index b0e773a0a34..1094ee1ee9d 100644 --- a/src/tests/krate/publish/similar_names.rs +++ b/src/tests/krate/publish/similar_names.rs @@ -1,7 +1,6 @@ use crate::tests::builders::{CrateBuilder, PublishBuilder}; use crate::tests::util::{RequestHelper, TestApp}; use googletest::prelude::*; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -16,7 +15,7 @@ async fn new_crate_similar_name() { let crate_to_publish = PublishBuilder::new("foo_similar", "1.1.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate was previously named `Foo_similar`"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -33,7 +32,7 @@ async fn new_crate_similar_name_hyphen() { let crate_to_publish = PublishBuilder::new("foo-bar-hyphen", "1.1.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate was previously named `foo_bar_hyphen`"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -50,7 +49,7 @@ async fn new_crate_similar_name_underscore() { let crate_to_publish = PublishBuilder::new("foo_bar_underscore", "1.1.0"); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate was previously named `foo-bar-underscore`"}]}"#); assert_that!(app.stored_files().await, empty()); } diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-2.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-2.snap index 2cac57c9c5b..28cb4db0450 100644 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-2.snap +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-2.snap @@ -1,14 +1,42 @@ --- source: src/tests/krate/publish/basics.rs -expression: crates +expression: response.json() --- -[ - { +{ + "crate": { + "badges": [], + "categories": null, + "created_at": "[datetime]", + "default_version": "1.0.0", + "description": "description", + "documentation": null, + "downloads": 0, + "exact_match": false, + "homepage": null, + "id": "foo_new", + "keywords": null, + "links": { + "owner_team": "/api/v1/crates/foo_new/owner_team", + "owner_user": "/api/v1/crates/foo_new/owner_user", + "owners": "/api/v1/crates/foo_new/owners", + "reverse_dependencies": "/api/v1/crates/foo_new/reverse_dependencies", + "version_downloads": "/api/v1/crates/foo_new/downloads", + "versions": "/api/v1/crates/foo_new/versions" + }, + "max_stable_version": "1.0.0", + "max_version": "1.0.0", "name": "foo_new", - "vers": "1.0.0", - "deps": [], - "cksum": "696b8fc0b2d62c399459b2000dbcab7d9914e5dfafff974f53c1212e02f014bb", - "features": {}, + "newest_version": "1.0.0", + "num_versions": 1, + "recent_downloads": null, + "repository": null, + "updated_at": "[datetime]", + "versions": null, "yanked": false + }, + "warnings": { + "invalid_badges": [], + "invalid_categories": [], + "other": [] } -] +} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-3.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-3.snap new file mode 100644 index 00000000000..2cac57c9c5b --- /dev/null +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-3.snap @@ -0,0 +1,14 @@ +--- +source: src/tests/krate/publish/basics.rs +expression: crates +--- +[ + { + "name": "foo_new", + "vers": "1.0.0", + "deps": [], + "cksum": "696b8fc0b2d62c399459b2000dbcab7d9914e5dfafff974f53c1212e02f014bb", + "features": {}, + "yanked": false + } +] diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-4.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-5.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-4.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate-5.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice-2.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice-2.snap index b3c8f875e24..501d39ee175 100644 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice-2.snap +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice-2.snap @@ -1,22 +1,42 @@ --- source: src/tests/krate/publish/basics.rs -expression: crates +expression: response.json() --- -[ - { +{ + "crate": { + "badges": [], + "categories": null, + "created_at": "[datetime]", + "default_version": "2.0.0", + "description": "2.0.0 description", + "documentation": null, + "downloads": 0, + "exact_match": false, + "homepage": null, + "id": "foo_twice", + "keywords": null, + "links": { + "owner_team": "/api/v1/crates/foo_twice/owner_team", + "owner_user": "/api/v1/crates/foo_twice/owner_user", + "owners": "/api/v1/crates/foo_twice/owners", + "reverse_dependencies": "/api/v1/crates/foo_twice/reverse_dependencies", + "version_downloads": "/api/v1/crates/foo_twice/downloads", + "versions": "/api/v1/crates/foo_twice/versions" + }, + "max_stable_version": "2.0.0", + "max_version": "2.0.0", "name": "foo_twice", - "vers": "0.99.0", - "deps": [], - "cksum": "99ef473e84e6bede426d948d4dca03d79a64acb51511ffcbeb11d253505c9968", - "features": {}, + "newest_version": "2.0.0", + "num_versions": 2, + "recent_downloads": null, + "repository": null, + "updated_at": "[datetime]", + "versions": null, "yanked": false }, - { - "name": "foo_twice", - "vers": "2.0.0", - "deps": [], - "cksum": "7e71c271648114db81fa41450dd8d4d50c35622d3630e65c4f8211948bdf83f3", - "features": {}, - "yanked": false + "warnings": { + "invalid_badges": [], + "invalid_categories": [], + "other": [] } -] +} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice-3.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice-3.snap new file mode 100644 index 00000000000..b3c8f875e24 --- /dev/null +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice-3.snap @@ -0,0 +1,22 @@ +--- +source: src/tests/krate/publish/basics.rs +expression: crates +--- +[ + { + "name": "foo_twice", + "vers": "0.99.0", + "deps": [], + "cksum": "99ef473e84e6bede426d948d4dca03d79a64acb51511ffcbeb11d253505c9968", + "features": {}, + "yanked": false + }, + { + "name": "foo_twice", + "vers": "2.0.0", + "deps": [], + "cksum": "7e71c271648114db81fa41450dd8d4d50c35622d3630e65c4f8211948bdf83f3", + "features": {}, + "yanked": false + } +] diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice.snap deleted file mode 100644 index 501d39ee175..00000000000 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice.snap +++ /dev/null @@ -1,42 +0,0 @@ ---- -source: src/tests/krate/publish/basics.rs -expression: response.json() ---- -{ - "crate": { - "badges": [], - "categories": null, - "created_at": "[datetime]", - "default_version": "2.0.0", - "description": "2.0.0 description", - "documentation": null, - "downloads": 0, - "exact_match": false, - "homepage": null, - "id": "foo_twice", - "keywords": null, - "links": { - "owner_team": "/api/v1/crates/foo_twice/owner_team", - "owner_user": "/api/v1/crates/foo_twice/owner_user", - "owners": "/api/v1/crates/foo_twice/owners", - "reverse_dependencies": "/api/v1/crates/foo_twice/reverse_dependencies", - "version_downloads": "/api/v1/crates/foo_twice/downloads", - "versions": "/api/v1/crates/foo_twice/versions" - }, - "max_stable_version": "2.0.0", - "max_version": "2.0.0", - "name": "foo_twice", - "newest_version": "2.0.0", - "num_versions": 2, - "recent_downloads": null, - "repository": null, - "updated_at": "[datetime]", - "versions": null, - "yanked": false - }, - "warnings": { - "invalid_badges": [], - "invalid_categories": [], - "other": [] - } -} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt-2.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt-2.snap index 5773aacd635..06a5033f589 100644 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt-2.snap +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt-2.snap @@ -1,22 +1,42 @@ --- source: src/tests/krate/publish/basics.rs -expression: crates +expression: response.json() --- -[ - { +{ + "crate": { + "badges": [], + "categories": null, + "created_at": "[datetime]", + "default_version": "2.0.0", + "description": "description", + "documentation": null, + "downloads": 0, + "exact_match": false, + "homepage": null, + "id": "foo_twice", + "keywords": null, + "links": { + "owner_team": "/api/v1/crates/foo_twice/owner_team", + "owner_user": "/api/v1/crates/foo_twice/owner_user", + "owners": "/api/v1/crates/foo_twice/owners", + "reverse_dependencies": "/api/v1/crates/foo_twice/reverse_dependencies", + "version_downloads": "/api/v1/crates/foo_twice/downloads", + "versions": "/api/v1/crates/foo_twice/versions" + }, + "max_stable_version": "2.0.0", + "max_version": "2.0.0", "name": "foo_twice", - "vers": "2.0.0", - "deps": [], - "cksum": "7e71c271648114db81fa41450dd8d4d50c35622d3630e65c4f8211948bdf83f3", - "features": {}, + "newest_version": "0.99.0", + "num_versions": 2, + "recent_downloads": null, + "repository": null, + "updated_at": "[datetime]", + "versions": null, "yanked": false }, - { - "name": "foo_twice", - "vers": "0.99.0", - "deps": [], - "cksum": "99ef473e84e6bede426d948d4dca03d79a64acb51511ffcbeb11d253505c9968", - "features": {}, - "yanked": false + "warnings": { + "invalid_badges": [], + "invalid_categories": [], + "other": [] } -] +} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt-3.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt-3.snap new file mode 100644 index 00000000000..5773aacd635 --- /dev/null +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt-3.snap @@ -0,0 +1,22 @@ +--- +source: src/tests/krate/publish/basics.rs +expression: crates +--- +[ + { + "name": "foo_twice", + "vers": "2.0.0", + "deps": [], + "cksum": "7e71c271648114db81fa41450dd8d4d50c35622d3630e65c4f8211948bdf83f3", + "features": {}, + "yanked": false + }, + { + "name": "foo_twice", + "vers": "0.99.0", + "deps": [], + "cksum": "99ef473e84e6bede426d948d4dca03d79a64acb51511ffcbeb11d253505c9968", + "features": {}, + "yanked": false + } +] diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt.snap deleted file mode 100644 index 06a5033f589..00000000000 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_twice_alt.snap +++ /dev/null @@ -1,42 +0,0 @@ ---- -source: src/tests/krate/publish/basics.rs -expression: response.json() ---- -{ - "crate": { - "badges": [], - "categories": null, - "created_at": "[datetime]", - "default_version": "2.0.0", - "description": "description", - "documentation": null, - "downloads": 0, - "exact_match": false, - "homepage": null, - "id": "foo_twice", - "keywords": null, - "links": { - "owner_team": "/api/v1/crates/foo_twice/owner_team", - "owner_user": "/api/v1/crates/foo_twice/owner_user", - "owners": "/api/v1/crates/foo_twice/owners", - "reverse_dependencies": "/api/v1/crates/foo_twice/reverse_dependencies", - "version_downloads": "/api/v1/crates/foo_twice/downloads", - "versions": "/api/v1/crates/foo_twice/versions" - }, - "max_stable_version": "2.0.0", - "max_version": "2.0.0", - "name": "foo_twice", - "newest_version": "0.99.0", - "num_versions": 2, - "recent_downloads": null, - "repository": null, - "updated_at": "[datetime]", - "versions": null, - "yanked": false - }, - "warnings": { - "invalid_badges": [], - "invalid_categories": [], - "other": [] - } -} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_weird_version.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_weird_version-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_weird_version.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_weird_version-2.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_with_token-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_with_token-2.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_with_token.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_with_token.snap deleted file mode 100644 index 28cb4db0450..00000000000 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__basics__new_krate_with_token.snap +++ /dev/null @@ -1,42 +0,0 @@ ---- -source: src/tests/krate/publish/basics.rs -expression: response.json() ---- -{ - "crate": { - "badges": [], - "categories": null, - "created_at": "[datetime]", - "default_version": "1.0.0", - "description": "description", - "documentation": null, - "downloads": 0, - "exact_match": false, - "homepage": null, - "id": "foo_new", - "keywords": null, - "links": { - "owner_team": "/api/v1/crates/foo_new/owner_team", - "owner_user": "/api/v1/crates/foo_new/owner_user", - "owners": "/api/v1/crates/foo_new/owners", - "reverse_dependencies": "/api/v1/crates/foo_new/reverse_dependencies", - "version_downloads": "/api/v1/crates/foo_new/downloads", - "versions": "/api/v1/crates/foo_new/versions" - }, - "max_stable_version": "1.0.0", - "max_version": "1.0.0", - "name": "foo_new", - "newest_version": "1.0.0", - "num_versions": 1, - "recent_downloads": null, - "repository": null, - "updated_at": "[datetime]", - "versions": null, - "yanked": false - }, - "warnings": { - "invalid_badges": [], - "invalid_categories": [], - "other": [] - } -} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__categories__good_categories.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__categories__good_categories-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__categories__good_categories.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__categories__good_categories-2.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__dependencies__dep_limit-2.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__dependencies__dep_limit-4.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__dependencies__dep_limit-2.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__dependencies__dep_limit-4.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved-2.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved-2.snap index 722a178fba1..7a884ebe94e 100644 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved-2.snap +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved-2.snap @@ -3,54 +3,40 @@ source: src/tests/krate/publish/edition.rs expression: response.json() --- { - "version": { - "audit_actions": [ - { - "action": "publish", - "time": "[datetime]", - "user": { - "avatar": null, - "id": "[id]", - "login": "foo", - "name": null, - "url": "https://github.com/foo" - } - } - ], - "bin_names": [], - "checksum": "7008c5c6b6cbf418070a998fad244bbde3ca712148e61e4d4b0d257682e30ad2", - "crate": "foo", - "crate_size": 172, + "crate": { + "badges": [], + "categories": null, "created_at": "[datetime]", + "default_version": "1.0.0", "description": "description", - "dl_path": "/api/v1/crates/foo/1.0.0/download", "documentation": null, "downloads": 0, - "edition": "2021", - "features": {}, - "has_lib": false, + "exact_match": false, "homepage": null, - "id": "[id]", - "lib_links": null, - "license": "MIT", + "id": "foo", + "keywords": null, "links": { - "authors": "/api/v1/crates/foo/1.0.0/authors", - "dependencies": "/api/v1/crates/foo/1.0.0/dependencies", - "version_downloads": "/api/v1/crates/foo/1.0.0/downloads" + "owner_team": "/api/v1/crates/foo/owner_team", + "owner_user": "/api/v1/crates/foo/owner_user", + "owners": "/api/v1/crates/foo/owners", + "reverse_dependencies": "/api/v1/crates/foo/reverse_dependencies", + "version_downloads": "/api/v1/crates/foo/downloads", + "versions": "/api/v1/crates/foo/versions" }, - "num": "1.0.0", - "published_by": { - "avatar": null, - "id": "[id]", - "login": "foo", - "name": null, - "url": "https://github.com/foo" - }, - "readme_path": "/api/v1/crates/foo/1.0.0/readme", + "max_stable_version": "1.0.0", + "max_version": "1.0.0", + "name": "foo", + "newest_version": "1.0.0", + "num_versions": 1, + "recent_downloads": null, "repository": null, - "rust_version": "1.0", "updated_at": "[datetime]", - "yank_message": null, + "versions": null, "yanked": false + }, + "warnings": { + "invalid_badges": [], + "invalid_categories": [], + "other": [] } } diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved-4.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved-4.snap new file mode 100644 index 00000000000..722a178fba1 --- /dev/null +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved-4.snap @@ -0,0 +1,56 @@ +--- +source: src/tests/krate/publish/edition.rs +expression: response.json() +--- +{ + "version": { + "audit_actions": [ + { + "action": "publish", + "time": "[datetime]", + "user": { + "avatar": null, + "id": "[id]", + "login": "foo", + "name": null, + "url": "https://github.com/foo" + } + } + ], + "bin_names": [], + "checksum": "7008c5c6b6cbf418070a998fad244bbde3ca712148e61e4d4b0d257682e30ad2", + "crate": "foo", + "crate_size": 172, + "created_at": "[datetime]", + "description": "description", + "dl_path": "/api/v1/crates/foo/1.0.0/download", + "documentation": null, + "downloads": 0, + "edition": "2021", + "features": {}, + "has_lib": false, + "homepage": null, + "id": "[id]", + "lib_links": null, + "license": "MIT", + "links": { + "authors": "/api/v1/crates/foo/1.0.0/authors", + "dependencies": "/api/v1/crates/foo/1.0.0/dependencies", + "version_downloads": "/api/v1/crates/foo/1.0.0/downloads" + }, + "num": "1.0.0", + "published_by": { + "avatar": null, + "id": "[id]", + "login": "foo", + "name": null, + "url": "https://github.com/foo" + }, + "readme_path": "/api/v1/crates/foo/1.0.0/readme", + "repository": null, + "rust_version": "1.0", + "updated_at": "[datetime]", + "yank_message": null, + "yanked": false + } +} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved.snap deleted file mode 100644 index 7a884ebe94e..00000000000 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__edition__edition_is_saved.snap +++ /dev/null @@ -1,42 +0,0 @@ ---- -source: src/tests/krate/publish/edition.rs -expression: response.json() ---- -{ - "crate": { - "badges": [], - "categories": null, - "created_at": "[datetime]", - "default_version": "1.0.0", - "description": "description", - "documentation": null, - "downloads": 0, - "exact_match": false, - "homepage": null, - "id": "foo", - "keywords": null, - "links": { - "owner_team": "/api/v1/crates/foo/owner_team", - "owner_user": "/api/v1/crates/foo/owner_user", - "owners": "/api/v1/crates/foo/owners", - "reverse_dependencies": "/api/v1/crates/foo/reverse_dependencies", - "version_downloads": "/api/v1/crates/foo/downloads", - "versions": "/api/v1/crates/foo/versions" - }, - "max_stable_version": "1.0.0", - "max_version": "1.0.0", - "name": "foo", - "newest_version": "1.0.0", - "num_versions": 1, - "recent_downloads": null, - "repository": null, - "updated_at": "[datetime]", - "versions": null, - "yanked": false - }, - "warnings": { - "invalid_badges": [], - "invalid_categories": [], - "other": [] - } -} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__keywords__good_keywords.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__keywords__good_keywords-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__keywords__good_keywords.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__keywords__good_keywords-2.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-3.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-3.snap index 9503896d049..f10a4c4b3d6 100644 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-3.snap +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-3.snap @@ -1,15 +1,56 @@ --- source: src/tests/krate/publish/links.rs -expression: crates +expression: response.json() --- -[ - { - "name": "foo", - "vers": "1.0.0", - "deps": [], - "cksum": "b2c9e153a8860ce92ba7cbdea7b718409d181c08f4c6c5c2a612919dcb155af2", +{ + "version": { + "audit_actions": [ + { + "action": "publish", + "time": "[datetime]", + "user": { + "avatar": null, + "id": 1, + "login": "foo", + "name": null, + "url": "https://github.com/foo" + } + } + ], + "bin_names": [], + "checksum": "b2c9e153a8860ce92ba7cbdea7b718409d181c08f4c6c5c2a612919dcb155af2", + "crate": "foo", + "crate_size": 167, + "created_at": "[datetime]", + "description": "foo?!", + "dl_path": "/api/v1/crates/foo/1.0.0/download", + "documentation": null, + "downloads": 0, + "edition": null, "features": {}, - "yanked": false, - "links": "git2" + "has_lib": false, + "homepage": null, + "id": "[id]", + "lib_links": "git2", + "license": "MIT", + "links": { + "authors": "/api/v1/crates/foo/1.0.0/authors", + "dependencies": "/api/v1/crates/foo/1.0.0/dependencies", + "version_downloads": "/api/v1/crates/foo/1.0.0/downloads" + }, + "num": "1.0.0", + "published_by": { + "avatar": null, + "id": "[id]", + "login": "foo", + "name": null, + "url": "https://github.com/foo" + }, + "readme_path": "/api/v1/crates/foo/1.0.0/readme", + "repository": null, + "rust_version": null, + "updated_at": "[datetime]", + "yank_message": null, + "yanked": false } -] +} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-5.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-5.snap new file mode 100644 index 00000000000..9503896d049 --- /dev/null +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-5.snap @@ -0,0 +1,15 @@ +--- +source: src/tests/krate/publish/links.rs +expression: crates +--- +[ + { + "name": "foo", + "vers": "1.0.0", + "deps": [], + "cksum": "b2c9e153a8860ce92ba7cbdea7b718409d181c08f4c6c5c2a612919dcb155af2", + "features": {}, + "yanked": false, + "links": "git2" + } +] diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme-2.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme-2.snap index 5a1b329b9e1..c0787b7c239 100644 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme-2.snap +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme-2.snap @@ -3,54 +3,40 @@ source: src/tests/krate/publish/manifest.rs expression: response.json() --- { - "version": { - "audit_actions": [ - { - "action": "publish", - "time": "[datetime]", - "user": { - "avatar": null, - "id": "[id]", - "login": "foo", - "name": null, - "url": "https://github.com/foo" - } - } - ], - "bin_names": [], - "checksum": "50da036cb5dfa54c39ab25c02c31ca001fa103b4de41e3f79ca1d3b6877c775f", - "crate": "foo", - "crate_size": 173, + "crate": { + "badges": [], + "categories": null, "created_at": "[datetime]", + "default_version": "1.0.0", "description": "description", - "dl_path": "/api/v1/crates/foo/1.0.0/download", "documentation": null, "downloads": 0, - "edition": null, - "features": {}, - "has_lib": false, + "exact_match": false, "homepage": null, - "id": "[id]", - "lib_links": null, - "license": "MIT", + "id": "foo", + "keywords": null, "links": { - "authors": "/api/v1/crates/foo/1.0.0/authors", - "dependencies": "/api/v1/crates/foo/1.0.0/dependencies", - "version_downloads": "/api/v1/crates/foo/1.0.0/downloads" + "owner_team": "/api/v1/crates/foo/owner_team", + "owner_user": "/api/v1/crates/foo/owner_user", + "owners": "/api/v1/crates/foo/owners", + "reverse_dependencies": "/api/v1/crates/foo/reverse_dependencies", + "version_downloads": "/api/v1/crates/foo/downloads", + "versions": "/api/v1/crates/foo/versions" }, - "num": "1.0.0", - "published_by": { - "avatar": null, - "id": "[id]", - "login": "foo", - "name": null, - "url": "https://github.com/foo" - }, - "readme_path": "/api/v1/crates/foo/1.0.0/readme", + "max_stable_version": "1.0.0", + "max_version": "1.0.0", + "name": "foo", + "newest_version": "1.0.0", + "num_versions": 1, + "recent_downloads": null, "repository": null, - "rust_version": "1.69", "updated_at": "[datetime]", - "yank_message": null, + "versions": null, "yanked": false + }, + "warnings": { + "invalid_badges": [], + "invalid_categories": [], + "other": [] } } diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-2.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme-4.snap similarity index 81% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-2.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme-4.snap index f10a4c4b3d6..5a1b329b9e1 100644 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__links__crate_with_links_field-2.snap +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme-4.snap @@ -1,5 +1,5 @@ --- -source: src/tests/krate/publish/links.rs +source: src/tests/krate/publish/manifest.rs expression: response.json() --- { @@ -10,7 +10,7 @@ expression: response.json() "time": "[datetime]", "user": { "avatar": null, - "id": 1, + "id": "[id]", "login": "foo", "name": null, "url": "https://github.com/foo" @@ -18,11 +18,11 @@ expression: response.json() } ], "bin_names": [], - "checksum": "b2c9e153a8860ce92ba7cbdea7b718409d181c08f4c6c5c2a612919dcb155af2", + "checksum": "50da036cb5dfa54c39ab25c02c31ca001fa103b4de41e3f79ca1d3b6877c775f", "crate": "foo", - "crate_size": 167, + "crate_size": 173, "created_at": "[datetime]", - "description": "foo?!", + "description": "description", "dl_path": "/api/v1/crates/foo/1.0.0/download", "documentation": null, "downloads": 0, @@ -31,7 +31,7 @@ expression: response.json() "has_lib": false, "homepage": null, "id": "[id]", - "lib_links": "git2", + "lib_links": null, "license": "MIT", "links": { "authors": "/api/v1/crates/foo/1.0.0/authors", @@ -48,7 +48,7 @@ expression: response.json() }, "readme_path": "/api/v1/crates/foo/1.0.0/readme", "repository": null, - "rust_version": null, + "rust_version": "1.69", "updated_at": "[datetime]", "yank_message": null, "yanked": false diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme.snap deleted file mode 100644 index c0787b7c239..00000000000 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__boolean_readme.snap +++ /dev/null @@ -1,42 +0,0 @@ ---- -source: src/tests/krate/publish/manifest.rs -expression: response.json() ---- -{ - "crate": { - "badges": [], - "categories": null, - "created_at": "[datetime]", - "default_version": "1.0.0", - "description": "description", - "documentation": null, - "downloads": 0, - "exact_match": false, - "homepage": null, - "id": "foo", - "keywords": null, - "links": { - "owner_team": "/api/v1/crates/foo/owner_team", - "owner_user": "/api/v1/crates/foo/owner_user", - "owners": "/api/v1/crates/foo/owners", - "reverse_dependencies": "/api/v1/crates/foo/reverse_dependencies", - "version_downloads": "/api/v1/crates/foo/downloads", - "versions": "/api/v1/crates/foo/versions" - }, - "max_stable_version": "1.0.0", - "max_version": "1.0.0", - "name": "foo", - "newest_version": "1.0.0", - "num_versions": 1, - "recent_downloads": null, - "repository": null, - "updated_at": "[datetime]", - "versions": null, - "yanked": false - }, - "warnings": { - "invalid_badges": [], - "invalid_categories": [], - "other": [] - } -} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate-2.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate-2.snap index 4b3a96d7071..c0787b7c239 100644 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate-2.snap +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate-2.snap @@ -3,57 +3,40 @@ source: src/tests/krate/publish/manifest.rs expression: response.json() --- { - "version": { - "audit_actions": [ - { - "action": "publish", - "time": "[datetime]", - "user": { - "avatar": null, - "id": "[id]", - "login": "foo", - "name": null, - "url": "https://github.com/foo" - } - } - ], - "bin_names": [ - "bar", - "foo" - ], - "checksum": "2af566e52c8fb0376558a00b0bc426c699e8fe2b12807b75cbce7ccf54e37a98", - "crate": "foo", - "crate_size": 251, + "crate": { + "badges": [], + "categories": null, "created_at": "[datetime]", + "default_version": "1.0.0", "description": "description", - "dl_path": "/api/v1/crates/foo/1.0.0/download", "documentation": null, "downloads": 0, - "edition": null, - "features": {}, - "has_lib": true, + "exact_match": false, "homepage": null, - "id": "[id]", - "lib_links": null, - "license": "MIT", + "id": "foo", + "keywords": null, "links": { - "authors": "/api/v1/crates/foo/1.0.0/authors", - "dependencies": "/api/v1/crates/foo/1.0.0/dependencies", - "version_downloads": "/api/v1/crates/foo/1.0.0/downloads" + "owner_team": "/api/v1/crates/foo/owner_team", + "owner_user": "/api/v1/crates/foo/owner_user", + "owners": "/api/v1/crates/foo/owners", + "reverse_dependencies": "/api/v1/crates/foo/reverse_dependencies", + "version_downloads": "/api/v1/crates/foo/downloads", + "versions": "/api/v1/crates/foo/versions" }, - "num": "1.0.0", - "published_by": { - "avatar": null, - "id": "[id]", - "login": "foo", - "name": null, - "url": "https://github.com/foo" - }, - "readme_path": "/api/v1/crates/foo/1.0.0/readme", + "max_stable_version": "1.0.0", + "max_version": "1.0.0", + "name": "foo", + "newest_version": "1.0.0", + "num_versions": 1, + "recent_downloads": null, "repository": null, - "rust_version": null, "updated_at": "[datetime]", - "yank_message": null, + "versions": null, "yanked": false + }, + "warnings": { + "invalid_badges": [], + "invalid_categories": [], + "other": [] } } diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate-4.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate-4.snap new file mode 100644 index 00000000000..4b3a96d7071 --- /dev/null +++ b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate-4.snap @@ -0,0 +1,59 @@ +--- +source: src/tests/krate/publish/manifest.rs +expression: response.json() +--- +{ + "version": { + "audit_actions": [ + { + "action": "publish", + "time": "[datetime]", + "user": { + "avatar": null, + "id": "[id]", + "login": "foo", + "name": null, + "url": "https://github.com/foo" + } + } + ], + "bin_names": [ + "bar", + "foo" + ], + "checksum": "2af566e52c8fb0376558a00b0bc426c699e8fe2b12807b75cbce7ccf54e37a98", + "crate": "foo", + "crate_size": 251, + "created_at": "[datetime]", + "description": "description", + "dl_path": "/api/v1/crates/foo/1.0.0/download", + "documentation": null, + "downloads": 0, + "edition": null, + "features": {}, + "has_lib": true, + "homepage": null, + "id": "[id]", + "lib_links": null, + "license": "MIT", + "links": { + "authors": "/api/v1/crates/foo/1.0.0/authors", + "dependencies": "/api/v1/crates/foo/1.0.0/dependencies", + "version_downloads": "/api/v1/crates/foo/1.0.0/downloads" + }, + "num": "1.0.0", + "published_by": { + "avatar": null, + "id": "[id]", + "login": "foo", + "name": null, + "url": "https://github.com/foo" + }, + "readme_path": "/api/v1/crates/foo/1.0.0/readme", + "repository": null, + "rust_version": null, + "updated_at": "[datetime]", + "yank_message": null, + "yanked": false + } +} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate.snap deleted file mode 100644 index c0787b7c239..00000000000 --- a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__manifest__lib_and_bin_crate.snap +++ /dev/null @@ -1,42 +0,0 @@ ---- -source: src/tests/krate/publish/manifest.rs -expression: response.json() ---- -{ - "crate": { - "badges": [], - "categories": null, - "created_at": "[datetime]", - "default_version": "1.0.0", - "description": "description", - "documentation": null, - "downloads": 0, - "exact_match": false, - "homepage": null, - "id": "foo", - "keywords": null, - "links": { - "owner_team": "/api/v1/crates/foo/owner_team", - "owner_user": "/api/v1/crates/foo/owner_user", - "owners": "/api/v1/crates/foo/owners", - "reverse_dependencies": "/api/v1/crates/foo/reverse_dependencies", - "version_downloads": "/api/v1/crates/foo/downloads", - "versions": "/api/v1/crates/foo/versions" - }, - "max_stable_version": "1.0.0", - "max_version": "1.0.0", - "name": "foo", - "newest_version": "1.0.0", - "num_versions": 1, - "recent_downloads": null, - "repository": null, - "updated_at": "[datetime]", - "versions": null, - "yanked": false - }, - "warnings": { - "invalid_badges": [], - "invalid_categories": [], - "other": [] - } -} diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__max_size__tarball_between_default_axum_limit_and_max_upload_size.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__max_size__tarball_between_default_axum_limit_and_max_upload_size-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__max_size__tarball_between_default_axum_limit_and_max_upload_size.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__max_size__tarball_between_default_axum_limit_and_max_upload_size-2.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_empty_readme.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_empty_readme-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_empty_readme.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_empty_readme-2.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_readme.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_readme-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_readme.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_readme-2.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_readme_and_plus_version.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_readme_and_plus_version-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_readme_and_plus_version.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__readme__new_krate_with_readme_and_plus_version-2.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-5.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-11.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-5.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-11.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-3.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-7.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-3.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-7.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-4.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-9.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-4.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__full_flow-9.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__happy_path.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__happy_path-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__happy_path.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__happy_path-2.snap diff --git a/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__happy_path_with_fancy_auth_header.snap b/src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__happy_path_with_fancy_auth_header-2.snap similarity index 100% rename from src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__happy_path_with_fancy_auth_header.snap rename to src/tests/krate/publish/snapshots/crates_io__tests__krate__publish__trustpub__happy_path_with_fancy_auth_header-2.snap diff --git a/src/tests/krate/publish/tarball.rs b/src/tests/krate/publish/tarball.rs index 43ce7010b81..39aeaee00d6 100644 --- a/src/tests/krate/publish/tarball.rs +++ b/src/tests/krate/publish/tarball.rs @@ -3,7 +3,6 @@ use crate::tests::util::{RequestHelper, TestApp}; use bytes::{BufMut, BytesMut}; use crates_io_tarball::TarballBuilder; use googletest::prelude::*; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -15,7 +14,7 @@ async fn new_krate_wrong_files() { .add_file("bar-1.0.0/a", ""); let response = user.publish_crate(builder).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid path found: bar-1.0.0/a"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -42,7 +41,7 @@ async fn new_krate_tarball_with_hard_links() { let body = PublishBuilder::create_publish_body(&json, &tarball); let response = token.publish_crate(body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"unexpected symlink or hard link found: foo-1.1.0/bar"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -52,7 +51,7 @@ async fn empty_body() { let (app, _, user) = TestApp::full().with_user().await; let response = user.publish_crate(&[] as &[u8]).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid metadata length"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -62,7 +61,7 @@ async fn json_len_truncated() { let (app, _, _, token) = TestApp::full().with_token().await; let response = token.publish_crate(&[0u8, 0] as &[u8]).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid metadata length"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -72,7 +71,7 @@ async fn json_bytes_truncated() { let (app, _, _, token) = TestApp::full().with_token().await; let response = token.publish_crate(&[100u8, 0, 0, 0, 0] as &[u8]).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid metadata length for remaining payload: 100"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -91,7 +90,7 @@ async fn tarball_len_truncated() { let response = token.publish_crate(bytes.freeze()).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid tarball length"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -109,7 +108,7 @@ async fn tarball_bytes_truncated() { bytes.put_u8(0); let response = token.publish_crate(bytes.freeze()).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid tarball length for remaining payload: 100"}]}"#); assert_that!(app.stored_files().await, empty()); } diff --git a/src/tests/krate/publish/trustpub.rs b/src/tests/krate/publish/trustpub.rs index 41fe9765416..8a39abc49f3 100644 --- a/src/tests/krate/publish/trustpub.rs +++ b/src/tests/krate/publish/trustpub.rs @@ -10,7 +10,6 @@ use crates_io_trustpub::keystore::MockOidcKeyStore; use crates_io_trustpub::test_keys::encode_for_testing; use diesel::QueryResult; use diesel_async::AsyncPgConnection; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; use mockall::predicate::*; use p256::ecdsa::signature::digest::Output; @@ -62,7 +61,7 @@ async fn test_full_flow() -> anyhow::Result<()> { let pb = PublishBuilder::new(CRATE_NAME, "1.0.0"); let response = api_token_client.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // Step 2: Create a Trusted Publishing configuration @@ -95,7 +94,7 @@ async fn test_full_flow() -> anyhow::Result<()> { } "#); - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // Step 3: Generate a new OIDC token and exchange it for a temporary access token @@ -118,7 +117,7 @@ async fn test_full_flow() -> anyhow::Result<()> { "token": "[token]" } "#); - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let token = json["token"].as_str().unwrap_or_default(); // Step 4: Publish a new version of the crate using the temporary access token @@ -128,7 +127,7 @@ async fn test_full_flow() -> anyhow::Result<()> { let pb = PublishBuilder::new(CRATE_NAME, "1.1.0"); let response = oidc_token_client.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -138,7 +137,7 @@ async fn test_full_flow() -> anyhow::Result<()> { let url = format!("/api/v1/crates/{CRATE_NAME}/1.1.0"); let response = client.get::<()>(&url).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".version.created_at" => "[datetime]", ".version.updated_at" => "[datetime]", @@ -150,7 +149,7 @@ async fn test_full_flow() -> anyhow::Result<()> { let response = oidc_token_client .delete::<()>("/api/v1/trusted_publishing/tokens") .await; - assert_eq!(response.status(), StatusCode::NO_CONTENT); + assert_snapshot!(response.status(), @"204 No Content"); assert_snapshot!(app.emails_snapshot().await); @@ -192,7 +191,7 @@ async fn test_happy_path() -> anyhow::Result<()> { let pb = PublishBuilder::new(&krate.name, "1.1.0"); let response = oidc_token_client.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -217,7 +216,7 @@ async fn test_happy_path_with_fancy_auth_header() -> anyhow::Result<()> { let pb = PublishBuilder::new(&krate.name, "1.1.0"); let response = oidc_token_client.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -241,7 +240,7 @@ async fn test_invalid_authorization_header_format() -> anyhow::Result<()> { let pb = PublishBuilder::new(&krate.name, "1.1.0"); let response = oidc_token_client.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + assert_snapshot!(response.status(), @"401 Unauthorized"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"The given API token does not match the format used by crates.io. Tokens generated before 2020-07-14 were generated with an insecure random number generator, and have been revoked. You can generate a new token at https://crates.io/me. For more information please see https://blog.rust-lang.org/2020/07/14/crates-io-security-advisory.html. We apologize for any inconvenience."}]}"#); Ok(()) @@ -262,7 +261,7 @@ async fn test_invalid_token_format() -> anyhow::Result<()> { let pb = PublishBuilder::new(&krate.name, "1.1.0"); let response = oidc_token_client.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Invalid authentication token"}]}"#); Ok(()) @@ -284,7 +283,7 @@ async fn test_non_existent_token() -> anyhow::Result<()> { let pb = PublishBuilder::new(&krate.name, "1.1.0"); let response = oidc_token_client.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Invalid authentication token"}]}"#); Ok(()) @@ -301,7 +300,7 @@ async fn test_non_existent_token_with_new_crate() -> anyhow::Result<()> { let pb = PublishBuilder::new("foo", "1.0.0"); let response = oidc_token_client.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Trusted Publishing tokens do not support creating new crates"}]}"#); Ok(()) @@ -324,7 +323,7 @@ async fn test_token_for_wrong_crate() -> anyhow::Result<()> { let pb = PublishBuilder::new(&krate.name, "1.1.0"); let response = oidc_token_client.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"The provided access token is not valid for crate `bar`"}]}"#); Ok(()) diff --git a/src/tests/krate/publish/validation.rs b/src/tests/krate/publish/validation.rs index 14bd36f7a4f..e316bc3cec3 100644 --- a/src/tests/krate/publish/validation.rs +++ b/src/tests/krate/publish/validation.rs @@ -13,7 +13,7 @@ async fn empty_json() { let body = PublishBuilder::create_publish_body("{}", &tarball); let response = token.publish_crate(body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid upload request: missing field `name` at line 1 column 2"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -54,7 +54,7 @@ async fn invalid_version() { let body = PublishBuilder::create_publish_body(&new_json, &tarball); let response = token.publish_crate(body).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"\"broken\" is an invalid semver version"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -68,12 +68,12 @@ async fn license_and_description_required() { .unset_description(); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"missing or empty metadata fields: description, license. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields"}]}"#); let crate_to_publish = PublishBuilder::new("foo_metadata", "1.1.0").unset_description(); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"missing or empty metadata fields: description. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields"}]}"#); let crate_to_publish = PublishBuilder::new("foo_metadata", "1.1.0") .unset_license() @@ -81,7 +81,7 @@ async fn license_and_description_required() { .unset_description(); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"missing or empty metadata fields: description. Please see https://doc.rust-lang.org/cargo/reference/manifest.html for more information on configuring these fields"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -94,7 +94,7 @@ async fn long_description() { let crate_to_publish = PublishBuilder::new("foo_metadata", "1.1.0").description(&description); let response = token.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"The `description` is too long. A maximum of 1000 characters are currently allowed."}]}"#); assert_that!(app.stored_files().await, empty()); @@ -107,7 +107,7 @@ async fn invalid_license() { let response = token .publish_crate(PublishBuilder::new("foo", "1.0.0").license("MIT AND foobar")) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"unknown or invalid license expression; see http://opensource.org/licenses for options, and http://spdx.org/licenses/ for their identifiers\nNote: If you have a non-standard license that is not listed by SPDX, use the license-file field to specify the path to a file containing the text of the license.\nSee https://doc.rust-lang.org/cargo/reference/manifest.html#the-license-and-license-file-fields for more information.\nMIT AND foobar\n ^^^^^^ unknown term"}]}"#); assert_that!(app.stored_files().await, empty()); } @@ -121,7 +121,7 @@ async fn invalid_urls() { PublishBuilder::new("foo", "1.0.0").documentation("javascript:alert('boom')"), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"URL for field `documentation` must begin with http:// or https:// (url: javascript:alert('boom'))"}]}"#); assert_that!(app.stored_files().await, empty()); } diff --git a/src/tests/krate/yanking.rs b/src/tests/krate/yanking.rs index 28e721c8c29..b2d2483704b 100644 --- a/src/tests/krate/yanking.rs +++ b/src/tests/krate/yanking.rs @@ -8,7 +8,6 @@ use chrono::Utc; use diesel::ExpressionMethods; use diesel_async::RunQueryDsl; use googletest::prelude::*; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; use std::time::Duration; @@ -286,13 +285,13 @@ async fn patch_version_yank_unyank() { let response = token .update_yank_status("patchable", "1.0.0", None, Some("Invalid message")) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Cannot update yank message for a version that is not yanked"}]}"#); // Attempt to unyank with message (should fail) let response = token .update_yank_status("patchable", "1.0.0", Some(false), Some("Invalid message")) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Cannot set yank message when unyanking"}]}"#); } diff --git a/src/tests/not_found_error.rs b/src/tests/not_found_error.rs index 5401d4a850c..b75b7ab3128 100644 --- a/src/tests/not_found_error.rs +++ b/src/tests/not_found_error.rs @@ -1,5 +1,4 @@ use crate::tests::{RequestHelper, TestApp}; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -7,7 +6,7 @@ async fn visiting_unknown_route_returns_404() { let (_, anon) = TestApp::init().empty().await; let response = anon.get::<()>("/does-not-exist").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Not Found"}]}"#); } @@ -16,6 +15,6 @@ async fn visiting_unknown_api_route_returns_404() { let (_, anon) = TestApp::init().empty().await; let response = anon.get::<()>("/api/v1/does-not-exist").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Not Found"}]}"#); } diff --git a/src/tests/owners.rs b/src/tests/owners.rs index 12614ee0b1d..3c81801bf3d 100644 --- a/src/tests/owners.rs +++ b/src/tests/owners.rs @@ -189,7 +189,7 @@ async fn owners_can_remove_self() { let response = token .remove_named_owner("owners_selfremove", username) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"cannot remove all individual owners of a crate. Team member don't have permission to modify owners, so at least one individual owner is required."}]}"#); create_and_add_owner(&app, &token, "secondowner", &krate).await; @@ -198,14 +198,14 @@ async fn owners_can_remove_self() { let response = token .remove_named_owner("owners_selfremove", username) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"owners successfully removed","ok":true}"#); // After you delete yourself, you no longer have permissions to manage the crate. let response = token .remove_named_owner("owners_selfremove", username) .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"only owners have permission to modify owners"}]}"#); } @@ -229,7 +229,7 @@ async fn modify_multiple_owners() -> anyhow::Result<()> { let response = token .remove_named_owners("owners_multiple", &[username, "user2", "user3"]) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"cannot remove all individual owners of a crate. Team member don't have permission to modify owners, so at least one individual owner is required."}]}"#); assert_eq!(krate.owners(&mut conn).await?.len(), 3); @@ -237,7 +237,7 @@ async fn modify_multiple_owners() -> anyhow::Result<()> { let response = token .remove_named_owners("owners_multiple", &["user2", "user3"]) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"owners successfully removed","ok":true}"#); assert_eq!(krate.owners(&mut conn).await?.len(), 1); @@ -245,7 +245,7 @@ async fn modify_multiple_owners() -> anyhow::Result<()> { let response = token .add_named_owners("owners_multiple", &["user2", username]) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"`foo` is already an owner"}]}"#); assert_eq!(krate.owners(&mut conn).await?.len(), 1); @@ -253,7 +253,7 @@ async fn modify_multiple_owners() -> anyhow::Result<()> { let response = token .add_named_owners("owners_multiple", &["user2", "user3"]) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user user2 has been invited to be an owner of crate owners_multiple,user user3 has been invited to be an owner of crate owners_multiple","ok":true}"#); assert_snapshot!(app.emails_snapshot().await); @@ -397,15 +397,15 @@ async fn test_unknown_crate() { app.db_new_user("bar").await; let response = user.get::<()>("/api/v1/crates/unknown/owners").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown` does not exist"}]}"#); let response = user.get::<()>("/api/v1/crates/unknown/owner_team").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown` does not exist"}]}"#); let response = user.get::<()>("/api/v1/crates/unknown/owner_user").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown` does not exist"}]}"#); } @@ -422,7 +422,7 @@ async fn api_token_cannot_list_invitations_v1() { let (_, _, _, token) = TestApp::init().with_token().await; let response = token.get::<()>("/api/v1/me/crate_owner_invitations").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); } #[tokio::test(flavor = "multi_thread")] @@ -442,7 +442,7 @@ async fn invitations_list_v1() { .good(); let response = user.get::<()>("/api/v1/me/crate_owner_invitations").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let invitations = user.list_invitations().await; assert_eq!( diff --git a/src/tests/pagination.rs b/src/tests/pagination.rs index 542c38b9c15..e5111db4e94 100644 --- a/src/tests/pagination.rs +++ b/src/tests/pagination.rs @@ -1,6 +1,5 @@ use crate::tests::builders::CrateBuilder; use crate::tests::util::{RequestHelper, TestApp}; -use http::status::StatusCode; use insta::assert_snapshot; use ipnetwork::IpNetwork; @@ -30,6 +29,6 @@ async fn pagination_blocks_ip_from_cidr_block_list() { let response = anon .get_with_query::<()>("/api/v1/crates", "page=2&per_page=1") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Page 2 is unavailable for performance reasons. Please take a look at https://crates.io/data-access for alternatives."}]}"#); } diff --git a/src/tests/read_only_mode.rs b/src/tests/read_only_mode.rs index 0a11fc693df..eb285f33552 100644 --- a/src/tests/read_only_mode.rs +++ b/src/tests/read_only_mode.rs @@ -3,8 +3,7 @@ use crate::tests::{RequestHelper, TestApp}; use diesel::prelude::*; use diesel_async::RunQueryDsl; -use http::StatusCode; -use insta::assert_json_snapshot; +use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] async fn can_hit_read_only_endpoints_in_read_only_mode() { @@ -16,7 +15,7 @@ async fn can_hit_read_only_endpoints_in_read_only_mode() { .await; let response = anon.get::<()>("/api/v1/crates").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); } #[tokio::test(flavor = "multi_thread")] @@ -38,7 +37,7 @@ async fn cannot_hit_endpoint_which_writes_db_in_read_only_mode() { let response = token .delete::<()>("/api/v1/crates/foo_yank_read_only/1.0.0/yank") .await; - assert_eq!(response.status(), StatusCode::SERVICE_UNAVAILABLE); + assert_snapshot!(response.status(), @"503 Service Unavailable"); assert_json_snapshot!(response.json()); } @@ -61,7 +60,7 @@ async fn can_download_crate_in_read_only_mode() { let response = anon .get::<()>("/api/v1/crates/foo_download_read_only/1.0.0/download") .await; - assert_eq!(response.status(), StatusCode::FOUND); + assert_snapshot!(response.status(), @"302 Found"); // We're in read only mode so the download should not have been counted diff --git a/src/tests/routes/categories/get.rs b/src/tests/routes/categories/get.rs index d9c145cea84..b25b3a6bee5 100644 --- a/src/tests/routes/categories/get.rs +++ b/src/tests/routes/categories/get.rs @@ -5,8 +5,7 @@ use crate::tests::util::{MockAnonymousUser, RequestHelper, TestApp}; use crates_io_database::schema::categories; use diesel::insert_into; use diesel_async::RunQueryDsl; -use http::StatusCode; -use insta::assert_json_snapshot; +use insta::{assert_json_snapshot, assert_snapshot}; use serde_json::Value; #[tokio::test(flavor = "multi_thread")] @@ -18,7 +17,7 @@ async fn show() -> anyhow::Result<()> { // Return not found if a category doesn't exist let response = anon.get::<()>(url).await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); // Create a category and a subcategory let cats = vec![ diff --git a/src/tests/routes/categories/snapshots/crates_io__tests__routes__categories__get__show.snap b/src/tests/routes/categories/snapshots/crates_io__tests__routes__categories__get__show-2.snap similarity index 100% rename from src/tests/routes/categories/snapshots/crates_io__tests__routes__categories__get__show.snap rename to src/tests/routes/categories/snapshots/crates_io__tests__routes__categories__get__show-2.snap diff --git a/src/tests/routes/crates/downloads.rs b/src/tests/routes/crates/downloads.rs index b7b9bdc6a2a..6fe1f1a11ae 100644 --- a/src/tests/routes/crates/downloads.rs +++ b/src/tests/routes/crates/downloads.rs @@ -137,7 +137,7 @@ async fn test_crate_downloads() { save_version_downloads("foo", "1.1.0", 1, &mut conn).await; let response = anon.get::<()>("/api/v1/crates/foo/downloads").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let json = response.json(); assert_json_snapshot!(json, { ".version_downloads[].date" => "[date]", @@ -145,7 +145,7 @@ async fn test_crate_downloads() { // check different crate name let response = anon.get::<()>("/api/v1/crates/bar/downloads").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!( response.text(), @r#"{"errors":[{"detail":"crate `bar` does not exist"}]}"# @@ -153,7 +153,7 @@ async fn test_crate_downloads() { // check non-canonical crate name let response = anon.get::<()>("/api/v1/crates/FOO/downloads").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json); } @@ -178,7 +178,7 @@ async fn test_version_downloads() { save_version_downloads("foo", "1.1.0", 1, &mut conn).await; let response = anon.get::<()>("/api/v1/crates/foo/1.0.0/downloads").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let json = response.json(); assert_json_snapshot!(json, { ".version_downloads[].date" => "[date]", @@ -186,7 +186,7 @@ async fn test_version_downloads() { // check different crate name let response = anon.get::<()>("/api/v1/crates/bar/1.0.0/downloads").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!( response.text(), @r#"{"errors":[{"detail":"crate `bar` does not exist"}]}"# @@ -194,12 +194,12 @@ async fn test_version_downloads() { // check non-canonical crate name let response = anon.get::<()>("/api/v1/crates/FOO/1.0.0/downloads").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json); // check missing version let response = anon.get::<()>("/api/v1/crates/foo/2.0.0/downloads").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!( response.text(), @r#"{"errors":[{"detail":"crate `foo` does not have a version `2.0.0`"}]}"# @@ -209,7 +209,7 @@ async fn test_version_downloads() { let response = anon .get::<()>("/api/v1/crates/foo/invalid-version/downloads") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!( response.text(), @r#"{"errors":[{"detail":"Invalid URL: unexpected character 'i' while parsing major version number"}]}"# diff --git a/src/tests/routes/crates/following.rs b/src/tests/routes/crates/following.rs index c6503e5456b..75f4452a06b 100644 --- a/src/tests/routes/crates/following.rs +++ b/src/tests/routes/crates/following.rs @@ -1,14 +1,14 @@ use crate::tests::builders::CrateBuilder; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; +use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] async fn diesel_not_found_results_in_404() { let (_, _, user) = TestApp::init().with_user().await; - - let url = "/api/v1/crates/foo_following/following"; - let response = user.get::<()>(url).await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + let response = user + .get::<()>("/api/v1/crates/foo_following/following") + .await; + assert_snapshot!(response.status(), @"404 Not Found"); } #[tokio::test(flavor = "multi_thread")] @@ -24,7 +24,8 @@ async fn disallow_api_token_auth_for_get_crate_following_status() { .await; // Token auth on GET for get following status is disallowed - let url = format!("/api/v1/crates/{a_crate}/following"); - let response = token.get::<()>(&url).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + let response = token + .get::<()>(&format!("/api/v1/crates/{a_crate}/following")) + .await; + assert_snapshot!(response.status(), @"403 Forbidden"); } diff --git a/src/tests/routes/crates/list.rs b/src/tests/routes/crates/list.rs index 6f5d09d33fc..8bb21f55ddb 100644 --- a/src/tests/routes/crates/list.rs +++ b/src/tests/routes/crates/list.rs @@ -1140,7 +1140,7 @@ async fn invalid_seek_parameter() { let (_app, anon, _cookie) = TestApp::init().with_user().await; let response = anon.get::<()>("/api/v1/crates?seek=broken").await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid seek parameter"}]}"#); } @@ -1163,13 +1163,13 @@ async fn pagination_parameters_only_accept_integers() { let response = anon .get_with_query::<()>("/api/v1/crates", "page=1&per_page=100%22%EF%BC%8Cexception") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize query string: per_page: invalid digit found in string"}]}"#); let response = anon .get_with_query::<()>("/api/v1/crates", "page=100%22%EF%BC%8Cexception&per_page=1") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize query string: page: invalid digit found in string"}]}"#); } diff --git a/src/tests/routes/crates/new.rs b/src/tests/routes/crates/new.rs index 4cd6233ff91..d128ca576a6 100644 --- a/src/tests/routes/crates/new.rs +++ b/src/tests/routes/crates/new.rs @@ -1,6 +1,5 @@ use crate::tests::builders::PublishBuilder; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -15,6 +14,6 @@ async fn daily_limit() { let crate_to_publish = PublishBuilder::new("foo_daily_limit", "1.0.0"); let response = user.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::TOO_MANY_REQUESTS); + assert_snapshot!(response.status(), @"429 Too Many Requests"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"You have published too many versions of this crate in the last 24 hours"}]}"#); } diff --git a/src/tests/routes/crates/owners/add.rs b/src/tests/routes/crates/owners/add.rs index f2aa0a8f02c..8ac6ff2c61e 100644 --- a/src/tests/routes/crates/owners/add.rs +++ b/src/tests/routes/crates/owners/add.rs @@ -2,7 +2,6 @@ use crate::models::token::{CrateScope, EndpointScope}; use crate::tests::builders::CrateBuilder; use crate::tests::owners::expire_invitation; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; use insta::assert_snapshot; // This is testing Cargo functionality! ! ! @@ -48,7 +47,7 @@ async fn owner_change_via_cookie() { .await; let response = cookie.add_named_owner(&krate.name, &user2.gh_login).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user user-2 has been invited to be an owner of crate foo_crate","ok":true}"#); } @@ -65,7 +64,7 @@ async fn owner_change_via_token() { .await; let response = token.add_named_owner(&krate.name, &user2.gh_login).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user user-2 has been invited to be an owner of crate foo_crate","ok":true}"#); } @@ -85,7 +84,7 @@ async fn owner_change_via_change_owner_token() { .await; let response = token.add_named_owner(&krate.name, &user2.gh_login).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user user-2 has been invited to be an owner of crate foo_crate","ok":true}"#); } @@ -106,7 +105,7 @@ async fn owner_change_via_change_owner_token_with_matching_crate_scope() { .await; let response = token.add_named_owner(&krate.name, &user2.gh_login).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user user-2 has been invited to be an owner of crate foo_crate","ok":true}"#); } @@ -127,7 +126,7 @@ async fn owner_change_via_change_owner_token_with_wrong_crate_scope() { .await; let response = token.add_named_owner(&krate.name, &user2.gh_login).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this token does not have the required permissions to perform this action"}]}"#); } @@ -147,7 +146,7 @@ async fn owner_change_via_publish_token() { .await; let response = token.add_named_owner(&krate.name, &user2.gh_login).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this token does not have the required permissions to perform this action"}]}"#); } @@ -164,7 +163,7 @@ async fn owner_change_without_auth() { .await; let response = anon.add_named_owner(&krate.name, &user2.gh_login).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); } @@ -182,7 +181,7 @@ async fn test_owner_change_with_legacy_field() { let response = user1 .put::<()>("/api/v1/crates/foo/owners", input.as_bytes()) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user user2 has been invited to be an owner of crate foo","ok":true}"#); } @@ -201,7 +200,7 @@ async fn test_owner_change_with_invalid_json() { let response = user .put::<()>("/api/v1/crates/foo/owners", input.as_bytes()) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to parse the request body as JSON: owners[1]: expected value at line 1 column 20"}]}"#); // `owners` is not an array @@ -209,7 +208,7 @@ async fn test_owner_change_with_invalid_json() { let response = user .put::<()>("/api/v1/crates/foo/owners", input.as_bytes()) .await; - assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + assert_snapshot!(response.status(), @"422 Unprocessable Entity"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize the JSON body into the target type: owners: invalid type: string \"foo\", expected a sequence at line 1 column 16"}]}"#); // missing `owners` and/or `users` fields @@ -217,7 +216,7 @@ async fn test_owner_change_with_invalid_json() { let response = user .put::<()>("/api/v1/crates/foo/owners", input.as_bytes()) .await; - assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + assert_snapshot!(response.status(), @"422 Unprocessable Entity"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize the JSON body into the target type: missing field `owners` at line 1 column 2"}]}"#); } @@ -236,7 +235,7 @@ async fn invite_already_invited_user() { // Invite the user the first time let response = owner.add_named_owner("crate_name", "invited_user").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user invited_user has been invited to be an owner of crate crate_name","ok":true}"#); // Check one email was sent, this will be the ownership invite email @@ -244,7 +243,7 @@ async fn invite_already_invited_user() { // Then invite the user a second time, the message should point out the user is already invited let response = owner.add_named_owner("crate_name", "invited_user").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user invited_user already has a pending invitation to be an owner of crate crate_name","ok":true}"#); // Check that no new email is sent after the second invitation @@ -266,7 +265,7 @@ async fn invite_with_existing_expired_invite() { // Invite the user the first time let response = owner.add_named_owner("crate_name", "invited_user").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user invited_user has been invited to be an owner of crate crate_name","ok":true}"#); // Check one email was sent, this will be the ownership invite email @@ -277,7 +276,7 @@ async fn invite_with_existing_expired_invite() { // Then invite the user a second time, a new invite is created as the old one expired let response = owner.add_named_owner("crate_name", "invited_user").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"user invited_user has been invited to be an owner of crate crate_name","ok":true}"#); // Check that the email for the second invite was sent @@ -290,7 +289,7 @@ async fn test_unknown_crate() { app.db_new_user("bar").await; let response = user.add_named_owner("unknown", "bar").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown` does not exist"}]}"#); } @@ -304,7 +303,7 @@ async fn test_unknown_user() { .await; let response = cookie.add_named_owner("foo", "unknown").await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"could not find user with login `unknown`"}]}"#); } @@ -320,7 +319,7 @@ async fn test_unknown_team() { let response = cookie .add_named_owner("foo", "github:unknown:unknown") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"could not find the github team unknown/unknown. Make sure that you have the right permissions in GitHub. See https://doc.rust-lang.org/cargo/reference/publishing.html#github-permissions"}]}"#); } @@ -343,7 +342,7 @@ async fn max_invites_per_request() { } let response = owner.add_named_owners("crate_name", &usernames).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"too many invites for this request - maximum 10"}]}"#); } @@ -369,7 +368,7 @@ async fn no_invite_emails_for_txn_rollback() { usernames.push("bananas".to_string()); let response = token.add_named_owners("crate_name", &usernames).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"could not find user with login `bananas`"}]}"#); // No emails should have been sent. @@ -379,7 +378,7 @@ async fn no_invite_emails_for_txn_rollback() { let _ = usernames.pop(); let response = token.add_named_owners("crate_name", &usernames).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // 9 emails to the good invitees should have been sent. assert_eq!(app.emails().await.len(), 9); diff --git a/src/tests/routes/crates/owners/remove.rs b/src/tests/routes/crates/owners/remove.rs index 669248aef07..8e830a7e7bb 100644 --- a/src/tests/routes/crates/owners/remove.rs +++ b/src/tests/routes/crates/owners/remove.rs @@ -2,7 +2,6 @@ use crate::models::CrateOwner; use crate::tests::builders::CrateBuilder; use crate::tests::util::{RequestHelper, TestApp}; use crates_io_github::{GitHubOrganization, GitHubTeam, GitHubTeamMembership, MockGitHubClient}; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -20,7 +19,7 @@ async fn test_owner_change_with_invalid_json() { let response = user .delete_with_body::<()>("/api/v1/crates/foo/owners", input.as_bytes()) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to parse the request body as JSON: owners[1]: expected value at line 1 column 20"}]}"#); // `owners` is not an array @@ -28,7 +27,7 @@ async fn test_owner_change_with_invalid_json() { let response = user .delete_with_body::<()>("/api/v1/crates/foo/owners", input.as_bytes()) .await; - assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + assert_snapshot!(response.status(), @"422 Unprocessable Entity"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize the JSON body into the target type: owners: invalid type: string \"foo\", expected a sequence at line 1 column 16"}]}"#); // missing `owners` and/or `users` fields @@ -36,7 +35,7 @@ async fn test_owner_change_with_invalid_json() { let response = user .delete_with_body::<()>("/api/v1/crates/foo/owners", input.as_bytes()) .await; - assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + assert_snapshot!(response.status(), @"422 Unprocessable Entity"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize the JSON body into the target type: missing field `owners` at line 1 column 2"}]}"#); } @@ -46,7 +45,7 @@ async fn test_unknown_crate() { app.db_new_user("bar").await; let response = user.remove_named_owner("unknown", "bar").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown` does not exist"}]}"#); } @@ -60,7 +59,7 @@ async fn test_unknown_user() { .await; let response = cookie.remove_named_owner("foo", "unknown").await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"could not find owner with login `unknown`"}]}"#); } @@ -76,7 +75,7 @@ async fn test_unknown_team() { let response = cookie .remove_named_owner("foo", "github:unknown:unknown") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"could not find owner with login `github:unknown:unknown`"}]}"#); } @@ -100,7 +99,7 @@ async fn test_remove_uppercase_user() { .unwrap(); let response = cookie.remove_named_owner("foo", "USER2").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"owners successfully removed","ok":true}"#); } @@ -151,11 +150,11 @@ async fn test_remove_uppercase_team() { .await; let response = cookie.add_named_owner("crate42", "github:org:team").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let response = cookie .remove_named_owner("crate42", "github:ORG:TEAM") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"owners successfully removed","ok":true}"#); } diff --git a/src/tests/routes/crates/read.rs b/src/tests/routes/crates/read.rs index 3a3a888da28..51155cf57f0 100644 --- a/src/tests/routes/crates/read.rs +++ b/src/tests/routes/crates/read.rs @@ -37,7 +37,7 @@ async fn show() { .unwrap(); let response = anon.get::<()>("/api/v1/crates/foo_show").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -69,7 +69,7 @@ async fn show_minimal() { let response = anon .get::<()>("/api/v1/crates/foo_show_minimal?include=") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -95,7 +95,7 @@ async fn show_all_yanked() { .await; let response = anon.get::<()>("/api/v1/crates/foo_show").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -110,7 +110,7 @@ async fn test_missing() { let (_, anon) = TestApp::init().empty().await; let response = anon.get::<()>("/api/v1/crates/missing").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `missing` does not exist"}]}"#); } @@ -172,7 +172,7 @@ async fn test_new_name() { .await; let response = anon.get::<()>("/api/v1/crates/new?include=").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", @@ -201,7 +201,7 @@ async fn test_include_default_version() { let response = anon .get::<()>("/api/v1/crates/foo_default_version?include=default_version") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".crate.created_at" => "[datetime]", ".crate.updated_at" => "[datetime]", diff --git a/src/tests/routes/crates/reverse_dependencies.rs b/src/tests/routes/crates/reverse_dependencies.rs index 1889c556649..4944a95c75c 100644 --- a/src/tests/routes/crates/reverse_dependencies.rs +++ b/src/tests/routes/crates/reverse_dependencies.rs @@ -1,6 +1,5 @@ use crate::tests::builders::{CrateBuilder, VersionBuilder}; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] @@ -26,7 +25,7 @@ async fn reverse_dependencies() { let response = anon .get::<()>("/api/v1/crates/c1/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -36,7 +35,7 @@ async fn reverse_dependencies() { let response = anon .get::<()>("/api/v1/crates/c2/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -63,7 +62,7 @@ async fn reverse_dependencies_when_old_version_doesnt_depend_but_new_does() { let response = anon .get::<()>("/api/v1/crates/c1/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -90,7 +89,7 @@ async fn reverse_dependencies_when_old_version_depended_but_new_doesnt() { let response = anon .get::<()>("/api/v1/crates/c1/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -122,7 +121,7 @@ async fn prerelease_versions_not_included_in_reverse_dependencies() { let response = anon .get::<()>("/api/v1/crates/c1/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -149,7 +148,7 @@ async fn yanked_versions_not_included_in_reverse_dependencies() { let response = anon .get::<()>("/api/v1/crates/c1/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -168,7 +167,7 @@ async fn yanked_versions_not_included_in_reverse_dependencies() { let response = anon .get::<()>("/api/v1/crates/c1/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -212,7 +211,7 @@ async fn reverse_dependencies_includes_published_by_user_when_present() { let response = anon .get::<()>("/api/v1/crates/c1/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -241,7 +240,7 @@ async fn reverse_dependencies_query_supports_u64_version_number_parts() { let response = anon .get::<()>("/api/v1/crates/c1/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -255,6 +254,6 @@ async fn test_unknown_crate() { let response = anon .get::<()>("/api/v1/crates/unknown/reverse_dependencies") .await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown` does not exist"}]}"#); } diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__downloads__crate_downloads.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__downloads__crate_downloads-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__downloads__crate_downloads.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__downloads__crate_downloads-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__downloads__version_downloads.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__downloads__version_downloads-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__downloads__version_downloads.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__downloads__version_downloads-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__include_default_version.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__include_default_version-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__include_default_version.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__include_default_version-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__new_name.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__new_name-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__new_name.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__new_name-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show_all_yanked.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show_all_yanked-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show_all_yanked.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show_all_yanked-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show_minimal.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show_minimal-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show_minimal.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__read__show_minimal-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__prerelease_versions_not_included_in_reverse_dependencies.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__prerelease_versions_not_included_in_reverse_dependencies-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__prerelease_versions_not_included_in_reverse_dependencies.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__prerelease_versions_not_included_in_reverse_dependencies-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies-2.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies-2.snap index 751b7731de2..7ca7deae51e 100644 --- a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies-2.snap +++ b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies-2.snap @@ -3,9 +3,61 @@ source: src/tests/routes/crates/reverse_dependencies.rs expression: response.json() --- { - "dependencies": [], + "dependencies": [ + { + "crate_id": "c1", + "default_features": false, + "downloads": 0, + "features": [], + "id": 2, + "kind": "normal", + "optional": false, + "req": ">= 0", + "target": null, + "version_id": 3 + } + ], "meta": { - "total": 0 + "total": 1 }, - "versions": [] + "versions": [ + { + "audit_actions": [], + "bin_names": null, + "checksum": " ", + "crate": "c2", + "crate_size": 0, + "created_at": "[datetime]", + "description": null, + "dl_path": "/api/v1/crates/c2/1.1.0/download", + "documentation": null, + "downloads": 0, + "edition": null, + "features": {}, + "has_lib": null, + "homepage": null, + "id": 3, + "lib_links": null, + "license": null, + "links": { + "authors": "/api/v1/crates/c2/1.1.0/authors", + "dependencies": "/api/v1/crates/c2/1.1.0/dependencies", + "version_downloads": "/api/v1/crates/c2/1.1.0/downloads" + }, + "num": "1.1.0", + "published_by": { + "avatar": null, + "id": 1, + "login": "foo", + "name": null, + "url": "https://github.com/foo" + }, + "readme_path": "/api/v1/crates/c2/1.1.0/readme", + "repository": null, + "rust_version": null, + "updated_at": "[datetime]", + "yank_message": null, + "yanked": false + } + ] } diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_depended_but_new_doesnt.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies-4.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_depended_but_new_doesnt.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies-4.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies.snap deleted file mode 100644 index 7ca7deae51e..00000000000 --- a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies.snap +++ /dev/null @@ -1,63 +0,0 @@ ---- -source: src/tests/routes/crates/reverse_dependencies.rs -expression: response.json() ---- -{ - "dependencies": [ - { - "crate_id": "c1", - "default_features": false, - "downloads": 0, - "features": [], - "id": 2, - "kind": "normal", - "optional": false, - "req": ">= 0", - "target": null, - "version_id": 3 - } - ], - "meta": { - "total": 1 - }, - "versions": [ - { - "audit_actions": [], - "bin_names": null, - "checksum": " ", - "crate": "c2", - "crate_size": 0, - "created_at": "[datetime]", - "description": null, - "dl_path": "/api/v1/crates/c2/1.1.0/download", - "documentation": null, - "downloads": 0, - "edition": null, - "features": {}, - "has_lib": null, - "homepage": null, - "id": 3, - "lib_links": null, - "license": null, - "links": { - "authors": "/api/v1/crates/c2/1.1.0/authors", - "dependencies": "/api/v1/crates/c2/1.1.0/dependencies", - "version_downloads": "/api/v1/crates/c2/1.1.0/downloads" - }, - "num": "1.1.0", - "published_by": { - "avatar": null, - "id": 1, - "login": "foo", - "name": null, - "url": "https://github.com/foo" - }, - "readme_path": "/api/v1/crates/c2/1.1.0/readme", - "repository": null, - "rust_version": null, - "updated_at": "[datetime]", - "yank_message": null, - "yanked": false - } - ] -} diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_includes_published_by_user_when_present.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_includes_published_by_user_when_present-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_includes_published_by_user_when_present.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_includes_published_by_user_when_present-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_query_supports_u64_version_number_parts.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_query_supports_u64_version_number_parts-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_query_supports_u64_version_number_parts.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_query_supports_u64_version_number_parts-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_depended_but_new_doesnt-2.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_depended_but_new_doesnt-2.snap new file mode 100644 index 00000000000..751b7731de2 --- /dev/null +++ b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_depended_but_new_doesnt-2.snap @@ -0,0 +1,11 @@ +--- +source: src/tests/routes/crates/reverse_dependencies.rs +expression: response.json() +--- +{ + "dependencies": [], + "meta": { + "total": 0 + }, + "versions": [] +} diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_doesnt_depend_but_new_does.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_doesnt_depend_but_new_does-2.snap similarity index 100% rename from src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_doesnt_depend_but_new_does.snap rename to src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__reverse_dependencies_when_old_version_doesnt_depend_but_new_does-2.snap diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies-2.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies-2.snap index 751b7731de2..6e17a2fbc8f 100644 --- a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies-2.snap +++ b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies-2.snap @@ -3,9 +3,61 @@ source: src/tests/routes/crates/reverse_dependencies.rs expression: response.json() --- { - "dependencies": [], + "dependencies": [ + { + "crate_id": "c1", + "default_features": false, + "downloads": 0, + "features": [], + "id": 1, + "kind": "normal", + "optional": false, + "req": ">= 0", + "target": null, + "version_id": 3 + } + ], "meta": { - "total": 0 + "total": 1 }, - "versions": [] + "versions": [ + { + "audit_actions": [], + "bin_names": null, + "checksum": " ", + "crate": "c2", + "crate_size": 0, + "created_at": "[datetime]", + "description": null, + "dl_path": "/api/v1/crates/c2/2.0.0/download", + "documentation": null, + "downloads": 0, + "edition": null, + "features": {}, + "has_lib": null, + "homepage": null, + "id": 3, + "lib_links": null, + "license": null, + "links": { + "authors": "/api/v1/crates/c2/2.0.0/authors", + "dependencies": "/api/v1/crates/c2/2.0.0/dependencies", + "version_downloads": "/api/v1/crates/c2/2.0.0/downloads" + }, + "num": "2.0.0", + "published_by": { + "avatar": null, + "id": 1, + "login": "foo", + "name": null, + "url": "https://github.com/foo" + }, + "readme_path": "/api/v1/crates/c2/2.0.0/readme", + "repository": null, + "rust_version": null, + "updated_at": "[datetime]", + "yank_message": null, + "yanked": false + } + ] } diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies-4.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies-4.snap new file mode 100644 index 00000000000..751b7731de2 --- /dev/null +++ b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies-4.snap @@ -0,0 +1,11 @@ +--- +source: src/tests/routes/crates/reverse_dependencies.rs +expression: response.json() +--- +{ + "dependencies": [], + "meta": { + "total": 0 + }, + "versions": [] +} diff --git a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies.snap b/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies.snap deleted file mode 100644 index 6e17a2fbc8f..00000000000 --- a/src/tests/routes/crates/snapshots/crates_io__tests__routes__crates__reverse_dependencies__yanked_versions_not_included_in_reverse_dependencies.snap +++ /dev/null @@ -1,63 +0,0 @@ ---- -source: src/tests/routes/crates/reverse_dependencies.rs -expression: response.json() ---- -{ - "dependencies": [ - { - "crate_id": "c1", - "default_features": false, - "downloads": 0, - "features": [], - "id": 1, - "kind": "normal", - "optional": false, - "req": ">= 0", - "target": null, - "version_id": 3 - } - ], - "meta": { - "total": 1 - }, - "versions": [ - { - "audit_actions": [], - "bin_names": null, - "checksum": " ", - "crate": "c2", - "crate_size": 0, - "created_at": "[datetime]", - "description": null, - "dl_path": "/api/v1/crates/c2/2.0.0/download", - "documentation": null, - "downloads": 0, - "edition": null, - "features": {}, - "has_lib": null, - "homepage": null, - "id": 3, - "lib_links": null, - "license": null, - "links": { - "authors": "/api/v1/crates/c2/2.0.0/authors", - "dependencies": "/api/v1/crates/c2/2.0.0/dependencies", - "version_downloads": "/api/v1/crates/c2/2.0.0/downloads" - }, - "num": "2.0.0", - "published_by": { - "avatar": null, - "id": 1, - "login": "foo", - "name": null, - "url": "https://github.com/foo" - }, - "readme_path": "/api/v1/crates/c2/2.0.0/readme", - "repository": null, - "rust_version": null, - "updated_at": "[datetime]", - "yank_message": null, - "yanked": false - } - ] -} diff --git a/src/tests/routes/crates/versions/dependencies.rs b/src/tests/routes/crates/versions/dependencies.rs index ecd6707afc7..34be8a21db9 100644 --- a/src/tests/routes/crates/versions/dependencies.rs +++ b/src/tests/routes/crates/versions/dependencies.rs @@ -1,7 +1,6 @@ use crate::tests::builders::{CrateBuilder, VersionBuilder}; use crate::tests::util::{RequestHelper, TestApp}; use crate::views::EncodableDependency; -use http::StatusCode; use insta::assert_snapshot; #[derive(Deserialize)] @@ -35,12 +34,12 @@ async fn dependencies() { let response = anon .get::<()>("/api/v1/crates/missing-crate/1.0.0/dependencies") .await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `missing-crate` does not exist"}]}"#); let response = anon .get::<()>("/api/v1/crates/foo_deps/1.0.2/dependencies") .await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `foo_deps` does not have a version `1.0.2`"}]}"#); } diff --git a/src/tests/routes/crates/versions/list.rs b/src/tests/routes/crates/versions/list.rs index 0d36a4d0382..4ce3867c536 100644 --- a/src/tests/routes/crates/versions/list.rs +++ b/src/tests/routes/crates/versions/list.rs @@ -5,7 +5,6 @@ use crate::views::EncodableVersion; use diesel::{prelude::*, update}; use diesel_async::RunQueryDsl; use googletest::prelude::*; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; use serde_json::json; @@ -32,7 +31,7 @@ async fn versions() -> anyhow::Result<()> { .await?; let response = anon.get::<()>("/api/v1/crates/foo_versions/versions").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".versions[].created_at" => "[datetime]", ".versions[].updated_at" => "[datetime]", @@ -46,7 +45,7 @@ async fn test_unknown_crate() { let (_, anon) = TestApp::init().empty().await; let response = anon.get::<()>("/api/v1/crates/unknown/versions").await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"crate `unknown` does not exist"}]}"#); } @@ -408,20 +407,20 @@ async fn invalid_seek_parameter() { let response = anon .get_with_query::<()>(url, "per_page=1&sort=semver&seek=broken") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid seek parameter"}]}"#); // Sort by date let response = anon .get_with_query::<()>(url, "per_page=1&sort=date&seek=broken") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid seek parameter"}]}"#); // broken seek but without per_page parameter should be ok // since it's not consider as seek-based pagination let response = anon.get_with_query::<()>(url, "seek=broken").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); } #[derive(Debug, Deserialize)] diff --git a/src/tests/routes/crates/versions/snapshots/crates_io__tests__routes__crates__versions__list__versions.snap b/src/tests/routes/crates/versions/snapshots/crates_io__tests__routes__crates__versions__list__versions-2.snap similarity index 100% rename from src/tests/routes/crates/versions/snapshots/crates_io__tests__routes__crates__versions__list__versions.snap rename to src/tests/routes/crates/versions/snapshots/crates_io__tests__routes__crates__versions__list__versions-2.snap diff --git a/src/tests/routes/crates/versions/yank_unyank.rs b/src/tests/routes/crates/versions/yank_unyank.rs index 233cd5a08dc..a801c4ce5e7 100644 --- a/src/tests/routes/crates/versions/yank_unyank.rs +++ b/src/tests/routes/crates/versions/yank_unyank.rs @@ -1,7 +1,6 @@ use crate::tests::builders::{CrateBuilder, PublishBuilder}; use crate::tests::util::{RequestHelper, Response, TestApp}; use crate::tests::{OkBool, VersionResponse}; -use http::StatusCode; use insta::assert_snapshot; use serde_json::json; @@ -74,7 +73,7 @@ async fn yank_by_a_non_owner_fails() { .await; let response = token.yank("foo_not", "1.0.0").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"must already be an owner to yank or unyank"}]}"#); } @@ -163,12 +162,12 @@ mod auth { let (app, client, _) = prepare().await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); assert!(!is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); assert!(!is_yanked(&app).await); } @@ -178,12 +177,12 @@ mod auth { let (app, _, client) = prepare().await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(!is_yanked(&app).await); } @@ -194,12 +193,12 @@ mod auth { let client = client.db_new_token("test-token").await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(!is_yanked(&app).await); } @@ -214,12 +213,12 @@ mod auth { .await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(!is_yanked(&app).await); } @@ -234,12 +233,12 @@ mod auth { .await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"authentication failed"}]}"#); assert!(!is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"authentication failed"}]}"#); assert!(!is_yanked(&app).await); } @@ -252,12 +251,12 @@ mod auth { .await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(!is_yanked(&app).await); } @@ -275,12 +274,12 @@ mod auth { .await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this token does not have the required permissions to perform this action"}]}"#); assert!(!is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this token does not have the required permissions to perform this action"}]}"#); assert!(!is_yanked(&app).await); } @@ -298,12 +297,12 @@ mod auth { .await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(!is_yanked(&app).await); } @@ -322,12 +321,12 @@ mod auth { .await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(!is_yanked(&app).await); } @@ -345,12 +344,12 @@ mod auth { .await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this token does not have the required permissions to perform this action"}]}"#); assert!(!is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this token does not have the required permissions to perform this action"}]}"#); assert!(!is_yanked(&app).await); } @@ -368,12 +367,12 @@ mod auth { .await; let response = client.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this token does not have the required permissions to perform this action"}]}"#); assert!(!is_yanked(&app).await); let response = client.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this token does not have the required permissions to perform this action"}]}"#); assert!(!is_yanked(&app).await); } @@ -392,12 +391,12 @@ mod auth { .unwrap(); let response = admin.yank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(is_yanked(&app).await); let response = admin.unyank(CRATE_NAME, CRATE_VERSION).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); assert!(!is_yanked(&app).await); } diff --git a/src/tests/routes/keywords/read.rs b/src/tests/routes/keywords/read.rs index 636a26c34ca..80f151cd0da 100644 --- a/src/tests/routes/keywords/read.rs +++ b/src/tests/routes/keywords/read.rs @@ -2,7 +2,7 @@ use crate::models::Keyword; use crate::tests::builders::CrateBuilder; use crate::tests::util::{RequestHelper, TestApp}; use crate::views::EncodableKeyword; -use http::StatusCode; +use insta::assert_snapshot; #[derive(Deserialize)] struct GoodKeyword { @@ -16,7 +16,7 @@ async fn show() -> anyhow::Result<()> { let mut conn = app.db_conn().await; let response = anon.get::<()>(url).await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); Keyword::find_or_create_all(&mut conn, &["foo"]).await?; @@ -33,7 +33,7 @@ async fn uppercase() -> anyhow::Result<()> { let mut conn = app.db_conn().await; let response = anon.get::<()>(url).await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); Keyword::find_or_create_all(&mut conn, &["UPPER"]).await?; diff --git a/src/tests/routes/me/get.rs b/src/tests/routes/me/get.rs index 4877ea4e840..e8818833cfd 100644 --- a/src/tests/routes/me/get.rs +++ b/src/tests/routes/me/get.rs @@ -1,7 +1,6 @@ use crate::tests::builders::CrateBuilder; use crate::tests::util::{RequestHelper, TestApp}; use crate::views::{EncodablePrivateUser, OwnedCrate}; -use http::StatusCode; use insta::{assert_json_snapshot, assert_snapshot}; impl crate::tests::util::MockCookieUser { @@ -23,11 +22,11 @@ async fn me() { let mut conn = app.db_conn().await; let response = anon.get::<()>("/api/v1/me").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); let response = user.get::<()>("/api/v1/me").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json()); CrateBuilder::new("foo_my_packages", user.as_model().id) @@ -35,7 +34,7 @@ async fn me() { .await; let response = user.get::<()>("/api/v1/me").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json()); } diff --git a/src/tests/routes/me/snapshots/crates_io__tests__routes__me__get__me-2.snap b/src/tests/routes/me/snapshots/crates_io__tests__routes__me__get__me-4.snap similarity index 100% rename from src/tests/routes/me/snapshots/crates_io__tests__routes__me__get__me-2.snap rename to src/tests/routes/me/snapshots/crates_io__tests__routes__me__get__me-4.snap diff --git a/src/tests/routes/me/snapshots/crates_io__tests__routes__me__get__me-3.snap b/src/tests/routes/me/snapshots/crates_io__tests__routes__me__get__me-6.snap similarity index 100% rename from src/tests/routes/me/snapshots/crates_io__tests__routes__me__get__me-3.snap rename to src/tests/routes/me/snapshots/crates_io__tests__routes__me__get__me-6.snap diff --git a/src/tests/routes/me/tokens/create.rs b/src/tests/routes/me/tokens/create.rs index d271c90c90f..856c8f18e5d 100644 --- a/src/tests/routes/me/tokens/create.rs +++ b/src/tests/routes/me/tokens/create.rs @@ -5,7 +5,6 @@ use crate::tests::util::{RequestHelper, TestApp}; use diesel::prelude::*; use diesel_async::RunQueryDsl; use googletest::prelude::*; -use http::StatusCode; use insta::assert_snapshot; use serde_json::{Value, json}; @@ -15,7 +14,7 @@ static NEW_BAR: &[u8] = br#"{ "api_token": { "name": "bar" } }"#; async fn create_token_logged_out() { let (_, anon) = TestApp::init().empty().await; let response = anon.put::<()>("/api/v1/me/tokens", NEW_BAR).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); } #[tokio::test(flavor = "multi_thread")] @@ -23,7 +22,7 @@ async fn create_token_invalid_request() { let (app, _, user) = TestApp::init().with_user().await; let invalid: &[u8] = br#"{ "name": "" }"#; let response = user.put::<()>("/api/v1/me/tokens", invalid).await; - assert_eq!(response.status(), StatusCode::UNPROCESSABLE_ENTITY); + assert_snapshot!(response.status(), @"422 Unprocessable Entity"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize the JSON body into the target type: missing field `api_token` at line 1 column 14"}]}"#); assert!(app.emails().await.is_empty()); } @@ -33,7 +32,7 @@ async fn create_token_no_name() { let (app, _, user) = TestApp::init().with_user().await; let empty_name: &[u8] = br#"{ "api_token": { "name": "" } }"#; let response = user.put::<()>("/api/v1/me/tokens", empty_name).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"name must have a value"}]}"#); assert!(app.emails().await.is_empty()); } @@ -51,7 +50,7 @@ async fn create_token_exceeded_tokens_per_user() { } let response = user.put::<()>("/api/v1/me/tokens", NEW_BAR).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"maximum tokens per user is: 500"}]}"#); assert!(app.emails().await.is_empty()); } @@ -62,7 +61,7 @@ async fn create_token_success() { let mut conn = app.db_conn().await; let response = user.put::<()>("/api/v1/me/tokens", NEW_BAR).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".api_token.id" => insta::any_id_redaction(), ".api_token.created_at" => "[datetime]", @@ -117,7 +116,7 @@ async fn cannot_create_token_with_token() { br#"{ "api_token": { "name": "baz" } }"# as &[u8], ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"cannot use an API token to create a new API token"}]}"#); assert!(app.emails().await.is_empty()); } @@ -138,7 +137,7 @@ async fn create_token_with_scopes() { let response = user .put::<()>("/api/v1/me/tokens", serde_json::to_vec(&json).unwrap()) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".api_token.id" => insta::any_id_redaction(), ".api_token.created_at" => "[datetime]", @@ -188,7 +187,7 @@ async fn create_token_with_null_scopes() { let response = user .put::<()>("/api/v1/me/tokens", serde_json::to_vec(&json).unwrap()) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".api_token.id" => insta::any_id_redaction(), ".api_token.created_at" => "[datetime]", @@ -228,7 +227,7 @@ async fn create_token_with_empty_crate_scope() { let response = user .put::<()>("/api/v1/me/tokens", serde_json::to_vec(&json).unwrap()) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid crate scope"}]}"#); assert!(app.emails().await.is_empty()); } @@ -248,7 +247,7 @@ async fn create_token_with_invalid_endpoint_scope() { let response = user .put::<()>("/api/v1/me/tokens", serde_json::to_vec(&json).unwrap()) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid endpoint scope"}]}"#); assert!(app.emails().await.is_empty()); } @@ -269,7 +268,7 @@ async fn create_token_with_expiry_date() { let response = user .put::<()>("/api/v1/me/tokens", serde_json::to_vec(&json).unwrap()) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".api_token.id" => insta::any_id_redaction(), ".api_token.created_at" => "[datetime]", diff --git a/src/tests/routes/me/tokens/delete_current.rs b/src/tests/routes/me/tokens/delete_current.rs index 755ef0b0803..6db821fb85a 100644 --- a/src/tests/routes/me/tokens/delete_current.rs +++ b/src/tests/routes/me/tokens/delete_current.rs @@ -3,7 +3,6 @@ use crate::schema::api_tokens; use crate::tests::util::{RequestHelper, TestApp}; use diesel::prelude::*; use diesel_async::RunQueryDsl; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -25,7 +24,7 @@ async fn revoke_current_token_success() { // Revoke the token let response = token.delete::<()>("/api/v1/tokens/current").await; - assert_eq!(response.status(), StatusCode::NO_CONTENT); + assert_snapshot!(response.status(), @"204 No Content"); // Ensure that the token was removed from the database @@ -44,7 +43,7 @@ async fn revoke_current_token_without_auth() { let (_, anon) = TestApp::init().empty().await; let response = anon.delete::<()>("/api/v1/tokens/current").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); } @@ -67,7 +66,7 @@ async fn revoke_current_token_with_cookie_user() { // Revoke the token let response = user.delete::<()>("/api/v1/tokens/current").await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"token not provided"}]}"#); // Ensure that the token still exists in the database after the failed request diff --git a/src/tests/routes/me/tokens/get.rs b/src/tests/routes/me/tokens/get.rs index 06a1316ba83..dbf7db69dc5 100644 --- a/src/tests/routes/me/tokens/get.rs +++ b/src/tests/routes/me/tokens/get.rs @@ -1,15 +1,14 @@ use crate::models::token::{CrateScope, EndpointScope, NewApiToken}; use crate::tests::util::{RequestHelper, TestApp}; use chrono::{Duration, Utc}; -use http::StatusCode; -use insta::assert_json_snapshot; +use insta::{assert_json_snapshot, assert_snapshot}; #[tokio::test(flavor = "multi_thread")] async fn show_token_non_existing() { let url = "/api/v1/me/tokens/10086"; let (_, _, user, _) = TestApp::init().with_token().await; let response = user.get::<()>(url).await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); } #[tokio::test(flavor = "multi_thread")] @@ -18,7 +17,7 @@ async fn show() { let token = token.as_model(); let url = format!("/api/v1/me/tokens/{}", token.id); let response = user.get::<()>(&url).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".api_token.created_at" => "[datetime]", }); @@ -48,7 +47,7 @@ async fn show_token_with_scopes() { let url = format!("/api/v1/me/tokens/{}", token.id); let response = user.get::<()>(&url).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".api_token.created_at" => "[datetime]", ".api_token.expired_at" => "[datetime]", @@ -60,7 +59,7 @@ async fn show_with_anonymous_user() { let url = "/api/v1/me/tokens/1"; let (_, anon) = TestApp::init().empty().await; let response = anon.get::<()>(url).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); } #[tokio::test(flavor = "multi_thread")] @@ -75,5 +74,5 @@ async fn show_other_user_token() { let url = format!("/api/v1/me/tokens/{}", token.id); let response = user1.get::<()>(&url).await; - assert_eq!(response.status(), StatusCode::NOT_FOUND); + assert_snapshot!(response.status(), @"404 Not Found"); } diff --git a/src/tests/routes/me/tokens/list.rs b/src/tests/routes/me/tokens/list.rs index daa2d73a69a..a17c8efd4e4 100644 --- a/src/tests/routes/me/tokens/list.rs +++ b/src/tests/routes/me/tokens/list.rs @@ -2,7 +2,6 @@ use crate::models::token::{CrateScope, EndpointScope, NewApiToken}; use crate::tests::util::insta::{self, assert_json_snapshot}; use crate::tests::util::{RequestHelper, TestApp}; use chrono::{Duration, Utc}; -use http::StatusCode; use insta::assert_snapshot; use serde_json::json; @@ -10,21 +9,21 @@ use serde_json::json; async fn list_logged_out() { let (_, anon) = TestApp::init().empty().await; let response = anon.get::<()>("/api/v1/me/tokens").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); } #[tokio::test(flavor = "multi_thread")] async fn list_with_api_token_is_forbidden() { let (_, _, _, token) = TestApp::init().with_token().await; let response = token.get::<()>("/api/v1/me/tokens").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); } #[tokio::test(flavor = "multi_thread")] async fn list_empty() { let (_, _, user) = TestApp::init().with_user().await; let response = user.get::<()>("/api/v1/me/tokens").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"api_tokens":[]}"#); } @@ -56,7 +55,7 @@ async fn list_tokens() { assert_ok!(new_token.insert(&mut conn).await); let response = user.get::<()>("/api/v1/me/tokens").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_json_snapshot!(response.json(), { ".api_tokens[].id" => insta::any_id_redaction(), ".api_tokens[].created_at" => "[datetime]", @@ -98,7 +97,7 @@ async fn list_recently_expired_tokens() { assert_ok!(new_token.insert(&mut conn).await); let response = user.get::<()>("/api/v1/me/tokens?expired_days=30").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let json = response.json(); let response_tokens = json["api_tokens"].as_array().unwrap(); assert_eq!(response_tokens.len(), 2); @@ -106,7 +105,7 @@ async fn list_recently_expired_tokens() { assert_response_tokens_contain_name(response_tokens, "recent"); let response = user.get::<()>("/api/v1/me/tokens?expired_days=60").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let json = response.json(); let response_tokens = json["api_tokens"].as_array().unwrap(); assert_eq!(response_tokens.len(), 3); @@ -129,7 +128,7 @@ async fn list_tokens_exclude_revoked() { // List tokens expecting them all to be there. let response = user.get::<()>("/api/v1/me/tokens").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let json = response.json(); let response_tokens = json["api_tokens"].as_array().unwrap(); assert_eq!(response_tokens.len(), 2); @@ -138,11 +137,11 @@ async fn list_tokens_exclude_revoked() { let response = user .delete::<()>(&format!("/api/v1/me/tokens/{}", token1.id)) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // Check that we now have one less token being listed. let response = user.get::<()>("/api/v1/me/tokens").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); let json = response.json(); let response_tokens = json["api_tokens"].as_array().unwrap(); assert_eq!(response_tokens.len(), 1); diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success-2.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success-2.snap index 4c3cc750688..ddee7add8e0 100644 --- a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success-2.snap +++ b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success-2.snap @@ -1,15 +1,16 @@ --- source: src/tests/routes/me/tokens/create.rs -expression: app.emails_snapshot().await +expression: response.json() --- -To: foo@example.com -From: crates.io -Subject: crates.io: New API token "bar" created -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: quoted-printable - -Hello foo! - -A new API token with the name "bar" was recently added to your crates.io account. - -If this wasn't you, you should revoke the token immediately: https://crates.io/settings/tokens +{ + "api_token": { + "crate_scopes": null, + "created_at": "[datetime]", + "endpoint_scopes": null, + "expired_at": null, + "id": "[id]", + "last_used_at": "[datetime]", + "name": "bar", + "token": "[token]" + } +} diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success-3.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success-3.snap new file mode 100644 index 00000000000..4c3cc750688 --- /dev/null +++ b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success-3.snap @@ -0,0 +1,15 @@ +--- +source: src/tests/routes/me/tokens/create.rs +expression: app.emails_snapshot().await +--- +To: foo@example.com +From: crates.io +Subject: crates.io: New API token "bar" created +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +Hello foo! + +A new API token with the name "bar" was recently added to your crates.io account. + +If this wasn't you, you should revoke the token immediately: https://crates.io/settings/tokens diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success.snap deleted file mode 100644 index ddee7add8e0..00000000000 --- a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_success.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: src/tests/routes/me/tokens/create.rs -expression: response.json() ---- -{ - "api_token": { - "crate_scopes": null, - "created_at": "[datetime]", - "endpoint_scopes": null, - "expired_at": null, - "id": "[id]", - "last_used_at": "[datetime]", - "name": "bar", - "token": "[token]" - } -} diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date-2.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date-2.snap index 4c3cc750688..dc8ec84abad 100644 --- a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date-2.snap +++ b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date-2.snap @@ -1,15 +1,16 @@ --- source: src/tests/routes/me/tokens/create.rs -expression: app.emails_snapshot().await +expression: response.json() --- -To: foo@example.com -From: crates.io -Subject: crates.io: New API token "bar" created -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: quoted-printable - -Hello foo! - -A new API token with the name "bar" was recently added to your crates.io account. - -If this wasn't you, you should revoke the token immediately: https://crates.io/settings/tokens +{ + "api_token": { + "crate_scopes": null, + "created_at": "[datetime]", + "endpoint_scopes": null, + "expired_at": "2024-12-24T07:34:56Z", + "id": "[id]", + "last_used_at": "[datetime]", + "name": "bar", + "token": "[token]" + } +} diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date-3.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date-3.snap new file mode 100644 index 00000000000..4c3cc750688 --- /dev/null +++ b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date-3.snap @@ -0,0 +1,15 @@ +--- +source: src/tests/routes/me/tokens/create.rs +expression: app.emails_snapshot().await +--- +To: foo@example.com +From: crates.io +Subject: crates.io: New API token "bar" created +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +Hello foo! + +A new API token with the name "bar" was recently added to your crates.io account. + +If this wasn't you, you should revoke the token immediately: https://crates.io/settings/tokens diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date.snap deleted file mode 100644 index dc8ec84abad..00000000000 --- a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_expiry_date.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: src/tests/routes/me/tokens/create.rs -expression: response.json() ---- -{ - "api_token": { - "crate_scopes": null, - "created_at": "[datetime]", - "endpoint_scopes": null, - "expired_at": "2024-12-24T07:34:56Z", - "id": "[id]", - "last_used_at": "[datetime]", - "name": "bar", - "token": "[token]" - } -} diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes-2.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes-2.snap index 4c3cc750688..ddee7add8e0 100644 --- a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes-2.snap +++ b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes-2.snap @@ -1,15 +1,16 @@ --- source: src/tests/routes/me/tokens/create.rs -expression: app.emails_snapshot().await +expression: response.json() --- -To: foo@example.com -From: crates.io -Subject: crates.io: New API token "bar" created -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: quoted-printable - -Hello foo! - -A new API token with the name "bar" was recently added to your crates.io account. - -If this wasn't you, you should revoke the token immediately: https://crates.io/settings/tokens +{ + "api_token": { + "crate_scopes": null, + "created_at": "[datetime]", + "endpoint_scopes": null, + "expired_at": null, + "id": "[id]", + "last_used_at": "[datetime]", + "name": "bar", + "token": "[token]" + } +} diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes-3.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes-3.snap new file mode 100644 index 00000000000..4c3cc750688 --- /dev/null +++ b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes-3.snap @@ -0,0 +1,15 @@ +--- +source: src/tests/routes/me/tokens/create.rs +expression: app.emails_snapshot().await +--- +To: foo@example.com +From: crates.io +Subject: crates.io: New API token "bar" created +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +Hello foo! + +A new API token with the name "bar" was recently added to your crates.io account. + +If this wasn't you, you should revoke the token immediately: https://crates.io/settings/tokens diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes.snap deleted file mode 100644 index ddee7add8e0..00000000000 --- a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_null_scopes.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: src/tests/routes/me/tokens/create.rs -expression: response.json() ---- -{ - "api_token": { - "crate_scopes": null, - "created_at": "[datetime]", - "endpoint_scopes": null, - "expired_at": null, - "id": "[id]", - "last_used_at": "[datetime]", - "name": "bar", - "token": "[token]" - } -} diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes-2.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes-2.snap index 4c3cc750688..2330d746ee9 100644 --- a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes-2.snap +++ b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes-2.snap @@ -1,15 +1,21 @@ --- source: src/tests/routes/me/tokens/create.rs -expression: app.emails_snapshot().await +expression: response.json() --- -To: foo@example.com -From: crates.io -Subject: crates.io: New API token "bar" created -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: quoted-printable - -Hello foo! - -A new API token with the name "bar" was recently added to your crates.io account. - -If this wasn't you, you should revoke the token immediately: https://crates.io/settings/tokens +{ + "api_token": { + "crate_scopes": [ + "tokio", + "tokio-*" + ], + "created_at": "[datetime]", + "endpoint_scopes": [ + "publish-update" + ], + "expired_at": null, + "id": "[id]", + "last_used_at": "[datetime]", + "name": "bar", + "token": "[token]" + } +} diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes-3.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes-3.snap new file mode 100644 index 00000000000..4c3cc750688 --- /dev/null +++ b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes-3.snap @@ -0,0 +1,15 @@ +--- +source: src/tests/routes/me/tokens/create.rs +expression: app.emails_snapshot().await +--- +To: foo@example.com +From: crates.io +Subject: crates.io: New API token "bar" created +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +Hello foo! + +A new API token with the name "bar" was recently added to your crates.io account. + +If this wasn't you, you should revoke the token immediately: https://crates.io/settings/tokens diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes.snap deleted file mode 100644 index 2330d746ee9..00000000000 --- a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__create__create_token_with_scopes.snap +++ /dev/null @@ -1,21 +0,0 @@ ---- -source: src/tests/routes/me/tokens/create.rs -expression: response.json() ---- -{ - "api_token": { - "crate_scopes": [ - "tokio", - "tokio-*" - ], - "created_at": "[datetime]", - "endpoint_scopes": [ - "publish-update" - ], - "expired_at": null, - "id": "[id]", - "last_used_at": "[datetime]", - "name": "bar", - "token": "[token]" - } -} diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__get__show.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__get__show-2.snap similarity index 100% rename from src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__get__show.snap rename to src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__get__show-2.snap diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__get__show_token_with_scopes.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__get__show_token_with_scopes-2.snap similarity index 100% rename from src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__get__show_token_with_scopes.snap rename to src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__get__show_token_with_scopes-2.snap diff --git a/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__list__list_tokens.snap b/src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__list__list_tokens-2.snap similarity index 100% rename from src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__list__list_tokens.snap rename to src/tests/routes/me/tokens/snapshots/crates_io__tests__routes__me__tokens__list__list_tokens-2.snap diff --git a/src/tests/routes/me/updates.rs b/src/tests/routes/me/updates.rs index 5e03c538e76..e5a688ca609 100644 --- a/src/tests/routes/me/updates.rs +++ b/src/tests/routes/me/updates.rs @@ -7,14 +7,13 @@ use diesel::prelude::*; use diesel::update; use diesel_async::RunQueryDsl; use googletest::prelude::*; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] async fn api_token_cannot_get_user_updates() { let (_, _, _, token) = TestApp::init().with_token().await; let response = token.get::<()>("/api/v1/me/updates").await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); } #[tokio::test(flavor = "multi_thread")] @@ -103,6 +102,6 @@ async fn following() { let response = user .get_with_query::<()>("/api/v1/me/updates", "page=0") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize query string: page: invalid value: integer `0`, expected a nonzero u32"}]}"#); } diff --git a/src/tests/routes/session/authorize.rs b/src/tests/routes/session/authorize.rs index 1a3c203677e..6c5168b77dd 100644 --- a/src/tests/routes/session/authorize.rs +++ b/src/tests/routes/session/authorize.rs @@ -1,11 +1,10 @@ use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] async fn access_token_needs_data() { let (_, anon) = TestApp::init().empty().await; let response = anon.get::<()>("/api/private/session/authorize").await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to deserialize query string: missing field `code`"}]}"#); } diff --git a/src/tests/routes/users/update.rs b/src/tests/routes/users/update.rs index c9dd1a3897a..884b1eddab6 100644 --- a/src/tests/routes/users/update.rs +++ b/src/tests/routes/users/update.rs @@ -43,7 +43,7 @@ async fn test_empty_email_not_added() { let model = user.as_model(); let response = user.update_email_more_control(model.id, Some("")).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"empty email rejected"}]}"#); } @@ -55,7 +55,7 @@ async fn test_ignore_empty() { let url = format!("/api/v1/users/{}", model.id); let payload = json!({"user": {}}); let response = user.put::<()>(&url, payload.to_string()).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"ok":true}"#); } @@ -67,7 +67,7 @@ async fn test_ignore_nulls() { let url = format!("/api/v1/users/{}", model.id); let payload = json!({"user": { "email": null }}); let response = user.put::<()>(&url, payload.to_string()).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"ok":true}"#); } @@ -88,7 +88,7 @@ async fn test_other_users_cannot_change_my_email() { Some("pineapple@pineapples.pineapple"), ) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"current user does not match requested user"}]}"#); let response = anon @@ -97,7 +97,7 @@ async fn test_other_users_cannot_change_my_email() { Some("pineapple@pineapples.pineapple"), ) .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this action requires authentication"}]}"#); } @@ -107,7 +107,7 @@ async fn test_invalid_email_address() { let model = user.as_model(); let response = user.update_email_more_control(model.id, Some("foo")).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"invalid email address"}]}"#); } @@ -118,6 +118,6 @@ async fn test_invalid_json() { let url = format!("/api/v1/users/{}", model.id); let response = user.put::<()>(&url, r#"{ "user": foo }"#).await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"Failed to parse the request body as JSON: user: expected ident at line 1 column 12"}]}"#); } diff --git a/src/tests/routes/users/update/publish_notifications.rs b/src/tests/routes/users/update/publish_notifications.rs index efe21533243..e8c731322a5 100644 --- a/src/tests/routes/users/update/publish_notifications.rs +++ b/src/tests/routes/users/update/publish_notifications.rs @@ -1,6 +1,5 @@ use crate::tests::builders::PublishBuilder; use crate::tests::util::{RequestHelper, TestApp}; -use http::StatusCode; use insta::assert_snapshot; use serde_json::json; @@ -13,7 +12,7 @@ async fn test_unsubscribe_and_resubscribe() { // Publish a crate to trigger an initial publish email let pb = PublishBuilder::new("foo", "1.0.0"); let response = token.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // Assert that the user gets an initial publish email assert_snapshot!(app.emails_snapshot().await); @@ -21,7 +20,7 @@ async fn test_unsubscribe_and_resubscribe() { // Unsubscribe from publish notifications let payload = json!({"user": { "publish_notifications": false }}); let response = cookie.put::<()>(&user_url, payload.to_string()).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"ok":true}"#); // Assert that the user gets an unsubscribe email @@ -30,7 +29,7 @@ async fn test_unsubscribe_and_resubscribe() { // Publish the same crate again to check that the user doesn't get a publish email let pb = PublishBuilder::new("foo", "1.1.0"); let response = token.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // Assert that the user did not get a publish email this time assert_snapshot!(app.emails_snapshot().await); @@ -38,13 +37,13 @@ async fn test_unsubscribe_and_resubscribe() { // Resubscribe to publish notifications let payload = json!({"user": { "publish_notifications": true }}); let response = cookie.put::<()>(&user_url, payload.to_string()).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"ok":true}"#); // Publish the same crate again to check that the user doesn't get a publish email let pb = PublishBuilder::new("foo", "1.2.0"); let response = token.publish_crate(pb).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // Assert that the user got a publish email again assert_snapshot!(app.emails_snapshot().await); diff --git a/src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-6.snap b/src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-11.snap similarity index 100% rename from src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-6.snap rename to src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-11.snap diff --git a/src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe.snap b/src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-2.snap similarity index 100% rename from src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe.snap rename to src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-2.snap diff --git a/src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-3.snap b/src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-5.snap similarity index 100% rename from src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-3.snap rename to src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-5.snap diff --git a/src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-4.snap b/src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-7.snap similarity index 100% rename from src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-4.snap rename to src/tests/routes/users/update/snapshots/crates_io__tests__routes__users__update__publish_notifications__unsubscribe_and_resubscribe-7.snap diff --git a/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_for_revoked_token.snap b/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_for_revoked_token-2.snap similarity index 100% rename from src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_for_revoked_token.snap rename to src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_for_revoked_token-2.snap diff --git a/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_for_unknown_token.snap b/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_for_unknown_token-2.snap similarity index 100% rename from src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_for_unknown_token.snap rename to src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_for_unknown_token-2.snap diff --git a/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token-2.snap b/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token-2.snap index a5cd0c30663..222cfadd9fb 100644 --- a/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token-2.snap +++ b/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token-2.snap @@ -1,17 +1,11 @@ --- source: src/tests/github_secret_scanning.rs -expression: app.emails_snapshot().await +expression: response.json() --- -To: foo@example.com -From: crates.io -Subject: crates.io: Your API token "bar" has been revoked -Content-Type: text/plain; charset=utf-8 -Content-Transfer-Encoding: quoted-printable - -GitHub has notified us that your crates.io API token bar has been exposed publicly. We have revoked this token as a precaution. - -Please review your account at https://crates.io to confirm that no unexpected changes have been made to your settings or crates. - -Source type: some_source - -URL where the token was found: some_url +[ + { + "label": "true_positive", + "token_raw": "some_token", + "token_type": "some_type" + } +] diff --git a/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token-3.snap b/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token-3.snap new file mode 100644 index 00000000000..a5cd0c30663 --- /dev/null +++ b/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token-3.snap @@ -0,0 +1,17 @@ +--- +source: src/tests/github_secret_scanning.rs +expression: app.emails_snapshot().await +--- +To: foo@example.com +From: crates.io +Subject: crates.io: Your API token "bar" has been revoked +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable + +GitHub has notified us that your crates.io API token bar has been exposed publicly. We have revoked this token as a precaution. + +Please review your account at https://crates.io to confirm that no unexpected changes have been made to your settings or crates. + +Source type: some_source + +URL where the token was found: some_url diff --git a/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token.snap b/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token.snap deleted file mode 100644 index 222cfadd9fb..00000000000 --- a/src/tests/snapshots/crates_io__tests__github_secret_scanning__github_secret_alert_revokes_token.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: src/tests/github_secret_scanning.rs -expression: response.json() ---- -[ - { - "label": "true_positive", - "token_raw": "some_token", - "token_type": "some_type" - } -] diff --git a/src/tests/snapshots/crates_io__tests__owners__modify_multiple_owners-6.snap b/src/tests/snapshots/crates_io__tests__owners__modify_multiple_owners-10.snap similarity index 100% rename from src/tests/snapshots/crates_io__tests__owners__modify_multiple_owners-6.snap rename to src/tests/snapshots/crates_io__tests__owners__modify_multiple_owners-10.snap diff --git a/src/tests/snapshots/crates_io__tests__read_only_mode__cannot_hit_endpoint_which_writes_db_in_read_only_mode.snap b/src/tests/snapshots/crates_io__tests__read_only_mode__cannot_hit_endpoint_which_writes_db_in_read_only_mode-2.snap similarity index 100% rename from src/tests/snapshots/crates_io__tests__read_only_mode__cannot_hit_endpoint_which_writes_db_in_read_only_mode.snap rename to src/tests/snapshots/crates_io__tests__read_only_mode__cannot_hit_endpoint_which_writes_db_in_read_only_mode-2.snap diff --git a/src/tests/team.rs b/src/tests/team.rs index 34561a20cc0..d0bb994724c 100644 --- a/src/tests/team.rs +++ b/src/tests/team.rs @@ -4,7 +4,6 @@ use crate::tests::{OwnerTeamsResponse, RequestHelper, TestApp, add_team_to_crate use diesel::*; use diesel_async::RunQueryDsl; -use http::StatusCode; use insta::assert_snapshot; impl crate::tests::util::MockAnonymousUser { @@ -32,7 +31,7 @@ async fn not_github() { let response = token .add_named_owner("foo_not_github", "dropbox:foo:foo") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"unknown organization handler, only 'github:org:team' is supported"}]}"#); } @@ -48,7 +47,7 @@ async fn weird_name() { let response = token .add_named_owner("foo_weird_name", "github:foo/../bar:wut") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"organization cannot contain special characters like /"}]}"#); } @@ -63,7 +62,7 @@ async fn one_colon() { .await; let response = token.add_named_owner("foo_one_colon", "github:foo").await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"missing github team argument; format is github:org:team"}]}"#); } @@ -79,7 +78,7 @@ async fn add_nonexistent_team() { let response = token .add_named_owner("foo_add_nonexistent", "github:test-org:this-does-not-exist") .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"could not find the github team test-org/this-does-not-exist. Make sure that you have the right permissions in GitHub. See https://doc.rust-lang.org/cargo/reference/publishing.html#github-permissions"}]}"#); } @@ -199,7 +198,7 @@ async fn add_team_as_non_member() { let response = token .add_named_owner("foo_team_non_member", "github:test-org:core") .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"only members of a team or organization owners can add it as an owner"}]}"#); } @@ -227,7 +226,7 @@ async fn remove_team_as_named_owner() { let response = token_on_both_teams .remove_named_owner("foo_remove_team", username) .await; - assert_eq!(response.status(), StatusCode::BAD_REQUEST); + assert_snapshot!(response.status(), @"400 Bad Request"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"cannot remove all individual owners of a crate. Team member don't have permission to modify owners, so at least one individual owner is required."}]}"#); token_on_both_teams @@ -238,7 +237,7 @@ async fn remove_team_as_named_owner() { let user_on_one_team = app.db_new_user("user-one-team").await; let crate_to_publish = PublishBuilder::new("foo_remove_team", "2.0.0"); let response = user_on_one_team.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this crate exists but you don't seem to be an owner. If you believe this is a mistake, perhaps you need to accept an invitation to be an owner before publishing."}]}"#); } @@ -266,7 +265,7 @@ async fn remove_team_as_team_owner() { let response = token_on_one_team .remove_named_owner("foo_remove_team_owner", "github:test-org:all") .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"team members don't have permission to modify owners"}]}"#); let user_org_owner = app.db_new_user("user-org-owner").await; @@ -274,7 +273,7 @@ async fn remove_team_as_team_owner() { let response = token_org_owner .remove_named_owner("foo_remove_team_owner", "github:test-org:all") .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"only owners have permission to modify owners"}]}"#); } @@ -311,7 +310,7 @@ async fn remove_nonexistent_team() { "github:test-org:this-does-not-exist", ) .await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_snapshot!(response.text(), @r#"{"msg":"owners successfully removed","ok":true}"#); } @@ -338,7 +337,7 @@ async fn publish_not_owned() { let crate_to_publish = PublishBuilder::new("foo_not_owned", "2.0.0"); let response = user_on_one_team.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this crate exists but you don't seem to be an owner. If you believe this is a mistake, perhaps you need to accept an invitation to be an owner before publishing."}]}"#); } @@ -364,7 +363,7 @@ async fn publish_org_owner_owned() { let crate_to_publish = PublishBuilder::new("foo_not_owned", "2.0.0"); let response = user_org_owner.publish_crate(crate_to_publish).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"this crate exists but you don't seem to be an owner. If you believe this is a mistake, perhaps you need to accept an invitation to be an owner before publishing."}]}"#); } @@ -423,7 +422,7 @@ async fn add_owners_as_org_owner() { let response = token_org_owner .add_named_owner("foo_add_owner", "arbitrary_username") .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"only owners have permission to modify owners"}]}"#); } @@ -451,7 +450,7 @@ async fn add_owners_as_team_owner() { let response = token_on_one_team .add_named_owner("foo_add_owner", "arbitrary_username") .await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"team members don't have permission to modify owners"}]}"#); } diff --git a/src/tests/token.rs b/src/tests/token.rs index 39d90c81943..5ce01593067 100644 --- a/src/tests/token.rs +++ b/src/tests/token.rs @@ -3,7 +3,7 @@ use crate::tests::{RequestHelper, TestApp}; use crate::{models::ApiToken, views::EncodableMe}; use diesel::prelude::*; use diesel_async::RunQueryDsl; -use http::{StatusCode, header}; +use http::header; use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] @@ -13,7 +13,7 @@ async fn using_token_updates_last_used_at() { let mut conn = app.db_conn().await; let response = anon.get::<()>(url).await; - assert_eq!(response.status(), StatusCode::FORBIDDEN); + assert_snapshot!(response.status(), @"403 Forbidden"); user.get::(url).await.good(); assert_none!(token.as_model().last_used_at); @@ -41,6 +41,6 @@ async fn old_tokens_give_specific_error_message() { let mut request = anon.get_request(url); request.header(header::AUTHORIZATION, "oldtoken"); let response = anon.run::<()>(request).await; - assert_eq!(response.status(), StatusCode::UNAUTHORIZED); + assert_snapshot!(response.status(), @"401 Unauthorized"); assert_snapshot!(response.text(), @r#"{"errors":[{"detail":"The given API token does not match the format used by crates.io. Tokens generated before 2020-07-14 were generated with an insecure random number generator, and have been revoked. You can generate a new token at https://crates.io/me. For more information please see https://blog.rust-lang.org/2020/07/14/crates-io-security-advisory.html. We apologize for any inconvenience."}]}"#); } diff --git a/src/tests/unhealthy_database.rs b/src/tests/unhealthy_database.rs index 8cf534837df..82dee6d9ca0 100644 --- a/src/tests/unhealthy_database.rs +++ b/src/tests/unhealthy_database.rs @@ -4,7 +4,7 @@ use diesel_async::AsyncPgConnection; use diesel_async::pooled_connection::deadpool::Pool; use googletest::assert_that; use googletest::matchers::ends_with; -use http::StatusCode; +use insta::assert_snapshot; use std::time::{Duration, Instant}; use tracing::info; @@ -36,18 +36,18 @@ async fn http_error_with_unhealthy_database() -> anyhow::Result<()> { let (app, anon) = TestApp::init().with_chaos_proxy().empty().await; let response = anon.get::<()>("/api/v1/summary").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); app.primary_db_chaosproxy().break_networking()?; let response = anon.get::<()>("/api/v1/summary").await; - assert_eq!(response.status(), StatusCode::SERVICE_UNAVAILABLE); + assert_snapshot!(response.status(), @"503 Service Unavailable"); app.primary_db_chaosproxy().restore_networking()?; wait_until_healthy(&app.as_inner().primary_database).await; let response = anon.get::<()>("/api/v1/summary").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); Ok(()) } @@ -65,7 +65,7 @@ async fn download_requests_with_unhealthy_database_succeed() -> anyhow::Result<( app.primary_db_chaosproxy().break_networking()?; let response = anon.get::<()>("/api/v1/crates/foo/1.0.0/download").await; - assert_eq!(response.status(), StatusCode::FOUND); + assert_snapshot!(response.status(), @"302 Found"); let location = assert_some!(response.headers().get("location")); let location = assert_ok!(location.to_str()); @@ -88,7 +88,7 @@ async fn fallback_to_replica_returns_user_info() -> anyhow::Result<()> { // When the primary database is down, requests are forwarded to the replica database let response = owner.get::<()>(URL).await; - assert_eq!(response.status(), 200); + assert_snapshot!(response.status(), @"200 OK"); // restore primary database connection app.primary_db_chaosproxy().restore_networking()?; @@ -112,7 +112,7 @@ async fn restored_replica_returns_user_info() -> anyhow::Result<()> { // When both primary and replica database are down, the request returns an error let response = owner.get::<()>(URL).await; - assert_eq!(response.status(), StatusCode::SERVICE_UNAVAILABLE); + assert_snapshot!(response.status(), @"503 Service Unavailable"); // Once the replica database is restored, it should serve as a fallback again app.replica_db_chaosproxy().restore_networking()?; @@ -124,7 +124,7 @@ async fn restored_replica_returns_user_info() -> anyhow::Result<()> { wait_until_healthy(replica).await; let response = owner.get::<()>(URL).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // restore connection app.primary_db_chaosproxy().restore_networking()?; @@ -148,14 +148,14 @@ async fn restored_primary_returns_user_info() -> anyhow::Result<()> { // When both primary and replica database are down, the request returns an error let response = owner.get::<()>(URL).await; - assert_eq!(response.status(), StatusCode::SERVICE_UNAVAILABLE); + assert_snapshot!(response.status(), @"503 Service Unavailable"); // Once the replica database is restored, it should serve as a fallback again app.primary_db_chaosproxy().restore_networking()?; wait_until_healthy(&app.as_inner().primary_database).await; let response = owner.get::<()>(URL).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); Ok(()) } diff --git a/src/tests/user.rs b/src/tests/user.rs index 678361b3631..b10fb2e30bb 100644 --- a/src/tests/user.rs +++ b/src/tests/user.rs @@ -8,7 +8,7 @@ use chrono::{DateTime, Utc}; use crates_io_github::GitHubUser; use diesel::prelude::*; use diesel_async::RunQueryDsl; -use http::StatusCode; +use insta::assert_snapshot; use secrecy::ExposeSecret; use serde_json::json; @@ -16,7 +16,7 @@ impl crate::tests::util::MockCookieUser { async fn confirm_email(&self, email_token: &str) { let url = format!("/api/v1/confirm/{email_token}"); let response = self.put::<()>(&url, &[] as &[u8]).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); assert_eq!(response.json(), json!({ "ok": true })); } } diff --git a/src/tests/worker/git.rs b/src/tests/worker/git.rs index da00a5c7a48..afd2ab479ff 100644 --- a/src/tests/worker/git.rs +++ b/src/tests/worker/git.rs @@ -5,7 +5,7 @@ use crate::worker::jobs; use crates_io_worker::BackgroundJob; use diesel::prelude::*; use diesel_async::RunQueryDsl; -use http::StatusCode; +use insta::assert_snapshot; #[tokio::test(flavor = "multi_thread")] async fn index_smoke_test() { @@ -17,7 +17,7 @@ async fn index_smoke_test() { let body = PublishBuilder::new("serde", "1.0.0").body(); let response = token.put::<()>("/api/v1/crates/new", body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // Check that the git index is updated asynchronously assert_ok_eq!(upstream.list_commits(), vec!["Initial Commit"]); @@ -33,7 +33,7 @@ async fn index_smoke_test() { // Yank the crate let response = token.delete::<()>("/api/v1/crates/serde/1.0.0/yank").await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); app.run_pending_background_jobs().await; assert_ok_eq!( @@ -101,7 +101,7 @@ async fn test_config_changes() { // Add a new crate let body = PublishBuilder::new("serde", "1.0.0").body(); let response = token.publish_crate(body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // Adjust the `config.json` file on the upstream index upstream.write_file("config.json", UPDATED_CONFIG).unwrap(); @@ -110,7 +110,7 @@ async fn test_config_changes() { // Update the crate let body = PublishBuilder::new("serde", "1.1.0").body(); let response = token.publish_crate(body).await; - assert_eq!(response.status(), StatusCode::OK); + assert_snapshot!(response.status(), @"200 OK"); // Check that the `config.json` changes on the upstream index are preserved assert_ok_eq!(upstream.read_file("config.json"), UPDATED_CONFIG);