Project

General

Profile

Improvement #218

Updated by Chakkaphon Noinang (Jay) 10 days ago

# 1.ลบ folder test 

 # 2.แก้ไฟล์ 2.แกไฟล์ jest.config 
 ```javascript 
 module.exports = { 
     preset: "ts-jest", 
     testEnvironment: "node", 
     moduleFileExtensions: ["js", "json", "ts"], 

     rootDir: ".", 
     testRegex: String.raw`.*\.spec\.ts$`, 

     collectCoverage: true, 
     coverageDirectory: "coverage", 
     coverageReporters: ["text", "lcov"], 

     collectCoverageFrom: [ 
         "src/**/*.ts", 
         "!src/main.ts", 
         "!src/app.module.ts", 
         "!src/**/*.module.ts", 
         "!src/**/*.dto.ts", 
         "!src/**/*.type.ts", 
         "!src/shared/logger/**", 
         "!src/**/*.constant.ts", 
         "!src/**/index.ts", 
     ], 

     testPathIgnorePatterns: ["/node_modules/", "/dist/"], 
     coveragePathIgnorePatterns: ["/node_modules/", "/dist/"], 

     clearMocks: true, 
     restoreMocks: true, 
     resetMocks: true, 

     moduleNameMapper: { 
         "^@shared/(.*)$": "<rootDir>/src/shared/$1", 
         "^@modules/(.*)$": "<rootDir>/src/modules/$1", 
         "^@infrastructure/(.*)$": "<rootDir>/src/infrastructure/$1", 
         "^@config/(.*)$": "<rootDir>/src/config/$1", 
     }, 
 }; 
 ``` 
 # 3.เพิ่มไฟล์ pg.provider.spec.ts ที่ src/infrastructure/pg 
 ```javascript 
 import { Test, TestingModule } from "@nestjs/testing"; 
 import { Pool } from "pg"; 
 import { DatabaseModule } from "./pg.provider"; 
 import { AppEnv } from "../../../config/env"; 

 jest.mock("pg", () => { 
   return { 
     Pool: jest.fn().mockImplementation(() => { 
       return { 
         query: jest.fn(), 
         connect: jest.fn(), 
         end: jest.fn(), 
       }; 
     }), 
   }; 
 }); 

 jest.mock("../../../config/env", () => ({ 
   AppEnv: { 
     DB_HOST: "localhost", 
     DB_PORT: 5432, 
     DB_USERNAME: "testuser", 
     DB_PASSWORD: "testpass", 
     DB_NAME: "testdb", 
   }, 
 })); 

 describe("DatabaseModule", () => { 
   let module: TestingModule; 
   let poolInstance: Pool; 

   beforeEach(async () => { 
     jest.clearAllMocks(); 

     module = await Test.createTestingModule({ 
       imports: [DatabaseModule], 
     }).compile(); 

     poolInstance = module.get<Pool>("PG_POOL"); 
   }); 

   afterEach(async () => { 
     if (module) { 
       await module.close(); 
     } 
   }); 

   describe("Module Configuration", () => { 
     it("should be defined", () => { 
       expect(module).toBeDefined(); 
     }); 

     it("should provide PG_POOL", () => { 
       expect(poolInstance).toBeDefined(); 
     }); 

     it("should create Pool instance with correct configuration", () => { 
       expect(Pool).toHaveBeenCalledWith({ 
         host: AppEnv.DB_HOST, 
         port: AppEnv.DB_PORT, 
         user: AppEnv.DB_USERNAME, 
         password: AppEnv.DB_PASSWORD, 
         database: AppEnv.DB_NAME, 
       }); 
     }); 

     it("should create Pool with expected database host", () => { 
       expect(Pool).toHaveBeenCalledWith( 
         expect.objectContaining({ 
           host: "localhost", 
         }), 
       ); 
     }); 

     it("should create Pool with expected database port", () => { 
       expect(Pool).toHaveBeenCalledWith( 
         expect.objectContaining({ 
           port: 5432, 
         }), 
       ); 
     }); 

     it("should create Pool with expected database username", () => { 
       expect(Pool).toHaveBeenCalledWith( 
         expect.objectContaining({ 
           user: "testuser", 
         }), 
       ); 
     }); 

     it("should create Pool with expected database password", () => { 
       expect(Pool).toHaveBeenCalledWith( 
         expect.objectContaining({ 
           password: "testpass", 
         }), 
       ); 
     }); 

     it("should create Pool with expected database name", () => { 
       expect(Pool).toHaveBeenCalledWith( 
         expect.objectContaining({ 
           database: "testdb", 
         }), 
       ); 
     }); 
   }); 

   describe("Provider Exports", () => { 
     it("should export PG_POOL provider", () => { 
       const moduleRef = module.get<Pool>("PG_POOL"); 
       expect(moduleRef).toBeDefined(); 
     }); 

     it("should have DatabaseModule defined", () => { 
       expect(DatabaseModule).toBeDefined(); 
     }); 
   }); 

   describe("Pool Instance Methods", () => { 
     it("should return pool instance from module", () => { 
       expect(poolInstance).toBeDefined(); 
       expect(poolInstance).toBeTruthy(); 
     }); 

     it("should be injectable as PG_POOL token", async () => { 
       const testModule = await Test.createTestingModule({ 
         imports: [DatabaseModule], 
       }).compile(); 

       const pool = testModule.get<Pool>("PG_POOL"); 
       expect(pool).toBeDefined(); 

       await testModule.close(); 
     }); 
   }); 

   describe("Factory Function", () => { 
     it("should call useFactory when module is compiled", () => { 
       expect(Pool).toHaveBeenCalled(); 
     }); 

     it("should create only one Pool instance per module", () => { 
       const pool1 = module.get<Pool>("PG_POOL"); 
       const pool2 = module.get<Pool>("PG_POOL"); 
       expect(pool1).toBe(pool2); 
     }); 
   }); 
 }); 
 ``` 

 # 4.เพิ่ม4ไฟล์ตามไฟล์ http-spec.zip และ recheck อีกครั้งว่าใน folder มีไฟล์ .ts เท่ากันไฟล์ .spec ไหม 
 - all-exceptions.filter.spec.ts 
 - response-envelope.interceptor.spec.ts 
 - response-envelope.spec.ts 
 - skip-envelope.decorator.spec.ts

Back