gcloud_spanner/admin/database/
mod.rs1pub 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}