Skip to content

Commit be1bf74

Browse files
committed
chore(users): migrate tests
1 parent c43352d commit be1bf74

24 files changed

+725
-278
lines changed

Cargo.lock

+274-272
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/api/cloud/src/auth.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ impl Auth {
296296
team_ids: team_ids
297297
.iter()
298298
.map(|id| (*id).into())
299-
.collect::<Vec<common::Uuid>>()
299+
.collect::<Vec<_>>()
300300
})
301301
.await?;
302302

packages/api/group/tests/basic.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ impl Ctx {
6161

6262
let token_res = chirp_workflow::compat::op(
6363
&ctx,
64-
user::ops::token_create::get::Input {
64+
::user::ops::token_create::Input {
6565
user_id: user_id,
6666
client: backend::net::ClientInfo {
6767
user_agent: Some(USER_AGENT.into()),

packages/api/portal/tests/basic.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl Ctx {
6060

6161
let token_res = chirp_workflow::compat::op(
6262
&ctx,
63-
user::ops::token_create::get::Input {
63+
::user::ops::token_create::Input {
6464
user_id: user_id,
6565
client: backend::net::ClientInfo {
6666
user_agent: Some(USER_AGENT.into()),

packages/infra/server/src/run_config.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ pub fn config(rivet_config: rivet_config::Config) -> Result<RunConfigData> {
282282
SqlService {
283283
kind: SqlServiceKind::CockroachDB,
284284
migrations: include_dir!(
285-
"$CARGO_MANIFEST_DIR/../../services/user-identity/db/user-identity"
285+
"$CARGO_MANIFEST_DIR/../../services/user/db/user-identity"
286286
),
287287
db_name: "db_user_identity",
288288
},

packages/services/user/Cargo.toml

+8-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,14 @@ token-create.workspace = true
1919
upload-file-list.workspace = true
2020
upload-get.workspace = true
2121
upload-complete.workspace = true
22-
user-identity-get.workspace = true
2322

2423
[dependencies.sqlx]
2524
workspace = true
26-
default-features = false
25+
default-features = false
26+
27+
[dev-dependencies]
28+
faker-user.workspace = true
29+
rand = "0.8"
30+
reqwest = "0.11"
31+
upload-get.workspace = true
32+
upload-prepare.workspace = true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use chirp_workflow::prelude::*;
2+
use rivet_operation::prelude::proto::backend;
3+
4+
const TEST_BODY: &[u8] = b"test file";
5+
6+
#[workflow_test]
7+
async fn empty(ctx: TestCtx) {
8+
let user_res = op!([ctx] faker_user {}).await.unwrap();
9+
let user_id = user_res.user_id.unwrap().as_uuid();
10+
11+
// Create the upload
12+
let upload_prepare_res = op!([ctx] upload_prepare {
13+
bucket: "bucket-user-avatar".into(),
14+
files: vec![
15+
backend::upload::PrepareFile {
16+
path: "image.png".to_owned(),
17+
mime: Some("image/png".into()),
18+
content_length: TEST_BODY.len() as u64,
19+
..Default::default()
20+
},
21+
],
22+
})
23+
.await
24+
.unwrap();
25+
let upload_id = upload_prepare_res.upload_id.unwrap();
26+
let presigned_request = upload_prepare_res.presigned_requests.first().unwrap();
27+
28+
tracing::info!("writing test files");
29+
let res = reqwest::Client::new()
30+
.put(&presigned_request.url)
31+
.body(TEST_BODY.to_vec())
32+
.header("content-type", "image/png")
33+
.send()
34+
.await
35+
.expect("failed to upload");
36+
if res.status().is_success() {
37+
tracing::info!("uploaded successfully");
38+
} else {
39+
panic!(
40+
"failed to upload ({}): {:?}",
41+
res.status(),
42+
res.text().await
43+
);
44+
}
45+
46+
ctx.op(::user::ops::avatar_upload_complete::Input {
47+
user_id: user_id,
48+
upload_id: upload_id.as_uuid()
49+
})
50+
.await
51+
.unwrap();
52+
53+
let uploads_res = op!([ctx] upload_get {
54+
upload_ids: vec![upload_id]
55+
})
56+
.await
57+
.unwrap();
58+
59+
let upload = uploads_res.uploads.first().unwrap();
60+
61+
assert!(upload.complete_ts.is_some(), "Upload did not complete");
62+
}

packages/services/user/tests/get.rs

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
use chirp_workflow::prelude::*;
2+
use proto::backend::{pkg::*};
3+
use rivet_operation::prelude::proto;
4+
use rand::Rng;
5+
6+
#[workflow_test]
7+
async fn empty(ctx: TestCtx) {
8+
let res = ctx.op(::user::ops::get::Input {
9+
user_ids: Vec::new(),
10+
})
11+
.await
12+
.unwrap();
13+
assert!(res.users.is_empty());
14+
}
15+
16+
#[workflow_test]
17+
async fn fetch(ctx: TestCtx) {
18+
struct TestUser {
19+
user_id: Option<Uuid>,
20+
display_name: String,
21+
account_number: i64,
22+
bio: String,
23+
}
24+
25+
// Generate test users
26+
let mut users = std::iter::repeat_with(|| TestUser {
27+
user_id: None,
28+
display_name: util::faker::display_name(),
29+
account_number: rand::thread_rng().gen_range(1..10000),
30+
bio: util::faker::ident(),
31+
})
32+
.take(8)
33+
.collect::<Vec<_>>();
34+
35+
// Insert test users
36+
for user in &mut users {
37+
let user_res = op!([ctx] faker_user { }).await.unwrap();
38+
let user_id = user_res.user_id.unwrap().as_uuid();
39+
40+
msg!([ctx] user::msg::profile_set(user_id) -> user::msg::update {
41+
user_id: Some(user_id.into()),
42+
display_name: Some(user.display_name.clone()),
43+
account_number: Some(user.account_number as u32),
44+
bio: Some(user.bio.clone()),
45+
})
46+
.await
47+
.unwrap();
48+
49+
user.user_id = Some(user_id);
50+
}
51+
52+
// Fetch the users
53+
let res = ctx.op(::user::ops::get::Input {
54+
user_ids: users.iter().map(|u| u.user_id.unwrap()).collect(),
55+
})
56+
.await
57+
.unwrap();
58+
59+
// Validate the users
60+
assert_eq!(users.len(), res.users.len());
61+
for user in &users {
62+
let user_res = res
63+
.users
64+
.iter()
65+
.find(|u| u.user_id.unwrap().as_uuid() == user.user_id.unwrap())
66+
.expect("user not returned");
67+
68+
assert_eq!(user.display_name, user_res.display_name);
69+
assert_eq!(user.account_number, user_res.account_number as i64);
70+
assert_eq!(user.bio, user_res.bio);
71+
}
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use chirp_workflow::prelude::*;
2+
use rivet_operation::prelude::proto::backend;
3+
4+
#[workflow_test]
5+
async fn email(ctx: TestCtx) {
6+
let user_res = op!([ctx] faker_user {
7+
..Default::default()
8+
})
9+
.await
10+
.unwrap();
11+
let user_id = user_res.user_id.unwrap().as_uuid();
12+
13+
let email = util::faker::email();
14+
ctx.op(::user::ops::identity::create::Input {
15+
user_id: user_id,
16+
identity: backend::user_identity::Identity {
17+
kind: Some(backend::user_identity::identity::Kind::Email(
18+
backend::user_identity::identity::Email {
19+
email: email.clone(),
20+
}
21+
)),
22+
},
23+
})
24+
.await
25+
.unwrap();
26+
27+
let (sql_exists,) = sqlx::query_as::<_, (bool,)>(
28+
"SELECT EXISTS (SELECT 1 FROM db_user_identity.emails WHERE email = $1)",
29+
)
30+
.bind(&email)
31+
.fetch_one(&ctx.crdb().await.unwrap())
32+
.await
33+
.unwrap();
34+
assert!(sql_exists, "identity not created");
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use chirp_workflow::prelude::*;
2+
use rivet_operation::prelude::proto::backend;
3+
4+
#[workflow_test]
5+
async fn empty(ctx: TestCtx) {
6+
let user_res = op!([ctx] faker_user {
7+
..Default::default()
8+
})
9+
.await
10+
.unwrap();
11+
let user_id = user_res.user_id.unwrap().as_uuid();
12+
13+
let email = util::faker::email();
14+
ctx.op(::user::ops::identity::create::Input {
15+
user_id: user_id,
16+
identity: backend::user_identity::Identity {
17+
kind: Some(backend::user_identity::identity::Kind::Email(
18+
backend::user_identity::identity::Email {
19+
email: email.clone()
20+
}
21+
)),
22+
},
23+
})
24+
.await
25+
.unwrap();
26+
27+
ctx.op(::user::ops::identity::delete::Input {
28+
user_ids: vec![user_id],
29+
})
30+
.await
31+
.unwrap();
32+
33+
let (sql_exists,) = sqlx::query_as::<_, (bool,)>(
34+
"SELECT EXISTS (SELECT 1 FROM db_user_identity.emails WHERE email = $1)",
35+
)
36+
.bind(&email)
37+
.fetch_one(&ctx.crdb().await.unwrap())
38+
.await
39+
.unwrap();
40+
assert!(!sql_exists, "identity not deleted");
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use chirp_workflow::prelude::*;
2+
use rivet_operation::prelude::proto::backend;
3+
4+
#[workflow_test]
5+
async fn empty(ctx: TestCtx) {
6+
let user_res = op!([ctx] faker_user {
7+
..Default::default()
8+
})
9+
.await
10+
.unwrap();
11+
let user_id = user_res.user_id.unwrap().as_uuid();
12+
13+
let email = util::faker::email();
14+
ctx.op(::user::ops::identity::create::Input {
15+
user_id: user_id,
16+
identity: backend::user_identity::Identity {
17+
kind: Some(backend::user_identity::identity::Kind::Email(
18+
backend::user_identity::identity::Email {
19+
email: email.clone()
20+
}
21+
)),
22+
},
23+
})
24+
.await
25+
.unwrap();
26+
27+
let res = ctx.op(::user::ops::identity::get::Input {
28+
user_ids: vec![user_id, Uuid::new_v4()],
29+
})
30+
.await
31+
.unwrap();
32+
assert_eq!(1, res.users.len());
33+
assert_eq!(
34+
1,
35+
res.users
36+
.iter()
37+
.find(|u| u.user_id == user_id)
38+
.unwrap()
39+
.identities
40+
.len()
41+
);
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
use chirp_workflow::prelude::*;
2+
use rivet_operation::prelude::proto::backend;
3+
4+
#[workflow_test]
5+
async fn empty(ctx: TestCtx) {
6+
let user_res = op!([ctx] faker_user {}).await.unwrap();
7+
let user_id = user_res.user_id.as_ref().unwrap().as_uuid();
8+
9+
// Register user
10+
let email = util::faker::email();
11+
let _res = ctx.op(::user::ops::identity::create::Input {
12+
user_id: user_id,
13+
identity: backend::user_identity::Identity {
14+
kind: Some(backend::user_identity::identity::Kind::Email(
15+
backend::user_identity::identity::Email {
16+
email: email.clone()
17+
}
18+
)),
19+
},
20+
})
21+
.await
22+
.unwrap();
23+
24+
ctx.op(::user::ops::pending_delete_toggle::Input {
25+
user_id: user_id,
26+
active: true,
27+
})
28+
.await
29+
.unwrap();
30+
31+
let (delete_request_ts,): (Option<i64>,) = sqlx::query_as(indoc!(
32+
"
33+
SELECT delete_request_ts
34+
FROM db_user.users
35+
WHERE
36+
user_id = $1
37+
",
38+
))
39+
.bind(user_id)
40+
.fetch_one(&ctx.crdb().await.unwrap())
41+
.await
42+
.unwrap();
43+
44+
assert!(delete_request_ts.is_some());
45+
46+
ctx.op(::user::ops::pending_delete_toggle::Input {
47+
user_id: user_id,
48+
active: false,
49+
})
50+
.await
51+
.unwrap();
52+
53+
let (delete_request_ts,): (Option<i64>,) = sqlx::query_as(indoc!(
54+
"
55+
SELECT delete_request_ts
56+
FROM db_user.users
57+
WHERE
58+
user_id = $1
59+
",
60+
))
61+
.bind(user_id)
62+
.fetch_one(&ctx.crdb().await.unwrap())
63+
.await
64+
.unwrap();
65+
66+
assert!(delete_request_ts.is_none());
67+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use chirp_workflow::prelude::*;
2+
3+
#[workflow_test]
4+
async fn empty(ctx: TestCtx) {
5+
let user_res = op!([ctx] faker_user {}).await.unwrap();
6+
let user_id = user_res.user_id.unwrap().as_uuid();
7+
8+
let res = ctx.op(::user::ops::profile_validate::Input {
9+
user_id: user_id,
10+
display_name: Some(" bad display name".to_owned()),
11+
account_number: Some(10000),
12+
bio: Some("bad\n\n\n\n\n\nbio".to_owned())
13+
})
14+
.await
15+
.unwrap();
16+
17+
assert_eq!(res.errors.len(), 3, "validation failed");
18+
}

0 commit comments

Comments
 (0)