Skip to content

Commit 977bf9c

Browse files
committed
tests/tokens/list: Use insta and serde_json::Value for response testing
Using insta ensures that tests will fail if we unintentionally change anything about the serialization format (e.g. adding token scopes fields 😉)
1 parent 0723caa commit 977bf9c

File tree

2 files changed

+42
-38
lines changed

2 files changed

+42
-38
lines changed

src/tests/routes/me/tokens/list.rs

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,7 @@
1-
use crate::routes::me::tokens::delete::RevokedResponse;
1+
use crate::util::insta::{self, assert_yaml_snapshot};
22
use crate::util::{RequestHelper, TestApp};
33
use cargo_registry::models::ApiToken;
4-
use std::collections::HashSet;
5-
6-
#[derive(Deserialize)]
7-
struct DecodableApiToken {
8-
name: String,
9-
}
10-
11-
#[derive(Deserialize)]
12-
struct ListResponse {
13-
api_tokens: Vec<DecodableApiToken>,
14-
}
4+
use http::StatusCode;
155

166
#[test]
177
fn list_logged_out() {
@@ -28,33 +18,31 @@ fn list_with_api_token_is_forbidden() {
2818
#[test]
2919
fn list_empty() {
3020
let (_, _, user) = TestApp::init().with_user();
31-
let json: ListResponse = user.get("/api/v1/me/tokens").good();
32-
assert_eq!(json.api_tokens.len(), 0);
21+
let response = user.get::<()>("/api/v1/me/tokens");
22+
assert_eq!(response.status(), StatusCode::OK);
23+
let json = response.into_json();
24+
let response_tokens = json["api_tokens"].as_array().unwrap();
25+
assert_eq!(response_tokens.len(), 0);
3326
}
3427

3528
#[test]
3629
fn list_tokens() {
3730
let (app, _, user) = TestApp::init().with_user();
3831
let id = user.as_model().id;
39-
let tokens = app.db(|conn| {
32+
app.db(|conn| {
4033
vec![
4134
assert_ok!(ApiToken::insert(conn, id, "bar")),
4235
assert_ok!(ApiToken::insert(conn, id, "baz")),
4336
]
4437
});
4538

46-
let json: ListResponse = user.get("/api/v1/me/tokens").good();
47-
assert_eq!(json.api_tokens.len(), tokens.len());
48-
assert_eq!(
49-
json.api_tokens
50-
.into_iter()
51-
.map(|t| t.name)
52-
.collect::<HashSet<_>>(),
53-
tokens
54-
.into_iter()
55-
.map(|t| t.model.name)
56-
.collect::<HashSet<_>>()
57-
);
39+
let response = user.get::<()>("/api/v1/me/tokens");
40+
assert_eq!(response.status(), StatusCode::OK);
41+
assert_yaml_snapshot!(response.into_json(), {
42+
".api_tokens[].id" => insta::any_id_redaction(),
43+
".api_tokens[].created_at" => "[datetime]",
44+
".api_tokens[].last_used_at" => "[datetime]",
45+
});
5846
}
5947

6048
#[test]
@@ -69,19 +57,21 @@ fn list_tokens_exclude_revoked() {
6957
});
7058

7159
// List tokens expecting them all to be there.
72-
let json: ListResponse = user.get("/api/v1/me/tokens").good();
73-
assert_eq!(json.api_tokens.len(), tokens.len());
60+
let response = user.get::<()>("/api/v1/me/tokens");
61+
assert_eq!(response.status(), StatusCode::OK);
62+
let json = response.into_json();
63+
let response_tokens = json["api_tokens"].as_array().unwrap();
64+
assert_eq!(response_tokens.len(), 2);
7465

7566
// Revoke the first token.
76-
let _json: RevokedResponse = user
77-
.delete(&format!("/api/v1/me/tokens/{}", tokens[0].model.id))
78-
.good();
67+
let response = user.delete::<()>(&format!("/api/v1/me/tokens/{}", tokens[0].model.id));
68+
assert_eq!(response.status(), StatusCode::OK);
7969

8070
// Check that we now have one less token being listed.
81-
let json: ListResponse = user.get("/api/v1/me/tokens").good();
82-
assert_eq!(json.api_tokens.len(), tokens.len() - 1);
83-
assert!(!json
84-
.api_tokens
85-
.iter()
86-
.any(|token| token.name == tokens[0].model.name));
71+
let response = user.get::<()>("/api/v1/me/tokens");
72+
assert_eq!(response.status(), StatusCode::OK);
73+
let json = response.into_json();
74+
let response_tokens = json["api_tokens"].as_array().unwrap();
75+
assert_eq!(response_tokens.len(), 1);
76+
assert_eq!(response_tokens[0]["name"], json!("baz"));
8777
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
source: src/tests/routes/me/tokens/list.rs
3+
expression: response.into_json()
4+
---
5+
api_tokens:
6+
- created_at: "[datetime]"
7+
id: "[id]"
8+
last_used_at: "[datetime]"
9+
name: bar
10+
- created_at: "[datetime]"
11+
id: "[id]"
12+
last_used_at: "[datetime]"
13+
name: baz
14+

0 commit comments

Comments
 (0)