All files / src/app/models model.mock.js

92.85% Statements 39/42
76.92% Branches 10/13
90% Functions 9/10
95% Lines 38/40

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117      4x         4x         4x 38x 38x 25x     13x             4x                 4x   38x 38x   38x 42x     38x           4x 50x 43x   13x 13x       7x 7x       7x       5x       7x           50x     4x 37x       37x       37x 37x   37x     4x 39x   39x     4x           4x       4x 4x      
import { Types } from "mongoose";
 
// Facade
const ModelMock = {};
 
/*
 *  STUBS
 */
ModelMock.collection = {};
 
/*
 * MONGOOSE_MODEL CLASS
 */
ModelMock.GooseModel = class {
    findById = jest.fn(async (id) => {
        if (id) {
            return ModelMock.collection[id];
        }
 
        return {};
    });
};
 
/*
 * MODEL OBJECT
 */
ModelMock.object = {
    save: jest.fn(),
    delete: jest.fn(),
    find: jest.fn(),
};
 
/*
 * MODEL CLASS
 */
ModelMock.Class = jest.fn(async (id) => {
    // All models have an async constructor
    const _model = new ModelMock.GooseModel();
    const _doc = await _model.findById(id);
 
    for (let k in _doc) {
        ModelMock.object[k] = _doc[k];
    }
 
    return ModelMock.object;
});
 
/*
 * HELPERS
 */
ModelMock.clearModelObject = (clearSpies = true) => {
    if (clearSpies) {
        ModelMock.object = {
            save: jest.fn(() => {
                ModelMock.object._id = ModelMock.object._id ? ModelMock.object._id : new Types.ObjectId();
                ModelMock.addDocToCollection(ModelMock.object._id, ModelMock.object);
            }),
 
            delete: (deleteSpy = jest.fn(() => {
                Eif (ModelMock.collection[ModelMock.object._id]) {
                    delete ModelMock.collection[ModelMock.object._id];
                }
 
                // When deleting a doc, clears the model's properties but keep the state of the spies
                ModelMock.clearModelObject(false);
            })),
 
            find: jest.fn(async (query) => {
                return Object.values(ModelMock.collection);
            }),
        };
    } else {
        ModelMock.object = {
            save: ModelMock.object.save,
            delete: ModelMock.object.delete,
        };
    }
 
    return ModelMock;
};
 
ModelMock.addDocToCollection = (id, doc) => {
    Iif (typeof id == "undefined") {
        throw "An ID must be given";
    }
 
    Iif (typeof doc !== "object") {
        throw "Doc must be an object";
    }
 
    ModelMock.collection[id] = doc;
    ModelMock.collection[id]._id = id;
 
    return ModelMock;
};
 
ModelMock.clearCollection = (id, doc) => {
    ModelMock.collection = {};
 
    return ModelMock;
};
 
ModelMock.clearModelObject();
 
/*
 *  IMPORTS
 *  See: https://jestjs.io/docs/ecmascript-modules#module-mocking-in-esm
 */
jest.unstable_mockModule("@models/model.js", () => ({
    default: ModelMock.Class,
}));
 
const mongoose = (await import("mongoose")).default;
mongoose.model = jest.fn(() => ModelMock.GooseModel);
 
export default ModelMock;