Skip to content

Commit 6fb3d05

Browse files
committed
chore(users): migrate tests
1 parent 14ecb51 commit 6fb3d05

12 files changed

+451
-4
lines changed

Cargo.lock

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

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)