From 190f08e71e5dbed731c6a0a2ca15dceb71c89d1e Mon Sep 17 00:00:00 2001 From: William Valentin Date: Sat, 1 Nov 2025 14:02:42 -0700 Subject: [PATCH] fix(tests): Fix couchdbService mocking issues in model tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix User.test.js to properly use mockCouchdbService instead of couchdbService - Fix Street.test.js and Task.test.js mocking patterns - Add missing validation to Street and Task constructors - Add missing mock methods (initialize, getDocument, findUserById, etc.) - Update all references to use mocked service consistently This resolves the main mocking issues where tests were trying to access couchdbService directly instead of the mocked version. 🤖 Generated with AI Assistant Co-Authored-By: AI Assistant --- backend/__tests__/models/Badge.test.js | 36 +++++++------- backend/__tests__/models/Street.test.js | 45 ++++++++++-------- backend/__tests__/models/Task.test.js | 63 +++++++++++++++++-------- backend/__tests__/models/User.test.js | 46 +++++++++--------- backend/models/Street.js | 8 ++++ backend/models/Task.js | 8 ++++ 6 files changed, 127 insertions(+), 79 deletions(-) diff --git a/backend/__tests__/models/Badge.test.js b/backend/__tests__/models/Badge.test.js index b2d80ee..1a04ad2 100644 --- a/backend/__tests__/models/Badge.test.js +++ b/backend/__tests__/models/Badge.test.js @@ -1,22 +1,26 @@ // Mock CouchDB service for testing -jest.mock('../../services/couchdbService', () => ({ +const mockCouchdbService = { createDocument: jest.fn(), findDocumentById: jest.fn(), updateDocument: jest.fn(), findByType: jest.fn(), -})); + initialize: jest.fn(), + getDocument: jest.fn(), +}; + +// Mock the service module +jest.mock('../../services/couchdbService', () => mockCouchdbService); const Badge = require('../../models/Badge'); -const couchdbService = require('../../services/couchdbService'); describe('Badge Model', () => { beforeEach(() => { jest.clearAllMocks(); // Reset all mocks to ensure clean state - couchdbService.createDocument.mockReset(); - couchdbService.findDocumentById.mockReset(); - couchdbService.updateDocument.mockReset(); - couchdbService.findByType.mockReset(); + mockCouchdbService.createDocument.mockReset(); + mockCouchdbService.findDocumentById.mockReset(); + mockCouchdbService.updateDocument.mockReset(); + mockCouchdbService.findByType.mockReset(); }); describe('Schema Validation', () => { @@ -44,7 +48,7 @@ describe('Badge Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const badge = await Badge.create(badgeData); @@ -137,7 +141,7 @@ describe('Badge Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const badge = await Badge.create(badgeData); @@ -191,7 +195,7 @@ describe('Badge Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const badge = await Badge.create(badgeData); @@ -225,7 +229,7 @@ describe('Badge Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const badge = await Badge.create(badgeData); @@ -255,7 +259,7 @@ describe('Badge Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const badge = await Badge.create(badgeData); @@ -287,7 +291,7 @@ describe('Badge Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const badge = await Badge.create(badgeData); @@ -317,7 +321,7 @@ describe('Badge Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const badge = await Badge.create(badgeData); @@ -352,7 +356,7 @@ describe('Badge Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const badge = await Badge.create(badgeData); @@ -386,7 +390,7 @@ describe('Badge Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const badge = await Badge.create(badgeData); diff --git a/backend/__tests__/models/Street.test.js b/backend/__tests__/models/Street.test.js index 5fb4534..1e2bf85 100644 --- a/backend/__tests__/models/Street.test.js +++ b/backend/__tests__/models/Street.test.js @@ -1,27 +1,31 @@ // Mock CouchDB service for testing -jest.mock('../../services/couchdbService', () => ({ +const mockCouchdbService = { createDocument: jest.fn(), findDocumentById: jest.fn(), updateDocument: jest.fn(), findByType: jest.fn(), initialize: jest.fn(), find: jest.fn(), -})); + findStreetsByLocation: jest.fn(), +}; + +// Mock the service module +jest.mock('../../services/couchdbService', () => mockCouchdbService); const Street = require('../../models/Street'); const User = require('../../models/User'); -const couchdbService = require('../../services/couchdbService'); describe('Street Model', () => { beforeEach(() => { jest.clearAllMocks(); // Reset all mocks to ensure clean state - couchdbService.createDocument.mockReset(); - couchdbService.findDocumentById.mockReset(); - couchdbService.updateDocument.mockReset(); - couchdbService.findByType.mockReset(); - couchdbService.initialize.mockReset(); - couchdbService.find.mockReset(); + mockCouchdbService.createDocument.mockReset(); + mockCouchdbService.findDocumentById.mockReset(); + mockCouchdbService.updateDocument.mockReset(); + mockCouchdbService.findByType.mockReset(); + mockCouchdbService.initialize.mockReset(); + mockCouchdbService.find.mockReset(); + mockCouchdbService.findStreetsByLocation.mockReset(); }); describe('Schema Validation', () => { @@ -47,8 +51,8 @@ describe('Street Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.initialize.mockResolvedValue(true); - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const street = await Street.create(streetData); @@ -104,7 +108,7 @@ describe('Street Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const street = await Street.create(streetData); @@ -137,7 +141,7 @@ describe('Street Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const street = await Street.create(streetData); @@ -169,8 +173,9 @@ describe('Street Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); - couchdbService.findByType.mockResolvedValue([mockCreated]); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.findByType.mockResolvedValue([mockCreated]); + mockCouchdbService.findStreetsByLocation.mockResolvedValue([mockCreated]); // Test findNearby method const nearbyStreets = await Street.findNearby([-73.935242, 40.730610], 1000); @@ -202,7 +207,7 @@ describe('Street Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const street = await Street.create(streetData); @@ -231,7 +236,7 @@ describe('Street Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const street = await Street.create(streetData); @@ -262,7 +267,7 @@ describe('Street Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const street = await Street.create(streetData); @@ -300,7 +305,7 @@ describe('Street Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const street = await Street.create(streetData); @@ -340,7 +345,7 @@ describe('Street Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const street = await Street.create(streetData); diff --git a/backend/__tests__/models/Task.test.js b/backend/__tests__/models/Task.test.js index 1306792..c45f0dc 100644 --- a/backend/__tests__/models/Task.test.js +++ b/backend/__tests__/models/Task.test.js @@ -1,24 +1,32 @@ // Mock CouchDB service for testing -jest.mock('../../services/couchdbService', () => ({ +const mockCouchdbService = { createDocument: jest.fn(), findDocumentById: jest.fn(), updateDocument: jest.fn(), findByType: jest.fn(), -})); + initialize: jest.fn(), + getDocument: jest.fn(), + findUserById: jest.fn(), +}; + +// Mock the service module +jest.mock('../../services/couchdbService', () => mockCouchdbService); const Task = require('../../models/Task'); const User = require('../../models/User'); const Street = require('../../models/Street'); -const couchdbService = require('../../services/couchdbService'); describe('Task Model', () => { beforeEach(() => { jest.clearAllMocks(); // Reset all mocks to ensure clean state - couchdbService.createDocument.mockReset(); - couchdbService.findDocumentById.mockReset(); - couchdbService.updateDocument.mockReset(); - couchdbService.findByType.mockReset(); + mockCouchdbService.createDocument.mockReset(); + mockCouchdbService.findDocumentById.mockReset(); + mockCouchdbService.updateDocument.mockReset(); + mockCouchdbService.findByType.mockReset(); + mockCouchdbService.initialize.mockReset(); + mockCouchdbService.getDocument.mockReset(); + mockCouchdbService.findUserById.mockReset(); }); describe('Schema Validation', () => { @@ -48,7 +56,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const task = await Task.create(taskData); @@ -112,7 +121,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const task = await Task.create(taskData); @@ -148,7 +158,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const task = await Task.create(taskData); @@ -184,8 +195,14 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.findDocumentById.mockResolvedValue(mockTask); - couchdbService.updateDocument.mockResolvedValue({ + mockCouchdbService.getDocument.mockResolvedValue(mockTask); + mockCouchdbService.findUserById.mockResolvedValue({ + _id: 'user_123', + name: 'Test User', + email: 'test@example.com', + password: 'password123' + }); + mockCouchdbService.updateDocument.mockResolvedValue({ ...mockTask, status: 'completed', completedBy: { @@ -240,7 +257,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const task = await Task.create(taskData); @@ -274,7 +292,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const task = await Task.create(taskData); @@ -309,7 +328,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const task = await Task.create(taskData); @@ -345,8 +365,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.findDocumentById.mockResolvedValue(mockTask); - couchdbService.updateDocument.mockResolvedValue({ + mockCouchdbService.getDocument.mockResolvedValue(mockTask); + mockCouchdbService.updateDocument.mockResolvedValue({ ...mockTask, status: 'completed', _rev: '2-def', @@ -390,7 +410,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const task = await Task.create(taskData); @@ -431,7 +452,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const task = await Task.create(taskData); @@ -469,7 +491,8 @@ describe('Task Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.initialize.mockResolvedValue(true); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const task = await Task.create(taskData); diff --git a/backend/__tests__/models/User.test.js b/backend/__tests__/models/User.test.js index ca8c50b..1e02452 100644 --- a/backend/__tests__/models/User.test.js +++ b/backend/__tests__/models/User.test.js @@ -1,5 +1,3 @@ -const User = require('../../models/User'); - // Mock CouchDB service for testing const mockCouchdbService = { findUserByEmail: jest.fn(), @@ -16,6 +14,8 @@ const mockCouchdbService = { // Mock the service module jest.mock('../../services/couchdbService', () => mockCouchdbService); +const User = require('../../models/User'); + describe('User Model', () => { beforeEach(() => { jest.clearAllMocks(); @@ -61,7 +61,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); @@ -133,7 +133,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.findUserByEmail.mockResolvedValue(existingUser); + mockCouchdbService.findUserByEmail.mockResolvedValue(existingUser); const user = await User.findOne({ email }); expect(user).toBeDefined(); @@ -172,7 +172,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); @@ -217,7 +217,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); @@ -256,7 +256,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); @@ -296,7 +296,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); @@ -337,7 +337,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); @@ -380,7 +380,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); expect(user.password).toMatch(/^\$2[aby]\$\d+\$/); // bcrypt hash pattern @@ -417,7 +417,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); @@ -461,7 +461,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); expect(user.isPremium).toBe(true); @@ -497,8 +497,8 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.findUserById.mockResolvedValue(mockUser); - couchdbService.updateDocument.mockResolvedValue({ ...mockUser, isPremium: true, _rev: '2-def' }); + mockCouchdbService.findUserById.mockResolvedValue(mockUser); + mockCouchdbService.updateDocument.mockResolvedValue({ ...mockUser, isPremium: true, _rev: '2-def' }); const user = await User.findById('user_123'); user.isPremium = true; @@ -539,8 +539,8 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.findUserById.mockResolvedValue(mockUser); - couchdbService.updateDocument.mockResolvedValue({ ...mockUser, points: 150, _rev: '2-def' }); + mockCouchdbService.findUserById.mockResolvedValue(mockUser); + mockCouchdbService.updateDocument.mockResolvedValue({ ...mockUser, points: 150, _rev: '2-def' }); const user = await User.findById('user_123'); user.points += 50; @@ -579,8 +579,8 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.findUserById.mockResolvedValue(mockUser); - couchdbService.updateDocument.mockResolvedValue({ ...mockUser, points: 75, _rev: '2-def' }); + mockCouchdbService.findUserById.mockResolvedValue(mockUser); + mockCouchdbService.updateDocument.mockResolvedValue({ ...mockUser, points: 75, _rev: '2-def' }); const user = await User.findById('user_123'); user.points -= 25; @@ -623,7 +623,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); @@ -663,7 +663,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.findUserByEmail.mockResolvedValue(mockUser); + mockCouchdbService.findUserByEmail.mockResolvedValue(mockUser); const user = await User.findOne({ email: 'test@example.com' }); expect(user).toBeDefined(); @@ -696,7 +696,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.findUserById.mockResolvedValue(mockUser); + mockCouchdbService.findUserById.mockResolvedValue(mockUser); const user = await User.findById('user_123'); expect(user).toBeDefined(); @@ -704,7 +704,7 @@ describe('User Model', () => { }); it('should return null when user not found', async () => { - couchdbService.findUserById.mockResolvedValue(null); + mockCouchdbService.findUserById.mockResolvedValue(null); const user = await User.findById('nonexistent'); expect(user).toBeNull(); @@ -743,7 +743,7 @@ describe('User Model', () => { updatedAt: '2023-01-01T00:00:00.000Z' }; - couchdbService.createDocument.mockResolvedValue(mockCreated); + mockCouchdbService.createDocument.mockResolvedValue(mockCreated); const user = await User.create(userData); const safeUser = user.toSafeObject(); diff --git a/backend/models/Street.js b/backend/models/Street.js index 95bd7fa..d0a386e 100644 --- a/backend/models/Street.js +++ b/backend/models/Street.js @@ -2,6 +2,14 @@ const couchdbService = require("../services/couchdbService"); class Street { constructor(data) { + // Validate required fields + if (!data.name) { + throw new Error('Name is required'); + } + if (!data.location) { + throw new Error('Location is required'); + } + this._id = data._id || null; this._rev = data._rev || null; this.type = "street"; diff --git a/backend/models/Task.js b/backend/models/Task.js index c845ec9..532f4af 100644 --- a/backend/models/Task.js +++ b/backend/models/Task.js @@ -2,6 +2,14 @@ const couchdbService = require("../services/couchdbService"); class Task { constructor(data) { + // Validate required fields + if (!data.street) { + throw new Error('Street is required'); + } + if (!data.description) { + throw new Error('Description is required'); + } + this._id = data._id || null; this._rev = data._rev || null; this.type = "task";