@@ -25,54 +25,64 @@ trait PgSystemTestCaseTrait
2525
2626 protected static function setUpTestDatabase (): void
2727 {
28- if (self ::$ hasSetUp ) {
28+ if (TestDatabaseManager::$ pgHasSetUp ) {
29+ self ::$ client = TestDatabaseManager::$ client ;
30+ self ::$ instance = TestDatabaseManager::$ instance ;
31+ self ::$ database = TestDatabaseManager::$ pgDatabase ;
32+ self ::$ dbName = TestDatabaseManager::$ pgDbName ;
33+ self ::$ hasSetUp = true ;
2934 return ;
3035 }
3136
3237 self ::$ instance = self ::getClient ()->instance (self ::INSTANCE_NAME );
3338
34- self ::$ dbName = uniqid (self ::TESTING_PREFIX );
39+ if (!self ::$ dbName = getenv ('GOOGLE_CLOUD_SPANNER_TEST_PG_DATABASE ' )) {
40+ self ::$ dbName = uniqid (self ::TESTING_PREFIX );
3541
36- // create a PG DB first
37- $ op = self ::$ instance ->createDatabase (self ::$ dbName , [
38- 'databaseDialect ' => DatabaseDialect::POSTGRESQL
39- ]);
40- // wait for the DB to be ready
41- $ op ->pollUntilComplete ();
42-
43- $ db = self ::getDatabaseInstance (self ::$ dbName );
44-
45- self ::$ deletionQueue ->add (function () use ($ db ) {
46- $ db ->drop ();
47- });
48-
49- self ::$ database = $ db ;
50-
51- $ db ->updateDdlBatch (
52- [
53- 'CREATE TABLE ' . self ::TEST_TABLE_NAME . ' (
54- id bigint PRIMARY KEY,
55- name varchar(1024) NOT NULL,
56- birthday date
57- ) ' ,
58- ]
59- )->pollUntilComplete ();
42+ self ::$ deletionQueue ->add (function () {
43+ self ::getDatabaseInstance (self ::$ dbName )->drop ();
44+ });
45+ }
46+
47+ self ::$ database = self ::getDatabaseInstance (self ::$ dbName );
6048
61- // Currently, the emulator doesn't support setting roles for the PG
62- // dialect.
63- if (!self ::isEmulatorUsed ()) {
49+ if (!self ::$ database ->exists ()) {
50+ $ op = self ::$ instance ->createDatabase (self ::$ dbName , [
51+ 'databaseDialect ' => DatabaseDialect::POSTGRESQL
52+ ]);
53+ $ op ->pollUntilComplete ();
54+
6455 $ db ->updateDdlBatch (
6556 [
66- 'CREATE ROLE ' . self ::DATABASE_ROLE ,
67- 'CREATE ROLE ' . self ::RESTRICTIVE_DATABASE_ROLE ,
68- 'GRANT SELECT ON TABLE ' . self ::TEST_TABLE_NAME .
69- ' TO ' . self ::DATABASE_ROLE ,
70- 'GRANT SELECT(id, name), INSERT(id, name), UPDATE(id, name) ON TABLE '
71- . self ::TEST_TABLE_NAME . ' TO ' . self ::RESTRICTIVE_DATABASE_ROLE ,
57+ 'CREATE TABLE IF NOT EXISTS ' . self ::TEST_TABLE_NAME . ' (
58+ id bigint PRIMARY KEY,
59+ name varchar(1024) NOT NULL,
60+ birthday date
61+ ) ' ,
7262 ]
7363 )->pollUntilComplete ();
64+
65+ // Currently, the emulator doesn't support setting roles for the PG
66+ // dialect.
67+ if (!self ::isEmulatorUsed ()) {
68+ $ db ->updateDdlBatch (
69+ [
70+ 'CREATE ROLE ' . self ::DATABASE_ROLE ,
71+ 'CREATE ROLE ' . self ::RESTRICTIVE_DATABASE_ROLE ,
72+ 'GRANT SELECT ON TABLE ' . self ::TEST_TABLE_NAME .
73+ ' TO ' . self ::DATABASE_ROLE ,
74+ 'GRANT SELECT(id, name), INSERT(id, name), UPDATE(id, name) ON TABLE '
75+ . self ::TEST_TABLE_NAME . ' TO ' . self ::RESTRICTIVE_DATABASE_ROLE ,
76+ ]
77+ )->pollUntilComplete ();
78+ }
7479 }
7580
81+ TestDatabaseManager::$ pgHasSetUp = true ;
82+ TestDatabaseManager::$ client = self ::$ client ;
83+ TestDatabaseManager::$ instance = self ::$ instance ;
84+ TestDatabaseManager::$ pgDatabase = self ::$ database ;
85+ TestDatabaseManager::$ pgDbName = self ::$ dbName ;
7686 self ::$ hasSetUp = true ;
7787 }
7888}
0 commit comments