1- import { afterEach , describe , expect , test } from "@jest/globals" ;
1+ import { afterAll , describe , expect , test } from "@jest/globals" ;
22import { DatabaseService } from "../src/services/databaseService" ;
33
44const mockInput = {
@@ -11,32 +11,50 @@ const mockInput = {
1111 ssl : true ,
1212} ;
1313
14- let createdDbId : string | null = null ;
14+ // Test database names that should be cleaned up
15+ const TEST_DB_NAMES = [ "TestDB" , "DeleteTestDB" ] ;
16+
17+ // Track all created database IDs for cleanup
18+ const createdDbIds : string [ ] = [ ] ;
1519
1620describe ( "Database Service Method" , ( ) => {
1721 const dbService = new DatabaseService ( ) ;
1822
19- afterEach ( async ( ) => {
20- if ( createdDbId ) {
23+ // Clean up ALL test databases after all tests complete
24+ afterAll ( async ( ) => {
25+ // First, clean up databases we explicitly tracked
26+ for ( const id of createdDbIds ) {
2127 try {
22- await dbService . deleteDatabase ( createdDbId ) ;
28+ await dbService . deleteDatabase ( id ) ;
2329 } catch ( e ) {
24- // Silently ignore "Database not found" errors - expected when test didn't create a DB
25- if ( ! ( e instanceof Error && e . message === "Database not found" ) ) {
26- console . warn ( "Cleanup failed:" , e ) ;
30+ // Ignore - may already be deleted
31+ }
32+ }
33+
34+ // Then, clean up any remaining test databases by name (safety net)
35+ try {
36+ const dbs = await dbService . listDatabases ( ) ;
37+ for ( const db of dbs ) {
38+ if ( TEST_DB_NAMES . includes ( db . name ) ) {
39+ try {
40+ await dbService . deleteDatabase ( db . id ) ;
41+ } catch ( e ) {
42+ // Ignore deletion errors during cleanup
43+ }
2744 }
2845 }
29- createdDbId = null ;
46+ } catch ( e ) {
47+ // Ignore errors during final cleanup
3048 }
3149 } ) ;
50+
3251 // Test Case 1: All required fields provided
3352 test ( "should add database when all required fields are provided" , async ( ) => {
3453 // Arrange
35- const dbService = new DatabaseService ( ) ;
3654 const payload = { ...mockInput } ;
3755 // Act
3856 const result = await dbService . addDatabase ( payload ) ;
39- createdDbId = result . id ;
57+ createdDbIds . push ( result . id ) ; // Track for cleanup
4058 // Assert
4159 expect ( result ) . toBeDefined ( ) ;
4260 expect ( result . name ) . toBe ( payload . name ) ;
@@ -46,7 +64,6 @@ describe("Database Service Method", () => {
4664
4765 test ( "should throw error when required field 'host' is missing" , async ( ) => {
4866 // Arrange
49- const dbService = new DatabaseService ( ) ;
5067 const { host, ...payload } = mockInput ;
5168 // Act & Assert
5269 await expect ( dbService . addDatabase ( payload ) ) . rejects . toThrow (
@@ -57,7 +74,6 @@ describe("Database Service Method", () => {
5774 // Test Case 3: Missing required field 'user'
5875 test ( "should throw error when required field 'user' is missing" , async ( ) => {
5976 // Arrange
60- const dbService = new DatabaseService ( ) ;
6177 const { user, ...payload } = mockInput ;
6278 // Act & Assert
6379 await expect ( dbService . addDatabase ( payload ) ) . rejects . toThrow (
@@ -68,7 +84,6 @@ describe("Database Service Method", () => {
6884 // Test Case 4: Missing required field 'database'
6985 test ( "should throw error when required field 'database' is missing" , async ( ) => {
7086 // Arrange
71- const dbService = new DatabaseService ( ) ;
7287 const { database, ...payload } = mockInput ;
7388 // Act & Assert
7489 await expect ( dbService . addDatabase ( payload ) ) . rejects . toThrow (
@@ -79,7 +94,6 @@ describe("Database Service Method", () => {
7994 // Test Case 5: Missing required field 'type'
8095 test ( "should throw error when required field 'type' is missing" , async ( ) => {
8196 // Arrange
82- const dbService = new DatabaseService ( ) ;
8397 const { type, ...payload } = mockInput ;
8498 // Act & Assert
8599 await expect ( dbService . addDatabase ( payload ) ) . rejects . toThrow (
@@ -90,7 +104,6 @@ describe("Database Service Method", () => {
90104 // Test Case 6: Missing required field 'name'
91105 test ( "should throw error when required field 'name' is missing" , async ( ) => {
92106 // Arrange
93- const dbService = new DatabaseService ( ) ;
94107 const { name, ...payload } = mockInput ;
95108 // Act & Assert
96109 await expect ( dbService . addDatabase ( payload ) ) . rejects . toThrow (
@@ -101,7 +114,6 @@ describe("Database Service Method", () => {
101114 // Test Case 7: Missing required field 'port'
102115 test ( "should throw error when required field 'port' is missing" , async ( ) => {
103116 // Arrange
104- const dbService = new DatabaseService ( ) ;
105117 const { port, ...payload } = mockInput ;
106118 // Act & Assert
107119 await expect ( dbService . addDatabase ( payload ) ) . rejects . toThrow (
@@ -112,7 +124,6 @@ describe("Database Service Method", () => {
112124 // Test Case 8 : List databases does not expose credentialId
113125 test ( "should not expose credentialId when listing databases" , async ( ) => {
114126 // Arrange
115- const dbService = new DatabaseService ( ) ;
116127 // Act
117128 const dbs = await dbService . listDatabases ( ) ;
118129 // Assert
@@ -124,7 +135,6 @@ describe("Database Service Method", () => {
124135 // Test Case 9: Get database connection for non-existent DB
125136 test ( "should throw error when getting connection for non-existent database" , async ( ) => {
126137 // Arrange
127- const dbService = new DatabaseService ( ) ;
128138 const fakeDbId = "nonexistent-id" ;
129139 // Act & Assert
130140 await expect ( dbService . getDatabaseConnection ( fakeDbId ) ) . rejects . toThrow (
@@ -135,7 +145,6 @@ describe("Database Service Method", () => {
135145 // Test Case 10: Update database with missing ID
136146 test ( "should throw error when updating database with missing ID" , async ( ) => {
137147 // Arrange
138- const dbService = new DatabaseService ( ) ;
139148 const payload = { name : "UpdatedName" } ;
140149 // Act & Assert
141150 await expect ( dbService . updateDatabase ( "" , payload ) ) . rejects . toThrow (
@@ -146,8 +155,41 @@ describe("Database Service Method", () => {
146155 // Test Case 11: Delete database with missing ID
147156 test ( "should throw error when deleting database with missing ID" , async ( ) => {
148157 // Arrange
149- const dbService = new DatabaseService ( ) ;
150158 // Act & Assert
151159 await expect ( dbService . deleteDatabase ( "" ) ) . rejects . toThrow ( "Missing id" ) ;
152160 } ) ;
161+
162+ // Test Case 12: Successfully delete an existing database
163+ test ( "should successfully delete an existing database" , async ( ) => {
164+ // Arrange
165+ const payload = { ...mockInput , name : "DeleteTestDB" } ;
166+
167+ // Act - Create a database first
168+ const createdDb = await dbService . addDatabase ( payload ) ;
169+ expect ( createdDb ) . toBeDefined ( ) ;
170+ expect ( createdDb . id ) . toBeDefined ( ) ;
171+
172+ // Verify it exists in the list
173+ let dbList = await dbService . listDatabases ( ) ;
174+ expect ( dbList . some ( ( db ) => db . id === createdDb . id ) ) . toBe ( true ) ;
175+
176+ // Act - Delete the database
177+ await dbService . deleteDatabase ( createdDb . id ) ;
178+
179+ // Assert - Verify it no longer exists in the list
180+ dbList = await dbService . listDatabases ( ) ;
181+ expect ( dbList . some ( ( db ) => db . id === createdDb . id ) ) . toBe ( false ) ;
182+
183+ // Note: No need to set createdDbId here since we already deleted it
184+ } ) ;
185+
186+ // Test Case 13: Delete non-existent database should throw error
187+ test ( "should throw error when deleting non-existent database" , async ( ) => {
188+ // Arrange
189+ const fakeDbId = "nonexistent-database-id" ;
190+ // Act & Assert
191+ await expect ( dbService . deleteDatabase ( fakeDbId ) ) . rejects . toThrow (
192+ "Database not found"
193+ ) ;
194+ } ) ;
153195} ) ;
0 commit comments