{"numFailedTestSuites":0,"numFailedTests":0,"numPassedTestSuites":7,"numPassedTests":55,"numPendingTestSuites":0,"numPendingTests":1,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":7,"numTotalTests":56,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1757071838814,"success":true,"testResults":[{"assertionResults":[{"ancestorTitles":["Header"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"Header should render the company logo","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should render the company logo"},{"ancestorTitles":["Header"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"Header should render all navigation links in desktop menu","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should render all navigation links in desktop menu"},{"ancestorTitles":["Header"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Header should render contact button with correct styling","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should render contact button with correct styling"},{"ancestorTitles":["Header"],"duration":17,"failureDetails":[],"failureMessages":[],"fullName":"Header should render hamburger menu button on mobile","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should render hamburger menu button on mobile"},{"ancestorTitles":["Header"],"duration":7,"failureDetails":[],"failureMessages":[],"fullName":"Header should have proper accessibility attributes","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should have proper accessibility attributes"},{"ancestorTitles":["Header"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Header should render with proper semantic structure","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should render with proper semantic structure"},{"ancestorTitles":["Header"],"duration":33,"failureDetails":[],"failureMessages":[],"fullName":"Header should toggle mobile menu when hamburger button is clicked","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should toggle mobile menu when hamburger button is clicked"},{"ancestorTitles":["Header"],"duration":32,"failureDetails":[],"failureMessages":[],"fullName":"Header should close mobile menu when navigation link is clicked","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should close mobile menu when navigation link is clicked"},{"ancestorTitles":["Header"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Header should have correct navigation links with proper hrefs","invocations":1,"location":null,"numPassingAsserts":8,"retryReasons":[],"status":"passed","title":"should have correct navigation links with proper hrefs"},{"ancestorTitles":["Header"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Header should have proper responsive classes","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should have proper responsive classes"}],"endTime":1757071839539,"message":"","name":"/Users/isari/Projects/Private/github/websitedev/proto/src/components/Header.test.tsx","startTime":1757071839145,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Site Config","getSiteConfig"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Site Config getSiteConfig should return MongoDB config when available","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should return MongoDB config when available"},{"ancestorTitles":["Site Config","getSiteConfig"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Site Config getSiteConfig should return static config when MongoDB config not found","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return static config when MongoDB config not found"},{"ancestorTitles":["Site Config","getSiteConfig"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Site Config getSiteConfig should return static config when MongoDB is unavailable","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return static config when MongoDB is unavailable"},{"ancestorTitles":["Site Config","saveSiteConfig"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Site Config saveSiteConfig should save config to MongoDB successfully","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should save config to MongoDB successfully"},{"ancestorTitles":["Site Config","saveSiteConfig"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Site Config saveSiteConfig should return false when save fails","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return false when save fails"},{"ancestorTitles":["Site Config","initializeDefaultConfig"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Site Config initializeDefaultConfig should initialize default config when none exists","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should initialize default config when none exists"},{"ancestorTitles":["Site Config","initializeDefaultConfig"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Site Config initializeDefaultConfig should not initialize when config already exists","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should not initialize when config already exists"},{"ancestorTitles":["Site Config","initializeDefaultConfig"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Site Config initializeDefaultConfig should handle initialization errors gracefully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle initialization errors gracefully"}],"endTime":1757071839579,"message":"","name":"/Users/isari/Projects/Private/github/websitedev/proto/src/lib/site-config.test.ts","startTime":1757071839544,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Footer"],"duration":4,"failureDetails":[],"failureMessages":[],"fullName":"Footer should render company information","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should render company information"},{"ancestorTitles":["Footer"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Footer should render email and company details","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should render email and company details"},{"ancestorTitles":["Footer"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Footer should render navigation links","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should render navigation links"},{"ancestorTitles":["Footer"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Footer should render service sections","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should render service sections"},{"ancestorTitles":["Footer"],"duration":5,"failureDetails":[],"failureMessages":[],"fullName":"Footer should render copyright notice with dynamic year","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should render copyright notice with dynamic year"},{"ancestorTitles":["Footer"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Footer should render legal links","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should render legal links"},{"ancestorTitles":["Footer"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Footer should render with proper grid layout","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should render with proper grid layout"},{"ancestorTitles":["Footer"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"Footer should render with proper semantic structure","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should render with proper semantic structure"}],"endTime":1757071839656,"message":"","name":"/Users/isari/Projects/Private/github/websitedev/proto/src/components/Footer.test.tsx","startTime":1757071839583,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["Logger"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Logger should create logger with correct configuration","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should create logger with correct configuration"},{"ancestorTitles":["Logger"],"duration":null,"failureDetails":[],"failureMessages":[],"fullName":"Logger should include Loki transport when LOKI_HOST is provided","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"pending","title":"should include Loki transport when LOKI_HOST is provided"},{"ancestorTitles":["Logger"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Logger should create component loggers with correct metadata","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should create component loggers with correct metadata"},{"ancestorTitles":["Logger"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"Logger should generate request IDs in correct format","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should generate request IDs in correct format"},{"ancestorTitles":["Logger"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"Logger should handle timing operations correctly","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should handle timing operations correctly"},{"ancestorTitles":["Logger"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"Logger should handle timing operation failures","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should handle timing operation failures"}],"endTime":1757071839698,"message":"","name":"/Users/isari/Projects/Private/github/websitedev/proto/src/lib/logger.test.ts","startTime":1757071839660,"status":"focused","summary":""},{"assertionResults":[{"ancestorTitles":["MongoDB Connection (Unit Tests)","MongoDB URI validation"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"MongoDB Connection (Unit Tests) MongoDB URI validation should throw error when MONGODB_URI is not set","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should throw error when MONGODB_URI is not set"},{"ancestorTitles":["MongoDB Connection (Unit Tests)","Database connection"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"MongoDB Connection (Unit Tests) Database connection should create MongoClient with correct URI and options","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should create MongoClient with correct URI and options"},{"ancestorTitles":["MongoDB Connection (Unit Tests)","Database connection"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"MongoDB Connection (Unit Tests) Database connection should return database instance","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return database instance"},{"ancestorTitles":["MongoDB Connection (Unit Tests)","Database connection"],"duration":2,"failureDetails":[],"failureMessages":[],"fullName":"MongoDB Connection (Unit Tests) Database connection should return collection from database","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should return collection from database"},{"ancestorTitles":["MongoDB Connection (Unit Tests)","Database connection"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"MongoDB Connection (Unit Tests) Database connection should check MongoDB connection successfully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should check MongoDB connection successfully"},{"ancestorTitles":["MongoDB Connection (Unit Tests)","Database connection"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"MongoDB Connection (Unit Tests) Database connection should return false on MongoDB connection failure","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should return false on MongoDB connection failure"},{"ancestorTitles":["MongoDB Connection (Unit Tests)","Connection reuse and caching"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"MongoDB Connection (Unit Tests) Connection reuse and caching should reuse the same MongoClient instance for multiple calls","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should reuse the same MongoClient instance for multiple calls"}],"endTime":1757071839735,"message":"","name":"/Users/isari/Projects/Private/github/websitedev/proto/src/lib/mongodb.test.ts","startTime":1757071839702,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["/api/health","GET request"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"/api/health GET request should return successful health status with required data","invocations":1,"location":null,"numPassingAsserts":10,"retryReasons":[],"status":"passed","title":"should return successful health status with required data"},{"ancestorTitles":["/api/health","GET request"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/health GET request should include correct Cache-Control headers","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should include correct Cache-Control headers"},{"ancestorTitles":["/api/health","GET request"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"/api/health GET request should handle errors gracefully","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should handle errors gracefully"},{"ancestorTitles":["/api/health","HEAD request"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/health HEAD request should return 200 status without body","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should return 200 status without body"}],"endTime":1757071839770,"message":"","name":"/Users/isari/Projects/Private/github/websitedev/proto/src/app/api/health/route.test.ts","startTime":1757071839740,"status":"passed","summary":""},{"assertionResults":[{"ancestorTitles":["/api/contact Unit Tests","Input validation logic"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Input validation logic should validate required fields","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should validate required fields"},{"ancestorTitles":["/api/contact Unit Tests","Input validation logic"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Input validation logic TC-001: should detect invalid email formats","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"TC-001: should detect invalid email formats"},{"ancestorTitles":["/api/contact Unit Tests","Input validation logic"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Input validation logic should validate field lengths","invocations":1,"location":null,"numPassingAsserts":6,"retryReasons":[],"status":"passed","title":"should validate field lengths"},{"ancestorTitles":["/api/contact Unit Tests","Spam detection logic"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Spam detection logic should detect spam keywords","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should detect spam keywords"},{"ancestorTitles":["/api/contact Unit Tests","Spam detection logic"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Spam detection logic should allow legitimate business content","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should allow legitimate business content"},{"ancestorTitles":["/api/contact Unit Tests","Input sanitization logic"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Input sanitization logic should handle potentially dangerous characters","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should handle potentially dangerous characters"},{"ancestorTitles":["/api/contact Unit Tests","Input sanitization logic"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Input sanitization logic should preserve safe HTML entities","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should preserve safe HTML entities"},{"ancestorTitles":["/api/contact Unit Tests","Rate limiting logic"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Rate limiting logic should implement rate limiting concept","invocations":1,"location":null,"numPassingAsserts":2,"retryReasons":[],"status":"passed","title":"should implement rate limiting concept"},{"ancestorTitles":["/api/contact Unit Tests","Response format validation"],"duration":3,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Response format validation should validate success response structure","invocations":1,"location":null,"numPassingAsserts":5,"retryReasons":[],"status":"passed","title":"should validate success response structure"},{"ancestorTitles":["/api/contact Unit Tests","Response format validation"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Response format validation should validate error response structure","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should validate error response structure"},{"ancestorTitles":["/api/contact Unit Tests","Business logic helpers"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Business logic helpers should validate GDPR consent requirement","invocations":1,"location":null,"numPassingAsserts":4,"retryReasons":[],"status":"passed","title":"should validate GDPR consent requirement"},{"ancestorTitles":["/api/contact Unit Tests","Business logic helpers"],"duration":1,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Business logic helpers should generate proper timestamps","invocations":1,"location":null,"numPassingAsserts":3,"retryReasons":[],"status":"passed","title":"should generate proper timestamps"},{"ancestorTitles":["/api/contact Unit Tests","Business logic helpers"],"duration":0,"failureDetails":[],"failureMessages":[],"fullName":"/api/contact Unit Tests Business logic helpers should handle IP address extraction logic","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"should handle IP address extraction logic"}],"endTime":1757071839828,"message":"","name":"/Users/isari/Projects/Private/github/websitedev/proto/src/app/api/contact/route.unit.test.ts","startTime":1757071839775,"status":"passed","summary":""}],"wasInterrupted":false}