Merge pull request #457 from AppFlowy-IO/select_user_workspace
chore: sql tests
This commit is contained in:
commit
cf5183d827
|
|
@ -1,70 +0,0 @@
|
||||||
{
|
|
||||||
"db_name": "PostgreSQL",
|
|
||||||
"query": "\n SELECT\n workspace_id,\n database_storage_id,\n owner_uid,\n (SELECT name FROM public.af_user WHERE uid = owner_uid) AS owner_name,\n created_at,\n workspace_type,\n deleted_at,\n workspace_name,\n icon\n FROM public.af_workspace\n WHERE workspace_id IN (\n SELECT workspace_id FROM public.af_workspace_member\n WHERE af_workspace_member.uid = (SELECT uid FROM public.af_user WHERE uuid = $1)\n );\n ",
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"ordinal": 0,
|
|
||||||
"name": "workspace_id",
|
|
||||||
"type_info": "Uuid"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 1,
|
|
||||||
"name": "database_storage_id",
|
|
||||||
"type_info": "Uuid"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 2,
|
|
||||||
"name": "owner_uid",
|
|
||||||
"type_info": "Int8"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 3,
|
|
||||||
"name": "owner_name",
|
|
||||||
"type_info": "Text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 4,
|
|
||||||
"name": "created_at",
|
|
||||||
"type_info": "Timestamptz"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 5,
|
|
||||||
"name": "workspace_type",
|
|
||||||
"type_info": "Int4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 6,
|
|
||||||
"name": "deleted_at",
|
|
||||||
"type_info": "Timestamptz"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 7,
|
|
||||||
"name": "workspace_name",
|
|
||||||
"type_info": "Text"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ordinal": 8,
|
|
||||||
"name": "icon",
|
|
||||||
"type_info": "Text"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Uuid"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": [
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"hash": "71093ffc23294c01b80af7b1c43fab3a5a67eef820f9885c72117364c683fb4a"
|
|
||||||
}
|
|
||||||
|
|
@ -86,7 +86,7 @@ dependencies = [
|
||||||
"encoding_rs",
|
"encoding_rs",
|
||||||
"flate2",
|
"flate2",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"h2 0.3.24",
|
"h2 0.3.26",
|
||||||
"http 0.2.11",
|
"http 0.2.11",
|
||||||
"httparse",
|
"httparse",
|
||||||
"httpdate",
|
"httpdate",
|
||||||
|
|
@ -875,7 +875,7 @@ dependencies = [
|
||||||
"derive_more",
|
"derive_more",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"h2 0.3.24",
|
"h2 0.3.26",
|
||||||
"http 0.2.11",
|
"http 0.2.11",
|
||||||
"itoa",
|
"itoa",
|
||||||
"log",
|
"log",
|
||||||
|
|
@ -2669,9 +2669,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "h2"
|
name = "h2"
|
||||||
version = "0.3.24"
|
version = "0.3.26"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
|
checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"fnv",
|
"fnv",
|
||||||
|
|
@ -2913,7 +2913,7 @@ dependencies = [
|
||||||
"futures-channel",
|
"futures-channel",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"h2 0.3.24",
|
"h2 0.3.26",
|
||||||
"http 0.2.11",
|
"http 0.2.11",
|
||||||
"http-body 0.4.6",
|
"http-body 0.4.6",
|
||||||
"httparse",
|
"httparse",
|
||||||
|
|
@ -4590,7 +4590,7 @@ dependencies = [
|
||||||
"encoding_rs",
|
"encoding_rs",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"h2 0.3.24",
|
"h2 0.3.26",
|
||||||
"http 0.2.11",
|
"http 0.2.11",
|
||||||
"http-body 0.4.6",
|
"http-body 0.4.6",
|
||||||
"hyper 0.14.28",
|
"hyper 0.14.28",
|
||||||
|
|
|
||||||
|
|
@ -588,19 +588,19 @@ pub async fn select_all_user_workspaces<'a, E: Executor<'a, Database = Postgres>
|
||||||
AFWorkspaceRow,
|
AFWorkspaceRow,
|
||||||
r#"
|
r#"
|
||||||
SELECT
|
SELECT
|
||||||
workspace_id,
|
w.workspace_id,
|
||||||
database_storage_id,
|
w.database_storage_id,
|
||||||
owner_uid,
|
w.owner_uid,
|
||||||
(SELECT name FROM public.af_user WHERE uid = owner_uid) AS owner_name,
|
(SELECT name FROM public.af_user WHERE uid = w.owner_uid) AS owner_name,
|
||||||
created_at,
|
w.created_at,
|
||||||
workspace_type,
|
w.workspace_type,
|
||||||
deleted_at,
|
w.deleted_at,
|
||||||
workspace_name,
|
w.workspace_name,
|
||||||
icon
|
w.icon
|
||||||
FROM public.af_workspace
|
FROM af_workspace w
|
||||||
WHERE workspace_id IN (
|
JOIN af_workspace_member wm ON w.workspace_id = wm.workspace_id
|
||||||
SELECT workspace_id FROM public.af_workspace_member
|
WHERE wm.uid = (
|
||||||
WHERE af_workspace_member.uid = (SELECT uid FROM public.af_user WHERE uuid = $1)
|
SELECT uid FROM public.af_user WHERE uuid = $1
|
||||||
);
|
);
|
||||||
"#,
|
"#,
|
||||||
user_uuid
|
user_uuid
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
mod collab;
|
mod collab;
|
||||||
mod collab_snapshot;
|
mod collab_snapshot;
|
||||||
// mod collab_stream;
|
|
||||||
mod gotrue;
|
mod gotrue;
|
||||||
|
mod pg_sql;
|
||||||
mod user;
|
mod user;
|
||||||
mod websocket;
|
mod websocket;
|
||||||
mod workspace;
|
mod workspace;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
mod util;
|
||||||
|
mod workspace_test;
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
use snowflake::Snowflake;
|
||||||
|
use sqlx::PgPool;
|
||||||
|
use tokio::sync::RwLock;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
pub async fn setup_db(pool: &PgPool) -> anyhow::Result<()> {
|
||||||
|
// Have to manually create schema and tables managed by gotrue but referenced by our
|
||||||
|
// migration scripts.
|
||||||
|
sqlx::query(r#"create schema auth"#).execute(pool).await?;
|
||||||
|
sqlx::query(
|
||||||
|
r#"
|
||||||
|
CREATE TABLE auth.users(
|
||||||
|
id uuid NOT NULL UNIQUE,
|
||||||
|
deleted_at timestamptz null,
|
||||||
|
CONSTRAINT users_pkey PRIMARY KEY (id)
|
||||||
|
)
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.execute(pool)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
sqlx::migrate!("./migrations")
|
||||||
|
.set_ignore_missing(true)
|
||||||
|
.run(pool)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn insert_auth_user(pool: &PgPool, user_uuid: Uuid) -> anyhow::Result<()> {
|
||||||
|
sqlx::query(
|
||||||
|
r#"
|
||||||
|
INSERT INTO auth.users (id)
|
||||||
|
VALUES ($1)
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.bind(user_uuid)
|
||||||
|
.execute(pool)
|
||||||
|
.await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
pub static ref ID_GEN: RwLock<Snowflake> = RwLock::new(Snowflake::new(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn test_create_user(
|
||||||
|
pool: &PgPool,
|
||||||
|
user_uuid: Uuid,
|
||||||
|
email: &str,
|
||||||
|
name: &str,
|
||||||
|
) -> anyhow::Result<()> {
|
||||||
|
let uid = ID_GEN.write().await.next_id();
|
||||||
|
database::user::create_user(pool, uid, &user_uuid, email, name)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
use crate::pg_sql::util::{insert_auth_user, setup_db, test_create_user};
|
||||||
|
use sqlx::PgPool;
|
||||||
|
|
||||||
|
#[sqlx::test(migrations = false)]
|
||||||
|
async fn basic_test(pool: PgPool) -> sqlx::Result<()> {
|
||||||
|
setup_db(&pool).await.unwrap();
|
||||||
|
|
||||||
|
let user_uuid = uuid::Uuid::new_v4();
|
||||||
|
let name = user_uuid.to_string();
|
||||||
|
let email = format!("{}@appflowy.io", name);
|
||||||
|
|
||||||
|
insert_auth_user(&pool, user_uuid).await.unwrap();
|
||||||
|
test_create_user(&pool, user_uuid, &email, &name)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue