gcloud_spanner/admin/database/
mod.rs

1pub mod database_admin_client;
2
3#[cfg(test)]
4mod tests {
5    use serial_test::serial;
6    use time::OffsetDateTime;
7
8    use google_cloud_gax::conn::{ConnectionManager, ConnectionOptions, Environment};
9    use google_cloud_googleapis::spanner::admin::database::v1::database::State;
10
11    use google_cloud_googleapis::spanner::admin::database::v1::{
12        CreateDatabaseRequest, Database, DatabaseDialect, DropDatabaseRequest, GetDatabaseDdlRequest,
13        GetDatabaseRequest, ListDatabasesRequest, UpdateDatabaseDdlRequest,
14    };
15    use google_cloud_longrunning::autogen::operations_client::OperationsClient;
16
17    use crate::admin::database::database_admin_client::DatabaseAdminClient;
18    use crate::apiv1::conn_pool::{AUDIENCE, SPANNER};
19
20    async fn new_client() -> DatabaseAdminClient {
21        let conn_pool = ConnectionManager::new(
22            1,
23            SPANNER,
24            AUDIENCE,
25            &Environment::Emulator("localhost:9010".to_string()),
26            &ConnectionOptions::default(),
27        )
28        .await
29        .unwrap();
30        let lro_client = OperationsClient::new(conn_pool.conn()).await.unwrap();
31        DatabaseAdminClient::new(conn_pool.conn(), lro_client)
32    }
33
34    async fn create_database() -> Database {
35        let client = new_client().await;
36        let database_id = format!("test{}ut", OffsetDateTime::now_utc().unix_timestamp_nanos());
37        let request = CreateDatabaseRequest {
38            parent: "projects/local-project/instances/test-instance".to_string(),
39            create_statement: format!("CREATE DATABASE {database_id}"),
40            extra_statements: vec!["CREATE TABLE Tbl (ID STRING(MAX)) PRIMARY KEY(ID)".to_string()],
41            encryption_config: None,
42            database_dialect: DatabaseDialect::GoogleStandardSql.into(),
43            proto_descriptors: vec![],
44        };
45
46        let creation_result = match client.create_database(request, None).await {
47            Ok(mut res) => res.wait(None).await,
48            Err(err) => panic!("err: {err:?}"),
49        };
50        match creation_result {
51            Ok(res) => res.unwrap(),
52            Err(err) => panic!("err: {err:?}"),
53        }
54    }
55
56    #[tokio::test]
57    #[serial]
58    async fn test_create_database() {
59        let instance = create_database().await;
60        assert_eq!(instance.state, State::Ready as i32);
61    }
62
63    #[tokio::test]
64    #[serial]
65    async fn test_get_database() {
66        let client = new_client().await;
67        let name = "projects/local-project/instances/test-instance/databases/local-database".to_string();
68        let request = GetDatabaseRequest { name: name.clone() };
69
70        match client.get_database(request, None).await {
71            Ok(res) => {
72                let db = res.into_inner();
73                assert_eq!(db.name, name);
74            }
75            Err(err) => panic!("err: {err:?}"),
76        };
77    }
78
79    #[tokio::test]
80    #[serial]
81    async fn test_delete_database() {
82        let database = create_database().await;
83        let client = new_client().await;
84        let request = DropDatabaseRequest {
85            database: database.name.to_string(),
86        };
87        let _ = client.drop_database(request, None).await.unwrap();
88    }
89
90    #[tokio::test]
91    #[serial]
92    async fn test_list_databases() {
93        let client = new_client().await;
94        let request = ListDatabasesRequest {
95            parent: "projects/local-project/instances/test-instance".to_string(),
96            page_size: 1,
97            page_token: "".to_string(),
98        };
99
100        match client.list_databases(request, None).await {
101            Ok(res) => {
102                println!("size = {}", res.len());
103                assert!(!res.is_empty());
104            }
105            Err(err) => panic!("err: {err:?}"),
106        };
107    }
108
109    #[tokio::test]
110    #[serial]
111    async fn test_get_database_ddl() {
112        let database = create_database().await;
113        let client = new_client().await;
114        let request = GetDatabaseDdlRequest {
115            database: database.name.to_string(),
116        };
117
118        match client.get_database_ddl(request, None).await {
119            Ok(res) => {
120                assert_eq!(res.into_inner().statements.len(), 1);
121            }
122            Err(err) => panic!("err: {err:?}"),
123        };
124    }
125
126    #[tokio::test]
127    #[serial]
128    async fn test_update_database_ddl() {
129        let database = create_database().await;
130        let client = new_client().await;
131        let request = UpdateDatabaseDdlRequest {
132            database: database.name.to_string(),
133            statements: vec!["CREATE TABLE Tbl1 (ID INT64) PRIMARY KEY(ID)".to_string()],
134            operation_id: "".to_string(),
135            proto_descriptors: vec![],
136            throughput_mode: false,
137        };
138
139        let update_result = match client.update_database_ddl(request, None).await {
140            Ok(mut res) => res.wait(None).await,
141            Err(err) => panic!("err: {err:?}"),
142        };
143        let _ = update_result.unwrap();
144    }
145}