Skip to content

Commit b9632fe

Browse files
authored
Merge pull request #6 from fiji-flo/reviewed
reviewed (WIP)
2 parents efd1872 + acdc206 commit b9632fe

34 files changed

Lines changed: 1111 additions & 120 deletions

db-tests/Cargo.toml

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ name = "dino-park-packs_db-tests"
33
version = "0.4.0"
44
authors = ["Florian Merz <flomerz@gmail.com>"]
55
edition = "2018"
6-
build = "build.rs"
76
autotests = false
87

98
[[test]]
@@ -15,10 +14,6 @@ harness = true
1514
default = []
1615
localuserscope = ["dino_park_gate/localuserscope"]
1716

18-
[build-dependencies]
19-
diesel = { version = "1.4", features = ["postgres", "uuidv07", "r2d2", "chrono", "serde_json"] }
20-
diesel_migrations = "1.4"
21-
2217
[dev-dependencies]
2318
dino-park-packs = { path = "../" }
2419
cis_client = { git = "https://github.com/mozilla-iam/cis_client-rust", tag = "0.5.1", version = "0.5.1" }
@@ -30,10 +25,12 @@ diesel = { version = "1.4", features = ["postgres", "uuidv07", "r2d2", "chrono",
3025
diesel_migrations = "1.4"
3126
actix-web = "2.0"
3227
actix-rt = "1.0"
28+
actix-http = "1.0"
3329
serde = { version = "1.0", features = ["derive"] }
3430
serde_json = "1.0"
3531
failure = "0.1"
3632
futures = "0.3"
37-
uuid = "0.7"
33+
uuid = { version = "0.7", features = ["v5"] }
3834
tokio = "0.2"
3935
url = "2.1"
36+
base64 = "0.12"

db-tests/build.rs

Lines changed: 0 additions & 15 deletions
This file was deleted.

db-tests/tests/api.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use crate::helpers::Soa;
2+
use actix_http::Request;
3+
use actix_web::dev::*;
4+
use actix_web::test;
5+
use serde::Serialize;
6+
7+
pub async fn get<S, B, E>(mut app: &mut S, endpoint: &str, scope: &Soa) -> S::Response
8+
where
9+
S: Service<Request = Request, Response = ServiceResponse<B>, Error = E>,
10+
E: std::fmt::Debug,
11+
{
12+
let req = test::TestRequest::get()
13+
.header("sau", scope.encode())
14+
.uri(endpoint)
15+
.to_request();
16+
test::call_service(&mut app, req).await
17+
}
18+
19+
pub async fn post<S, B, E>(
20+
mut app: &mut S,
21+
endpoint: &str,
22+
json: impl Serialize,
23+
scope: &Soa,
24+
) -> S::Response
25+
where
26+
S: Service<Request = Request, Response = ServiceResponse<B>, Error = E>,
27+
E: std::fmt::Debug,
28+
{
29+
let req = test::TestRequest::post()
30+
.header("sau", scope.encode())
31+
.uri(endpoint)
32+
.set_json(&json)
33+
.to_request();
34+
test::call_service(&mut app, req).await
35+
}

db-tests/tests/basics.rs

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,54 @@
1-
use crate::cis::CisFakeClient;
2-
use crate::helpers::get_pool;
3-
use actix_web::middleware::Logger;
1+
use crate::api::*;
2+
use crate::db::reset;
3+
use crate::helpers::read_json;
4+
use crate::helpers::test_app;
5+
use crate::helpers::Soa;
6+
use crate::users::basic_user;
47
use actix_web::test;
5-
use actix_web::web;
68
use actix_web::App;
9+
use dino_park_trust::GroupsTrust;
10+
use dino_park_trust::Trust;
711
use failure::Error;
8-
use std::sync::Arc;
9-
10-
use dino_park_packs::*;
12+
use serde_json::json;
1113

1214
#[actix_rt::test]
1315
async fn basic() -> Result<(), Error> {
14-
let cis_client = Arc::new(CisFakeClient::new());
15-
let pool = get_pool();
16-
let app = App::new()
17-
.data(Arc::clone(&cis_client))
18-
.data(pool.clone())
19-
.wrap(Logger::default().exclude("/healthz"))
20-
.service(healthz::healthz_app())
21-
.service(api::internal::internal_app::<CisFakeClient>())
22-
.service(
23-
web::scope("/groups/api/v1/")
24-
.service(api::groups::groups_app::<CisFakeClient>())
25-
.service(api::members::members_app::<CisFakeClient>())
26-
.service(api::current::current_app::<CisFakeClient>())
27-
.service(api::invitations::invitations_app())
28-
.service(api::terms::terms_app())
29-
.service(api::users::users_app())
30-
.service(api::admins::admins_app::<CisFakeClient>())
31-
.service(api::sudo::sudo_app::<CisFakeClient>()),
32-
);
16+
reset()?;
17+
let app = App::new().service(test_app().await);
3318
let mut app = test::init_service(app).await;
3419
let req = test::TestRequest::get().uri("/healthz").to_request();
3520
let res = test::call_service(&mut app, req).await;
3621
assert!(res.status().is_success());
3722
Ok(())
3823
}
24+
25+
#[actix_rt::test]
26+
async fn create() -> Result<(), Error> {
27+
reset()?;
28+
let app = App::new().service(test_app().await);
29+
let mut app = test::init_service(app).await;
30+
let scope = Soa::from(&basic_user(1, true)).creator();
31+
let res = get(&mut app, "/groups/api/v1/groups", &scope).await;
32+
assert!(res.status().is_success());
33+
assert_eq!(read_json(res).await, json!({ "groups": [], "next": null }));
34+
35+
let scope = Soa::new("nobody", Trust::Public, GroupsTrust::None);
36+
let res = get(&mut app, "/groups/api/v1/groups", &scope).await;
37+
assert_eq!(res.status().as_u16(), 403);
38+
39+
let scope = Soa::from(&basic_user(1, true)).creator();
40+
let res = post(
41+
&mut app,
42+
"/groups/api/v1/groups",
43+
json!({ "name": "nda", "description": "the nda group" }),
44+
&scope,
45+
)
46+
.await;
47+
assert!(res.status().is_success());
48+
49+
let res = get(&mut app, "/groups/api/v1/groups", &scope).await;
50+
assert!(res.status().is_success());
51+
assert_eq!(read_json(res).await["groups"][0]["name"], "nda");
52+
53+
Ok(())
54+
}

db-tests/tests/cis.rs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,37 @@ use cis_client::AsyncCisClientTrait;
33
use cis_client::CisFut;
44
use cis_profile::crypto::SecretStore;
55
use cis_profile::schema::Profile;
6+
use dino_park_packs::db::operations::users::update_user_cache;
7+
use dino_park_packs::db::Pool;
8+
use futures::future::err;
9+
use futures::future::ok;
10+
use serde_json::json;
611
use serde_json::Value;
712
use std::collections::HashMap;
813
use std::sync::Arc;
914
use std::sync::RwLock;
1015

16+
#[derive(Clone)]
1117
pub struct CisFakeClient {
1218
pub store: Arc<RwLock<HashMap<String, Profile>>>,
19+
pub pool: Pool,
20+
pub secret_store: Arc<SecretStore>,
1321
}
1422

1523
impl CisFakeClient {
16-
pub fn new() -> Self {
24+
pub fn new(pool: Pool) -> Self {
25+
let secret_store = Arc::new(
26+
SecretStore::default()
27+
.with_sign_keys_from_inline_iter(vec![(
28+
String::from("mozilliansorg"),
29+
include_str!("data/fake_key.json").to_owned(),
30+
)])
31+
.unwrap(),
32+
);
1733
CisFakeClient {
1834
store: Arc::new(RwLock::new(HashMap::new())),
35+
pool,
36+
secret_store,
1937
}
2038
}
2139
}
@@ -29,7 +47,18 @@ impl AsyncCisClientTrait for CisFakeClient {
2947
unimplemented!()
3048
}
3149
fn update_user(&self, id: &str, profile: Profile) -> CisFut<Value> {
32-
unimplemented!()
50+
let mut store = self.store.write().unwrap();
51+
let p = if let Some(mut p) = store.get_mut(id) {
52+
p.access_information.mozilliansorg = profile.access_information.mozilliansorg;
53+
p.clone()
54+
} else {
55+
store.insert(id.to_owned(), profile.clone());
56+
profile
57+
};
58+
match update_user_cache(&self.pool, &p) {
59+
Ok(_) => Box::pin(ok(json!({}))),
60+
Err(e) => Box::pin(err(e.into())),
61+
}
3362
}
3463
fn update_users(&self, profiles: &[Profile]) -> CisFut<Value> {
3564
unimplemented!()
@@ -38,6 +67,6 @@ impl AsyncCisClientTrait for CisFakeClient {
3867
unimplemented!()
3968
}
4069
fn get_secret_store(&self) -> &SecretStore {
41-
unimplemented!()
70+
&*self.secret_store
4271
}
4372
}

db-tests/tests/data/fake_key.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"p": "2MdEFfk9h4zJNZoa49NTHlGBmJdX0qSQyf1KF2zpmDFxCzCGHWcQGtOvC6fPxwh64lL4SQ44_NmKLXao2U03zUn0OjsbahsfIBzDNoLrKSSe6JqQmCQ6SPXKuHCmuPWTpjGIoWea2DxEfwr9Q9F8PZxhxNO9EO5Bk20LdlJ6Ppc",
3+
"kty": "RSA",
4+
"q": "rMI4FcplQT3y0r37c6hfGakGvjeUZye-7mmcUMFUkjBDdCPrAC0YeAhUuoFS6rvyldGrRhobTPMpuvhB7i8uRKy86kQSWrTlXNZSU77eS-qpJCpFk-_o1c3uriEi8EY3_NMtwPWArFRtdtm86z1QjEp7TPBeFGLh1ehS7iS-Hpc",
5+
"d": "hvEnJyCTkppL6gAA2hCQ5WEDLDA3CYZ53lJ7nOC86DueG-r5wKy30RWR053l-P4MbhoA5crX7LZkfklRO0g3dYhXwm-elUM-0SJ9ANizj3iL0-YGBie13-jiPFsH3_pxuzwzc7Hd41x1Gcu2k6rlDDpIoKSRn-OhkLXBI98XTH2iY-oTLwiFA3w1sw2LdX8AGa8MMpFk3yxyg2W0YRuspc5v4YH5PzNXxlRMYgT8JLoDze6umc6sfDYHuGkrSuOaxjO55omPuqT89Ofeu0wohDxYp2b3LT8xs1cc3tQnRbXqzTvwKGkcoD8Td2F0OLNUxlfhka2UquSqVnHZS6xr9Q",
6+
"e": "AQAB",
7+
"use": "sig",
8+
"kid": "ac3b3e65-4f00-4d65-b665-a497329c5a04",
9+
"qi": "twcz8Vf-XPo2CvIu8wdCo6N_WfCe-3J0er0-jqcEWLym6EE_hIE3rXuIKPLmQEZueVV1ELsF-PmOSxTgb-JJAH_38vr9M3gmrSjbGZ3xSKs0FtKTp2k1bAvl8xj2FPA5j-n6RXfpqLgyPOJNj4w-bxoUsIqzD5SiemJGMpyxSsI",
10+
"dp": "UqqqrDZ_4FEv6eD6oCbWa5lpcmdEdm-LR3vv5T8DVaaFFV9Lxaqn2ZMgDbHQ6nWxZt19EV77HHFY4D1_5l4sCX1KRWqE6dGt7PELAJ6sTuRINSu8OEiYcXpJ9EwBSEdeJuJ82BBKXGufM1NdgZ9BYb1hC04zq2EwYKgU1upc88E",
11+
"dq": "a4hE0sN1fUOrFqQslRQzhcxhJxt_YyopPUs9gkKkeo5SHkORLj3joitFWgXPb87nM3wbyPnNDnu4-Ok4WKLDgPmoaYVPi2hX8A5zli8TPVvmRl2Ni4Tkf9i7_WUg00BR7ywfqaDmo921eSoU3rP-pCRkVUK0vKnD-pqurA7wzCc",
12+
"n": "kkpYPma8lZx4TOssUyiRdibeTRghV8dnrEXqHvCupJZ-eK9XIsXoA4vLnQaKdhsQ0zhN846v1MPeQsWY55fWjuc2Gf1r0JiaD09JagGANMPGgvyok1LrcF7vGsXauNZZvYPXdw44-pF_YopiB9LPdDfmzrerFnzAdbi86HxYFHR6-mE2mwCyhqMnkDkyCB7e6cffKNuDZ1p4i9yCcG5sUEvtwfv8sV4gIbbBpu7UHATKNywHW3BeqdljkT46FMz69Kpo6vmStWJkCDtBx-hg0uGkTEPH_y1RLTbC33TVA_hkJpjs1Ms3KSbAjzYmCd-EOhypVABozH8TnpZeqYKdEQ"
13+
}

db-tests/tests/db.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use diesel_migrations::revert_latest_migration;
2+
use dino_park_packs::db::establish_connection;
3+
use dino_park_packs::db::Pool;
4+
use failure::Error;
5+
use std::env;
6+
7+
embed_migrations!();
8+
9+
pub fn get_pool() -> Pool {
10+
let pg_url = env::var("DPP_PG_URL").expect("no DPP_PG_URL set");
11+
establish_connection(&pg_url)
12+
}
13+
14+
pub fn reset() -> Result<(), Error> {
15+
let connection = get_pool().get()?;
16+
while revert_latest_migration(&connection).is_ok() {}
17+
18+
embedded_migrations::run(&connection).expect("error running migrations");
19+
Ok(())
20+
}

0 commit comments

Comments
 (0)