mirror of
				https://github.com/strapi/strapi.git
				synced 2025-11-04 03:43:34 +00:00 
			
		
		
		
	Migrate missing tests to ts
This commit is contained in:
		
							parent
							
								
									646a1f0b83
								
							
						
					
					
						commit
						1cefae94ca
					
				@ -1,245 +0,0 @@
 | 
				
			|||||||
"use strict";
 | 
					 | 
				
			||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
 | 
					 | 
				
			||||||
    return (mod && mod.__esModule) ? mod : { "default": mod };
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
					 | 
				
			||||||
const content_api_1 = __importDefault(require("../content-api"));
 | 
					 | 
				
			||||||
describe('Content API - Permissions', () => {
 | 
					 | 
				
			||||||
    const bindToContentAPI = (action) => {
 | 
					 | 
				
			||||||
        Object.assign(action, { [Symbol.for('__type__')]: ['content-api'] });
 | 
					 | 
				
			||||||
        return action;
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    describe('Get Actions Map', () => {
 | 
					 | 
				
			||||||
        test('When no API are defined, it should return an empty object', () => {
 | 
					 | 
				
			||||||
            global.strapi = {};
 | 
					 | 
				
			||||||
            const contentAPI = (0, content_api_1.default)(global.strapi);
 | 
					 | 
				
			||||||
            const actionsMap = contentAPI.permissions.getActionsMap();
 | 
					 | 
				
			||||||
            expect(actionsMap).toEqual({});
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        test('When no controller are defined for an API, it should ignore the API', () => {
 | 
					 | 
				
			||||||
            global.strapi = {
 | 
					 | 
				
			||||||
                api: {
 | 
					 | 
				
			||||||
                    foo: {},
 | 
					 | 
				
			||||||
                    bar: {},
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            const contentAPI = (0, content_api_1.default)(global.strapi);
 | 
					 | 
				
			||||||
            const actionsMap = contentAPI.permissions.getActionsMap();
 | 
					 | 
				
			||||||
            expect(actionsMap).toEqual({});
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        test(`Do not register controller if they're not bound to the content API`, () => {
 | 
					 | 
				
			||||||
            const actionC = () => { };
 | 
					 | 
				
			||||||
            Object.assign(actionC, { [Symbol.for('__type__')]: ['admin-api'] });
 | 
					 | 
				
			||||||
            global.strapi = {
 | 
					 | 
				
			||||||
                api: {
 | 
					 | 
				
			||||||
                    foo: {
 | 
					 | 
				
			||||||
                        controllers: {
 | 
					 | 
				
			||||||
                            controllerA: {
 | 
					 | 
				
			||||||
                                actionA: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                                actionB() { },
 | 
					 | 
				
			||||||
                                actionC,
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            const contentAPI = (0, content_api_1.default)(global.strapi);
 | 
					 | 
				
			||||||
            const actionsMap = contentAPI.permissions.getActionsMap();
 | 
					 | 
				
			||||||
            expect(actionsMap).toEqual({
 | 
					 | 
				
			||||||
                'api::foo': { controllers: { controllerA: ['actionA'] } },
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        test('Creates and populate a map of actions from APIs and plugins', () => {
 | 
					 | 
				
			||||||
            global.strapi = {
 | 
					 | 
				
			||||||
                api: {
 | 
					 | 
				
			||||||
                    foo: {
 | 
					 | 
				
			||||||
                        controllers: {
 | 
					 | 
				
			||||||
                            controllerA: {
 | 
					 | 
				
			||||||
                                actionA: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                                actionB: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    bar: {
 | 
					 | 
				
			||||||
                        controllers: {
 | 
					 | 
				
			||||||
                            controllerA: {
 | 
					 | 
				
			||||||
                                actionA: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                                actionB: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    foobar: {
 | 
					 | 
				
			||||||
                        controllers: {
 | 
					 | 
				
			||||||
                            controllerA: {
 | 
					 | 
				
			||||||
                                actionA: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                                actionB: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                            controllerB: {
 | 
					 | 
				
			||||||
                                actionC: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                                actionD: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                plugins: {
 | 
					 | 
				
			||||||
                    foo: {
 | 
					 | 
				
			||||||
                        controllers: {
 | 
					 | 
				
			||||||
                            controllerA: {
 | 
					 | 
				
			||||||
                                actionA: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                                actionB: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    bar: {
 | 
					 | 
				
			||||||
                        controllers: {
 | 
					 | 
				
			||||||
                            controllerA: {
 | 
					 | 
				
			||||||
                                actionA: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                                actionB: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            const contentAPI = (0, content_api_1.default)(global.strapi);
 | 
					 | 
				
			||||||
            const actionsMap = contentAPI.permissions.getActionsMap();
 | 
					 | 
				
			||||||
            expect(actionsMap).toEqual({
 | 
					 | 
				
			||||||
                'api::foo': { controllers: { controllerA: ['actionA', 'actionB'] } },
 | 
					 | 
				
			||||||
                'api::bar': { controllers: { controllerA: ['actionA', 'actionB'] } },
 | 
					 | 
				
			||||||
                'api::foobar': {
 | 
					 | 
				
			||||||
                    controllers: {
 | 
					 | 
				
			||||||
                        controllerA: ['actionA', 'actionB'],
 | 
					 | 
				
			||||||
                        controllerB: ['actionC', 'actionD'],
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                'plugin::foo': { controllers: { controllerA: ['actionA', 'actionB'] } },
 | 
					 | 
				
			||||||
                'plugin::bar': { controllers: { controllerA: ['actionA', 'actionB'] } },
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    describe('Register Actions', () => {
 | 
					 | 
				
			||||||
        beforeEach(() => {
 | 
					 | 
				
			||||||
            global.strapi = {
 | 
					 | 
				
			||||||
                api: {
 | 
					 | 
				
			||||||
                    foo: {
 | 
					 | 
				
			||||||
                        controllers: {
 | 
					 | 
				
			||||||
                            controllerA: {
 | 
					 | 
				
			||||||
                                actionA: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                                actionB: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                            controllerB: {
 | 
					 | 
				
			||||||
                                actionC: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                                actionD: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                plugins: {
 | 
					 | 
				
			||||||
                    foo: {
 | 
					 | 
				
			||||||
                        controllers: {
 | 
					 | 
				
			||||||
                            controllerA: {
 | 
					 | 
				
			||||||
                                actionA: bindToContentAPI(() => { }),
 | 
					 | 
				
			||||||
                            },
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        test('The action provider should holds every action from APIs and plugins', async () => {
 | 
					 | 
				
			||||||
            const contentAPI = (0, content_api_1.default)(global.strapi);
 | 
					 | 
				
			||||||
            await contentAPI.permissions.registerActions();
 | 
					 | 
				
			||||||
            const values = contentAPI.permissions.providers.action.values();
 | 
					 | 
				
			||||||
            expect(values).toEqual([
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    uid: 'api::foo.controllerA.actionA',
 | 
					 | 
				
			||||||
                    api: 'api::foo',
 | 
					 | 
				
			||||||
                    controller: 'controllerA',
 | 
					 | 
				
			||||||
                    action: 'actionA',
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    uid: 'api::foo.controllerA.actionB',
 | 
					 | 
				
			||||||
                    api: 'api::foo',
 | 
					 | 
				
			||||||
                    controller: 'controllerA',
 | 
					 | 
				
			||||||
                    action: 'actionB',
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    uid: 'api::foo.controllerB.actionC',
 | 
					 | 
				
			||||||
                    api: 'api::foo',
 | 
					 | 
				
			||||||
                    controller: 'controllerB',
 | 
					 | 
				
			||||||
                    action: 'actionC',
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    uid: 'api::foo.controllerB.actionD',
 | 
					 | 
				
			||||||
                    api: 'api::foo',
 | 
					 | 
				
			||||||
                    controller: 'controllerB',
 | 
					 | 
				
			||||||
                    action: 'actionD',
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    uid: 'plugin::foo.controllerA.actionA',
 | 
					 | 
				
			||||||
                    api: 'plugin::foo',
 | 
					 | 
				
			||||||
                    controller: 'controllerA',
 | 
					 | 
				
			||||||
                    action: 'actionA',
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            ]);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        test('Call registerActions twice should throw a duplicate error', async () => {
 | 
					 | 
				
			||||||
            const contentAPI = (0, content_api_1.default)(global.strapi);
 | 
					 | 
				
			||||||
            await contentAPI.permissions.registerActions();
 | 
					 | 
				
			||||||
            expect(() => contentAPI.permissions.registerActions()).rejects.toThrowError('Duplicated item key: api::foo.controllerA.actionA');
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    describe('Providers', () => {
 | 
					 | 
				
			||||||
        test('You should not be able to register action once strapi is loaded', () => {
 | 
					 | 
				
			||||||
            global.strapi.isLoaded = true;
 | 
					 | 
				
			||||||
            const contentAPI = (0, content_api_1.default)(global.strapi);
 | 
					 | 
				
			||||||
            // Actions
 | 
					 | 
				
			||||||
            expect(() => contentAPI.permissions.providers.action.register('foo', {})).rejects.toThrowError(`You can't register new actions outside the bootstrap function.`);
 | 
					 | 
				
			||||||
            // Conditions
 | 
					 | 
				
			||||||
            expect(() => contentAPI.permissions.providers.condition.register({ name: 'myCondition' })).rejects.toThrowError(`You can't register new conditions outside the bootstrap function.`);
 | 
					 | 
				
			||||||
            // Register Actions
 | 
					 | 
				
			||||||
            expect(() => contentAPI.permissions.registerActions()).rejects.toThrowError(`You can't register new actions outside the bootstrap function.`);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    describe('Engine', () => {
 | 
					 | 
				
			||||||
        test('Engine warns when registering an unknown action', async () => {
 | 
					 | 
				
			||||||
            global.strapi = {
 | 
					 | 
				
			||||||
                log: {
 | 
					 | 
				
			||||||
                    debug: jest.fn(),
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            const contentAPI = (0, content_api_1.default)();
 | 
					 | 
				
			||||||
            const ability = await contentAPI.permissions.engine.generateAbility([{ action: 'foo' }]);
 | 
					 | 
				
			||||||
            expect(ability.rules).toHaveLength(0);
 | 
					 | 
				
			||||||
            expect(global.strapi.log.debug).toHaveBeenCalledWith(`Unknown action "foo" supplied when registering a new permission`);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        test('Engine filter out invalid action when generating an ability', async () => {
 | 
					 | 
				
			||||||
            global.strapi = {
 | 
					 | 
				
			||||||
                log: {
 | 
					 | 
				
			||||||
                    debug: jest.fn(),
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                api: {
 | 
					 | 
				
			||||||
                    foo: {
 | 
					 | 
				
			||||||
                        controllers: {
 | 
					 | 
				
			||||||
                            bar: { foobar: bindToContentAPI(() => { }) },
 | 
					 | 
				
			||||||
                        },
 | 
					 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            const contentAPI = (0, content_api_1.default)(global.strapi);
 | 
					 | 
				
			||||||
            await contentAPI.permissions.registerActions();
 | 
					 | 
				
			||||||
            const ability = await contentAPI.permissions.engine.generateAbility([
 | 
					 | 
				
			||||||
                { action: 'foo' },
 | 
					 | 
				
			||||||
                { action: 'api::foo.bar.foobar' },
 | 
					 | 
				
			||||||
            ]);
 | 
					 | 
				
			||||||
            expect(ability.rules).toHaveLength(1);
 | 
					 | 
				
			||||||
            expect(ability.rules).toEqual([
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    action: 'api::foo.bar.foobar',
 | 
					 | 
				
			||||||
                    subject: 'all',
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
            ]);
 | 
					 | 
				
			||||||
            expect(global.strapi.log.debug).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
            expect(global.strapi.log.debug).toHaveBeenCalledWith(`Unknown action "foo" supplied when registering a new permission`);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
//# sourceMappingURL=content-api-permissions.test.js.map
 | 
					 | 
				
			||||||
@ -0,0 +1,290 @@
 | 
				
			|||||||
 | 
					import createContentAPI from '../content-api';
 | 
				
			||||||
 | 
					import type { Utils } from '../..';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('Content API - Permissions', () => {
 | 
				
			||||||
 | 
					  const bindToContentAPI = (action: Utils.Function.Any) => {
 | 
				
			||||||
 | 
					    Object.assign(action, { [Symbol.for('__type__')]: ['content-api'] });
 | 
				
			||||||
 | 
					    return action;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('Get Actions Map', () => {
 | 
				
			||||||
 | 
					    test('When no API are defined, it should return an empty object', () => {
 | 
				
			||||||
 | 
					      global.strapi = {} as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const contentAPI = createContentAPI(global.strapi);
 | 
				
			||||||
 | 
					      const actionsMap = contentAPI.permissions.getActionsMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(actionsMap).toEqual({});
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test('When no controller are defined for an API, it should ignore the API', () => {
 | 
				
			||||||
 | 
					      global.strapi = {
 | 
				
			||||||
 | 
					        api: {
 | 
				
			||||||
 | 
					          foo: {},
 | 
				
			||||||
 | 
					          bar: {},
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      } as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const contentAPI = createContentAPI(global.strapi);
 | 
				
			||||||
 | 
					      const actionsMap = contentAPI.permissions.getActionsMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(actionsMap).toEqual({});
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test(`Do not register controller if they're not bound to the content API`, () => {
 | 
				
			||||||
 | 
					      const actionC = () => {};
 | 
				
			||||||
 | 
					      Object.assign(actionC, { [Symbol.for('__type__')]: ['admin-api'] });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      global.strapi = {
 | 
				
			||||||
 | 
					        api: {
 | 
				
			||||||
 | 
					          foo: {
 | 
				
			||||||
 | 
					            controllers: {
 | 
				
			||||||
 | 
					              controllerA: {
 | 
				
			||||||
 | 
					                actionA: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					                actionB() {},
 | 
				
			||||||
 | 
					                actionC,
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      } as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const contentAPI = createContentAPI(global.strapi);
 | 
				
			||||||
 | 
					      const actionsMap = contentAPI.permissions.getActionsMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(actionsMap).toEqual({
 | 
				
			||||||
 | 
					        'api::foo': { controllers: { controllerA: ['actionA'] } },
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test('Creates and populate a map of actions from APIs and plugins', () => {
 | 
				
			||||||
 | 
					      global.strapi = {
 | 
				
			||||||
 | 
					        api: {
 | 
				
			||||||
 | 
					          foo: {
 | 
				
			||||||
 | 
					            controllers: {
 | 
				
			||||||
 | 
					              controllerA: {
 | 
				
			||||||
 | 
					                actionA: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					                actionB: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          bar: {
 | 
				
			||||||
 | 
					            controllers: {
 | 
				
			||||||
 | 
					              controllerA: {
 | 
				
			||||||
 | 
					                actionA: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					                actionB: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          foobar: {
 | 
				
			||||||
 | 
					            controllers: {
 | 
				
			||||||
 | 
					              controllerA: {
 | 
				
			||||||
 | 
					                actionA: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					                actionB: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              controllerB: {
 | 
				
			||||||
 | 
					                actionC: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					                actionD: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        plugins: {
 | 
				
			||||||
 | 
					          foo: {
 | 
				
			||||||
 | 
					            controllers: {
 | 
				
			||||||
 | 
					              controllerA: {
 | 
				
			||||||
 | 
					                actionA: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					                actionB: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          bar: {
 | 
				
			||||||
 | 
					            controllers: {
 | 
				
			||||||
 | 
					              controllerA: {
 | 
				
			||||||
 | 
					                actionA: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					                actionB: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      } as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const contentAPI = createContentAPI(global.strapi);
 | 
				
			||||||
 | 
					      const actionsMap = contentAPI.permissions.getActionsMap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(actionsMap).toEqual({
 | 
				
			||||||
 | 
					        'api::foo': { controllers: { controllerA: ['actionA', 'actionB'] } },
 | 
				
			||||||
 | 
					        'api::bar': { controllers: { controllerA: ['actionA', 'actionB'] } },
 | 
				
			||||||
 | 
					        'api::foobar': {
 | 
				
			||||||
 | 
					          controllers: {
 | 
				
			||||||
 | 
					            controllerA: ['actionA', 'actionB'],
 | 
				
			||||||
 | 
					            controllerB: ['actionC', 'actionD'],
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        'plugin::foo': { controllers: { controllerA: ['actionA', 'actionB'] } },
 | 
				
			||||||
 | 
					        'plugin::bar': { controllers: { controllerA: ['actionA', 'actionB'] } },
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('Register Actions', () => {
 | 
				
			||||||
 | 
					    beforeEach(() => {
 | 
				
			||||||
 | 
					      global.strapi = {
 | 
				
			||||||
 | 
					        api: {
 | 
				
			||||||
 | 
					          foo: {
 | 
				
			||||||
 | 
					            controllers: {
 | 
				
			||||||
 | 
					              controllerA: {
 | 
				
			||||||
 | 
					                actionA: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					                actionB: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              controllerB: {
 | 
				
			||||||
 | 
					                actionC: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					                actionD: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        plugins: {
 | 
				
			||||||
 | 
					          foo: {
 | 
				
			||||||
 | 
					            controllers: {
 | 
				
			||||||
 | 
					              controllerA: {
 | 
				
			||||||
 | 
					                actionA: bindToContentAPI(() => {}),
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      } as any;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test('The action provider should holds every action from APIs and plugins', async () => {
 | 
				
			||||||
 | 
					      const contentAPI = createContentAPI(global.strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      await contentAPI.permissions.registerActions();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const values = contentAPI.permissions.providers.action.values();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(values).toEqual([
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          uid: 'api::foo.controllerA.actionA',
 | 
				
			||||||
 | 
					          api: 'api::foo',
 | 
				
			||||||
 | 
					          controller: 'controllerA',
 | 
				
			||||||
 | 
					          action: 'actionA',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          uid: 'api::foo.controllerA.actionB',
 | 
				
			||||||
 | 
					          api: 'api::foo',
 | 
				
			||||||
 | 
					          controller: 'controllerA',
 | 
				
			||||||
 | 
					          action: 'actionB',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          uid: 'api::foo.controllerB.actionC',
 | 
				
			||||||
 | 
					          api: 'api::foo',
 | 
				
			||||||
 | 
					          controller: 'controllerB',
 | 
				
			||||||
 | 
					          action: 'actionC',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          uid: 'api::foo.controllerB.actionD',
 | 
				
			||||||
 | 
					          api: 'api::foo',
 | 
				
			||||||
 | 
					          controller: 'controllerB',
 | 
				
			||||||
 | 
					          action: 'actionD',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          uid: 'plugin::foo.controllerA.actionA',
 | 
				
			||||||
 | 
					          api: 'plugin::foo',
 | 
				
			||||||
 | 
					          controller: 'controllerA',
 | 
				
			||||||
 | 
					          action: 'actionA',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ]);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test('Call registerActions twice should throw a duplicate error', async () => {
 | 
				
			||||||
 | 
					      const contentAPI = createContentAPI(global.strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      await contentAPI.permissions.registerActions();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(() => contentAPI.permissions.registerActions()).rejects.toThrowError(
 | 
				
			||||||
 | 
					        'Duplicated item key: api::foo.controllerA.actionA'
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('Providers', () => {
 | 
				
			||||||
 | 
					    test('You should not be able to register action once strapi is loaded', () => {
 | 
				
			||||||
 | 
					      global.strapi.isLoaded = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const contentAPI = createContentAPI(global.strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Actions
 | 
				
			||||||
 | 
					      expect(() =>
 | 
				
			||||||
 | 
					        contentAPI.permissions.providers.action.register('foo', {})
 | 
				
			||||||
 | 
					      ).rejects.toThrowError(`You can't register new actions outside the bootstrap function.`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Conditions
 | 
				
			||||||
 | 
					      expect(() =>
 | 
				
			||||||
 | 
					        contentAPI.permissions.providers.condition.register({ name: 'myCondition' })
 | 
				
			||||||
 | 
					      ).rejects.toThrowError(`You can't register new conditions outside the bootstrap function.`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Register Actions
 | 
				
			||||||
 | 
					      expect(() => contentAPI.permissions.registerActions()).rejects.toThrowError(
 | 
				
			||||||
 | 
					        `You can't register new actions outside the bootstrap function.`
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('Engine', () => {
 | 
				
			||||||
 | 
					    test('Engine warns when registering an unknown action', async () => {
 | 
				
			||||||
 | 
					      global.strapi = {
 | 
				
			||||||
 | 
					        log: {
 | 
				
			||||||
 | 
					          debug: jest.fn(),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      } as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const contentAPI = createContentAPI(global.strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const ability = await contentAPI.permissions.engine.generateAbility([{ action: 'foo' }]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(ability.rules).toHaveLength(0);
 | 
				
			||||||
 | 
					      expect(global.strapi.log.debug).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        `Unknown action "foo" supplied when registering a new permission`
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test('Engine filter out invalid action when generating an ability', async () => {
 | 
				
			||||||
 | 
					      global.strapi = {
 | 
				
			||||||
 | 
					        log: {
 | 
				
			||||||
 | 
					          debug: jest.fn(),
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        api: {
 | 
				
			||||||
 | 
					          foo: {
 | 
				
			||||||
 | 
					            controllers: {
 | 
				
			||||||
 | 
					              bar: { foobar: bindToContentAPI(() => {}) },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      } as any;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const contentAPI = createContentAPI(global.strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      await contentAPI.permissions.registerActions();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const ability = await contentAPI.permissions.engine.generateAbility([
 | 
				
			||||||
 | 
					        { action: 'foo' },
 | 
				
			||||||
 | 
					        { action: 'api::foo.bar.foobar' },
 | 
				
			||||||
 | 
					      ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(ability.rules).toHaveLength(1);
 | 
				
			||||||
 | 
					      expect(ability.rules).toEqual([
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          action: 'api::foo.bar.foobar',
 | 
				
			||||||
 | 
					          subject: 'all',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(global.strapi.log.debug).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					      expect(global.strapi.log.debug).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        `Unknown action "foo" supplied when registering a new permission`
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -1,122 +0,0 @@
 | 
				
			|||||||
"use strict";
 | 
					 | 
				
			||||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
					 | 
				
			||||||
const core_store_1 = require("../core-store");
 | 
					 | 
				
			||||||
const data = {
 | 
					 | 
				
			||||||
    key: 'testKey',
 | 
					 | 
				
			||||||
    value: 'testValue',
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
const queryRes = {
 | 
					 | 
				
			||||||
    id: 1,
 | 
					 | 
				
			||||||
    key: 'testKey',
 | 
					 | 
				
			||||||
    value: 'testValue',
 | 
					 | 
				
			||||||
    type: 'string',
 | 
					 | 
				
			||||||
    environment: null,
 | 
					 | 
				
			||||||
    tag: null,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
const where = {
 | 
					 | 
				
			||||||
    key: 'plugin_testName_testKey',
 | 
					 | 
				
			||||||
    environment: 'test',
 | 
					 | 
				
			||||||
    tag: null,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
describe('Core Store', () => {
 | 
					 | 
				
			||||||
    test('Set key in empty store', async () => {
 | 
					 | 
				
			||||||
        const fakeEmptyDBQuery = {
 | 
					 | 
				
			||||||
            findOne: jest.fn(() => Promise.resolve()),
 | 
					 | 
				
			||||||
            update: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            create: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            delete: jest.fn(() => Promise.resolve()),
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        const fakeEmptyDB = {
 | 
					 | 
				
			||||||
            query: jest.fn(() => fakeEmptyDBQuery),
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        const emptyTestStore = (0, core_store_1.createCoreStore)({
 | 
					 | 
				
			||||||
            db: fakeEmptyDB,
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        const store = emptyTestStore({
 | 
					 | 
				
			||||||
            environment: 'test',
 | 
					 | 
				
			||||||
            type: 'plugin',
 | 
					 | 
				
			||||||
            name: 'testName',
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        await store.set(data);
 | 
					 | 
				
			||||||
        expect(fakeEmptyDB.query).toHaveBeenCalledTimes(2);
 | 
					 | 
				
			||||||
        expect(fakeEmptyDBQuery.findOne).toHaveBeenCalledWith({ where });
 | 
					 | 
				
			||||||
        expect(fakeEmptyDBQuery.create).toHaveBeenCalledWith({
 | 
					 | 
				
			||||||
            data: { ...where, value: JSON.stringify('testValue'), type: 'string' },
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    test('Set key in not empty store', async () => {
 | 
					 | 
				
			||||||
        const fakeNotEmptyDBQuery = {
 | 
					 | 
				
			||||||
            findOne: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            update: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            create: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            delete: jest.fn(() => Promise.resolve()),
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        const fakeNotEmptyDB = {
 | 
					 | 
				
			||||||
            query: jest.fn(() => fakeNotEmptyDBQuery),
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        const notEmptyTestStore = (0, core_store_1.createCoreStore)({
 | 
					 | 
				
			||||||
            db: fakeNotEmptyDB,
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        const store = notEmptyTestStore({
 | 
					 | 
				
			||||||
            environment: 'test',
 | 
					 | 
				
			||||||
            type: 'plugin',
 | 
					 | 
				
			||||||
            name: 'testName',
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        await store.set(data);
 | 
					 | 
				
			||||||
        expect(fakeNotEmptyDB.query).toHaveBeenCalledTimes(2);
 | 
					 | 
				
			||||||
        expect(fakeNotEmptyDBQuery.findOne).toHaveBeenCalledWith({ where });
 | 
					 | 
				
			||||||
        expect(fakeNotEmptyDBQuery.update).toHaveBeenCalledWith({
 | 
					 | 
				
			||||||
            where: { id: queryRes.id },
 | 
					 | 
				
			||||||
            data: {
 | 
					 | 
				
			||||||
                type: 'string',
 | 
					 | 
				
			||||||
                value: JSON.stringify('testValue'),
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    test('Delete key from empty store', async () => {
 | 
					 | 
				
			||||||
        const fakeEmptyDBQuery = {
 | 
					 | 
				
			||||||
            findOne: jest.fn(() => Promise.resolve()),
 | 
					 | 
				
			||||||
            update: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            create: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            delete: jest.fn(() => Promise.resolve()),
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        const fakeEmptyDB = {
 | 
					 | 
				
			||||||
            query: jest.fn(() => fakeEmptyDBQuery),
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        const emptyTestStore = (0, core_store_1.createCoreStore)({
 | 
					 | 
				
			||||||
            db: fakeEmptyDB,
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        const store = emptyTestStore({
 | 
					 | 
				
			||||||
            environment: 'test',
 | 
					 | 
				
			||||||
            type: 'plugin',
 | 
					 | 
				
			||||||
            name: 'testName',
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        await store.delete(data);
 | 
					 | 
				
			||||||
        expect(fakeEmptyDB.query).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
        expect(fakeEmptyDBQuery.delete).toHaveBeenCalledWith({ where });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    test('Delete key from not empty store', async () => {
 | 
					 | 
				
			||||||
        const fakeNotEmptyDBQuery = {
 | 
					 | 
				
			||||||
            findOne: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            update: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            create: jest.fn(() => Promise.resolve(queryRes)),
 | 
					 | 
				
			||||||
            delete: jest.fn(() => Promise.resolve()),
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        const fakeNotEmptyDB = {
 | 
					 | 
				
			||||||
            query: jest.fn(() => fakeNotEmptyDBQuery),
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        const notEmptyTestStore = (0, core_store_1.createCoreStore)({
 | 
					 | 
				
			||||||
            db: fakeNotEmptyDB,
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        const store = notEmptyTestStore({
 | 
					 | 
				
			||||||
            environment: 'test',
 | 
					 | 
				
			||||||
            type: 'plugin',
 | 
					 | 
				
			||||||
            name: 'testName',
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        const rest = await store.delete(data);
 | 
					 | 
				
			||||||
        expect(fakeNotEmptyDB.query).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
        expect(fakeNotEmptyDBQuery.delete).toHaveBeenCalledWith({ where });
 | 
					 | 
				
			||||||
        expect(rest).toEqual(undefined);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
//# sourceMappingURL=core-store.test.js.map
 | 
					 | 
				
			||||||
							
								
								
									
										146
									
								
								packages/core/strapi/src/services/__tests__/core-store.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								packages/core/strapi/src/services/__tests__/core-store.test.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,146 @@
 | 
				
			|||||||
 | 
					import { createCoreStore } from '../core-store';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const data = {
 | 
				
			||||||
 | 
					  key: 'testKey',
 | 
				
			||||||
 | 
					  value: 'testValue',
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const queryRes = {
 | 
				
			||||||
 | 
					  id: 1,
 | 
				
			||||||
 | 
					  key: 'testKey',
 | 
				
			||||||
 | 
					  value: 'testValue',
 | 
				
			||||||
 | 
					  type: 'string',
 | 
				
			||||||
 | 
					  environment: null,
 | 
				
			||||||
 | 
					  tag: null,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const where = {
 | 
				
			||||||
 | 
					  key: 'plugin_testName_testKey',
 | 
				
			||||||
 | 
					  environment: 'test',
 | 
				
			||||||
 | 
					  tag: null,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('Core Store', () => {
 | 
				
			||||||
 | 
					  test('Set key in empty store', async () => {
 | 
				
			||||||
 | 
					    const fakeEmptyDBQuery = {
 | 
				
			||||||
 | 
					      findOne: jest.fn(() => Promise.resolve()),
 | 
				
			||||||
 | 
					      update: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      create: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      delete: jest.fn(() => Promise.resolve()),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const fakeEmptyDB = {
 | 
				
			||||||
 | 
					      query: jest.fn(() => fakeEmptyDBQuery),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const emptyTestStore = createCoreStore({
 | 
				
			||||||
 | 
					      db: fakeEmptyDB,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const store = emptyTestStore({
 | 
				
			||||||
 | 
					      environment: 'test',
 | 
				
			||||||
 | 
					      type: 'plugin',
 | 
				
			||||||
 | 
					      name: 'testName',
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await store.set(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(fakeEmptyDB.query).toHaveBeenCalledTimes(2);
 | 
				
			||||||
 | 
					    expect(fakeEmptyDBQuery.findOne).toHaveBeenCalledWith({ where });
 | 
				
			||||||
 | 
					    expect(fakeEmptyDBQuery.create).toHaveBeenCalledWith({
 | 
				
			||||||
 | 
					      data: { ...where, value: JSON.stringify('testValue'), type: 'string' },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  test('Set key in not empty store', async () => {
 | 
				
			||||||
 | 
					    const fakeNotEmptyDBQuery = {
 | 
				
			||||||
 | 
					      findOne: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      update: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      create: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      delete: jest.fn(() => Promise.resolve()),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const fakeNotEmptyDB = {
 | 
				
			||||||
 | 
					      query: jest.fn(() => fakeNotEmptyDBQuery),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const notEmptyTestStore = createCoreStore({
 | 
				
			||||||
 | 
					      db: fakeNotEmptyDB,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const store = notEmptyTestStore({
 | 
				
			||||||
 | 
					      environment: 'test',
 | 
				
			||||||
 | 
					      type: 'plugin',
 | 
				
			||||||
 | 
					      name: 'testName',
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await store.set(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(fakeNotEmptyDB.query).toHaveBeenCalledTimes(2);
 | 
				
			||||||
 | 
					    expect(fakeNotEmptyDBQuery.findOne).toHaveBeenCalledWith({ where });
 | 
				
			||||||
 | 
					    expect(fakeNotEmptyDBQuery.update).toHaveBeenCalledWith({
 | 
				
			||||||
 | 
					      where: { id: queryRes.id },
 | 
				
			||||||
 | 
					      data: {
 | 
				
			||||||
 | 
					        type: 'string',
 | 
				
			||||||
 | 
					        value: JSON.stringify('testValue'),
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  test('Delete key from empty store', async () => {
 | 
				
			||||||
 | 
					    const fakeEmptyDBQuery = {
 | 
				
			||||||
 | 
					      findOne: jest.fn(() => Promise.resolve()),
 | 
				
			||||||
 | 
					      update: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      create: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      delete: jest.fn(() => Promise.resolve()),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const fakeEmptyDB = {
 | 
				
			||||||
 | 
					      query: jest.fn(() => fakeEmptyDBQuery),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const emptyTestStore = createCoreStore({
 | 
				
			||||||
 | 
					      db: fakeEmptyDB,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const store = emptyTestStore({
 | 
				
			||||||
 | 
					      environment: 'test',
 | 
				
			||||||
 | 
					      type: 'plugin',
 | 
				
			||||||
 | 
					      name: 'testName',
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await store.delete(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(fakeEmptyDB.query).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					    expect(fakeEmptyDBQuery.delete).toHaveBeenCalledWith({ where });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  test('Delete key from not empty store', async () => {
 | 
				
			||||||
 | 
					    const fakeNotEmptyDBQuery = {
 | 
				
			||||||
 | 
					      findOne: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      update: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      create: jest.fn(() => Promise.resolve(queryRes)),
 | 
				
			||||||
 | 
					      delete: jest.fn(() => Promise.resolve()),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const fakeNotEmptyDB = {
 | 
				
			||||||
 | 
					      query: jest.fn(() => fakeNotEmptyDBQuery),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const notEmptyTestStore = createCoreStore({
 | 
				
			||||||
 | 
					      db: fakeNotEmptyDB,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const store = notEmptyTestStore({
 | 
				
			||||||
 | 
					      environment: 'test',
 | 
				
			||||||
 | 
					      type: 'plugin',
 | 
				
			||||||
 | 
					      name: 'testName',
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const rest = await store.delete(data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(fakeNotEmptyDB.query).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					    expect(fakeNotEmptyDBQuery.delete).toHaveBeenCalledWith({ where });
 | 
				
			||||||
 | 
					    expect(rest).toEqual(undefined);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -1,102 +0,0 @@
 | 
				
			|||||||
"use strict";
 | 
					 | 
				
			||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
 | 
					 | 
				
			||||||
    return (mod && mod.__esModule) ? mod : { "default": mod };
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
					 | 
				
			||||||
const event_hub_1 = __importDefault(require("../event-hub"));
 | 
					 | 
				
			||||||
describe('Event Hub', () => {
 | 
					 | 
				
			||||||
    it('only triggers the callback once with once()', async () => {
 | 
					 | 
				
			||||||
        const { once, emit } = (0, event_hub_1.default)();
 | 
					 | 
				
			||||||
        const fn = jest.fn();
 | 
					 | 
				
			||||||
        const args = [1, 2, 3];
 | 
					 | 
				
			||||||
        once('my-event', fn);
 | 
					 | 
				
			||||||
        await emit('my-event', ...args);
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledWith(...args);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    it('subscribes and unsubscribes to all events', async () => {
 | 
					 | 
				
			||||||
        const { subscribe, unsubscribe, emit } = (0, event_hub_1.default)();
 | 
					 | 
				
			||||||
        const fn = jest.fn();
 | 
					 | 
				
			||||||
        subscribe(fn);
 | 
					 | 
				
			||||||
        const args1 = [1, 2, 3];
 | 
					 | 
				
			||||||
        const args2 = [4, 5, 6];
 | 
					 | 
				
			||||||
        await emit('my-event', ...args1);
 | 
					 | 
				
			||||||
        await emit('my-event', ...args2);
 | 
					 | 
				
			||||||
        await emit('my-other-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalled();
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenNthCalledWith(1, 'my-event', ...args1);
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenNthCalledWith(2, 'my-event', ...args2);
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenNthCalledWith(3, 'my-other-event');
 | 
					 | 
				
			||||||
        // Unsubscribes with unsubscribe()
 | 
					 | 
				
			||||||
        unsubscribe(fn);
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(3);
 | 
					 | 
				
			||||||
        // Unsubscribes with the returned function
 | 
					 | 
				
			||||||
        const unsubscribe2 = subscribe(fn);
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(4);
 | 
					 | 
				
			||||||
        unsubscribe2();
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(4);
 | 
					 | 
				
			||||||
        // Avoid removing the wrong subscriber when unsubscribe is given a non-existing subscriber
 | 
					 | 
				
			||||||
        const unsubscribe3 = subscribe(fn);
 | 
					 | 
				
			||||||
        const unrelatedFunction = jest.fn();
 | 
					 | 
				
			||||||
        unsubscribe(unrelatedFunction);
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(5);
 | 
					 | 
				
			||||||
        unsubscribe3();
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    it('adds and removes simple listeners', async () => {
 | 
					 | 
				
			||||||
        const { on, off, emit } = (0, event_hub_1.default)();
 | 
					 | 
				
			||||||
        const fn = jest.fn();
 | 
					 | 
				
			||||||
        const args = [1, 2, 3];
 | 
					 | 
				
			||||||
        // Listens to event with on()
 | 
					 | 
				
			||||||
        on('my-event', fn);
 | 
					 | 
				
			||||||
        await emit('my-event', ...args);
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledWith(...args);
 | 
					 | 
				
			||||||
        // Removes listener with off()
 | 
					 | 
				
			||||||
        off('my-event', fn);
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
        // Removes listener with the returned function
 | 
					 | 
				
			||||||
        const off2 = on('my-event', fn);
 | 
					 | 
				
			||||||
        await emit('my-event', ...args);
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(2);
 | 
					 | 
				
			||||||
        off2();
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(2);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    it('removes all subscribers on destroy()', async () => {
 | 
					 | 
				
			||||||
        const { subscribe, on, emit, destroy } = (0, event_hub_1.default)();
 | 
					 | 
				
			||||||
        const fn = jest.fn();
 | 
					 | 
				
			||||||
        const fn2 = jest.fn();
 | 
					 | 
				
			||||||
        subscribe(fn);
 | 
					 | 
				
			||||||
        on('my-event', fn2);
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalled();
 | 
					 | 
				
			||||||
        expect(fn2).toHaveBeenCalled();
 | 
					 | 
				
			||||||
        destroy();
 | 
					 | 
				
			||||||
        // Subscribers are removed
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
        expect(fn2).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    it('removes all subscribers on removeAllListeners()', async () => {
 | 
					 | 
				
			||||||
        const { subscribe, on, emit, removeAllListeners } = (0, event_hub_1.default)();
 | 
					 | 
				
			||||||
        const fn = jest.fn();
 | 
					 | 
				
			||||||
        const fn2 = jest.fn();
 | 
					 | 
				
			||||||
        subscribe(fn);
 | 
					 | 
				
			||||||
        on('my-event', fn2);
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalled();
 | 
					 | 
				
			||||||
        expect(fn2).toHaveBeenCalled();
 | 
					 | 
				
			||||||
        removeAllListeners();
 | 
					 | 
				
			||||||
        // Subscribers are removed
 | 
					 | 
				
			||||||
        await emit('my-event');
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
        expect(fn2).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
//# sourceMappingURL=event-hub.test.js.map
 | 
					 | 
				
			||||||
							
								
								
									
										124
									
								
								packages/core/strapi/src/services/__tests__/event-hub.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								packages/core/strapi/src/services/__tests__/event-hub.test.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,124 @@
 | 
				
			|||||||
 | 
					import createEventHub from '../event-hub';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('Event Hub', () => {
 | 
				
			||||||
 | 
					  it('only triggers the callback once with once()', async () => {
 | 
				
			||||||
 | 
					    const { once, emit } = createEventHub();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const fn = jest.fn();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const args = [1, 2, 3];
 | 
				
			||||||
 | 
					    once('my-event', fn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await emit('my-event', ...args);
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledWith(...args);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('subscribes and unsubscribes to all events', async () => {
 | 
				
			||||||
 | 
					    const { subscribe, unsubscribe, emit } = createEventHub();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const fn = jest.fn();
 | 
				
			||||||
 | 
					    subscribe(fn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const args1 = [1, 2, 3];
 | 
				
			||||||
 | 
					    const args2 = [4, 5, 6];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await emit('my-event', ...args1);
 | 
				
			||||||
 | 
					    await emit('my-event', ...args2);
 | 
				
			||||||
 | 
					    await emit('my-other-event');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalled();
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenNthCalledWith(1, 'my-event', ...args1);
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenNthCalledWith(2, 'my-event', ...args2);
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenNthCalledWith(3, 'my-other-event');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Unsubscribes with unsubscribe()
 | 
				
			||||||
 | 
					    unsubscribe(fn);
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Unsubscribes with the returned function
 | 
				
			||||||
 | 
					    const unsubscribe2 = subscribe(fn);
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(4);
 | 
				
			||||||
 | 
					    unsubscribe2();
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Avoid removing the wrong subscriber when unsubscribe is given a non-existing subscriber
 | 
				
			||||||
 | 
					    const unsubscribe3 = subscribe(fn);
 | 
				
			||||||
 | 
					    const unrelatedFunction = jest.fn();
 | 
				
			||||||
 | 
					    unsubscribe(unrelatedFunction);
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(5);
 | 
				
			||||||
 | 
					    unsubscribe3();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('adds and removes simple listeners', async () => {
 | 
				
			||||||
 | 
					    const { on, off, emit } = createEventHub();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const fn = jest.fn();
 | 
				
			||||||
 | 
					    const args = [1, 2, 3];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Listens to event with on()
 | 
				
			||||||
 | 
					    on('my-event', fn);
 | 
				
			||||||
 | 
					    await emit('my-event', ...args);
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledWith(...args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Removes listener with off()
 | 
				
			||||||
 | 
					    off('my-event', fn);
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Removes listener with the returned function
 | 
				
			||||||
 | 
					    const off2 = on('my-event', fn);
 | 
				
			||||||
 | 
					    await emit('my-event', ...args);
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(2);
 | 
				
			||||||
 | 
					    off2();
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(2);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('removes all subscribers on destroy()', async () => {
 | 
				
			||||||
 | 
					    const { subscribe, on, emit, destroy } = createEventHub();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const fn = jest.fn();
 | 
				
			||||||
 | 
					    const fn2 = jest.fn();
 | 
				
			||||||
 | 
					    subscribe(fn);
 | 
				
			||||||
 | 
					    on('my-event', fn2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalled();
 | 
				
			||||||
 | 
					    expect(fn2).toHaveBeenCalled();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    destroy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Subscribers are removed
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					    expect(fn2).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('removes all subscribers on removeAllListeners()', async () => {
 | 
				
			||||||
 | 
					    const { subscribe, on, emit, removeAllListeners } = createEventHub();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const fn = jest.fn();
 | 
				
			||||||
 | 
					    const fn2 = jest.fn();
 | 
				
			||||||
 | 
					    subscribe(fn);
 | 
				
			||||||
 | 
					    on('my-event', fn2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalled();
 | 
				
			||||||
 | 
					    expect(fn2).toHaveBeenCalled();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    removeAllListeners();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Subscribers are removed
 | 
				
			||||||
 | 
					    await emit('my-event');
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					    expect(fn2).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -1,55 +0,0 @@
 | 
				
			|||||||
"use strict";
 | 
					 | 
				
			||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
 | 
					 | 
				
			||||||
    return (mod && mod.__esModule) ? mod : { "default": mod };
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
					 | 
				
			||||||
const path_1 = __importDefault(require("path"));
 | 
					 | 
				
			||||||
const fs_extra_1 = __importDefault(require("fs-extra"));
 | 
					 | 
				
			||||||
const fs_1 = __importDefault(require("../fs"));
 | 
					 | 
				
			||||||
jest.mock('fs-extra', () => ({
 | 
					 | 
				
			||||||
    ensureFile: jest.fn(() => Promise.resolve()),
 | 
					 | 
				
			||||||
    writeFile: jest.fn(() => Promise.resolve()),
 | 
					 | 
				
			||||||
}));
 | 
					 | 
				
			||||||
describe('Strapi fs utils', () => {
 | 
					 | 
				
			||||||
    const strapi = {
 | 
					 | 
				
			||||||
        dirs: { dist: { root: '/tmp' }, app: { root: '/tmp' } },
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    test('Provides new functions', () => {
 | 
					 | 
				
			||||||
        const strapiFS = (0, fs_1.default)(strapi);
 | 
					 | 
				
			||||||
        expect(strapiFS.writeAppFile).toBeInstanceOf(Function);
 | 
					 | 
				
			||||||
        expect(strapiFS.writePluginFile).toBeInstanceOf(Function);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    describe('Write App File', () => {
 | 
					 | 
				
			||||||
        test('Makes sure the path exists and writes', async () => {
 | 
					 | 
				
			||||||
            const strapiFS = (0, fs_1.default)(strapi);
 | 
					 | 
				
			||||||
            const content = '';
 | 
					 | 
				
			||||||
            await strapiFS.writeAppFile('test', content);
 | 
					 | 
				
			||||||
            expect(fs_extra_1.default.ensureFile).toHaveBeenCalledWith(path_1.default.join('/', 'tmp', 'test'));
 | 
					 | 
				
			||||||
            expect(fs_extra_1.default.writeFile).toHaveBeenCalledWith(path_1.default.join('/', 'tmp', 'test'), content);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        test('Normalize the path to avoid relative access to folders in parent directories', async () => {
 | 
					 | 
				
			||||||
            const strapiFS = (0, fs_1.default)(strapi);
 | 
					 | 
				
			||||||
            const content = '';
 | 
					 | 
				
			||||||
            await strapiFS.writeAppFile('../../test', content);
 | 
					 | 
				
			||||||
            expect(fs_extra_1.default.ensureFile).toHaveBeenCalledWith(path_1.default.join('/', 'tmp', 'test'));
 | 
					 | 
				
			||||||
            expect(fs_extra_1.default.writeFile).toHaveBeenCalledWith(path_1.default.join('/', 'tmp', 'test'), content);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        test('Works with array path', async () => {
 | 
					 | 
				
			||||||
            const strapiFS = (0, fs_1.default)(strapi);
 | 
					 | 
				
			||||||
            const content = '';
 | 
					 | 
				
			||||||
            await strapiFS.writeAppFile(['test', 'sub', 'path'], content);
 | 
					 | 
				
			||||||
            expect(fs_extra_1.default.ensureFile).toHaveBeenCalledWith(path_1.default.join('/', 'tmp', 'test', 'sub', 'path'));
 | 
					 | 
				
			||||||
            expect(fs_extra_1.default.writeFile).toHaveBeenCalledWith(path_1.default.join('/', 'tmp', 'test', 'sub', 'path'), content);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    describe('Write Plugin File', () => {
 | 
					 | 
				
			||||||
        test('Scopes the writes in the extensions folder', async () => {
 | 
					 | 
				
			||||||
            const strapiFS = (0, fs_1.default)(strapi);
 | 
					 | 
				
			||||||
            const content = '';
 | 
					 | 
				
			||||||
            strapiFS.writeAppFile = jest.fn(() => Promise.resolve());
 | 
					 | 
				
			||||||
            await strapiFS.writePluginFile('users-permissions', ['test', 'sub', 'path'], content);
 | 
					 | 
				
			||||||
            expect(strapiFS.writeAppFile).toHaveBeenCalledWith('extensions/users-permissions/test/sub/path', content);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
//# sourceMappingURL=fs.test.js.map
 | 
					 | 
				
			||||||
							
								
								
									
										76
									
								
								packages/core/strapi/src/services/__tests__/fs.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								packages/core/strapi/src/services/__tests__/fs.test.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					import fse from 'fs-extra';
 | 
				
			||||||
 | 
					import fs from '../fs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					jest.mock('fs-extra', () => ({
 | 
				
			||||||
 | 
					  ensureFile: jest.fn(() => Promise.resolve()),
 | 
				
			||||||
 | 
					  writeFile: jest.fn(() => Promise.resolve()),
 | 
				
			||||||
 | 
					}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('Strapi fs utils', () => {
 | 
				
			||||||
 | 
					  const strapi = {
 | 
				
			||||||
 | 
					    dirs: { dist: { root: '/tmp' }, app: { root: '/tmp' } },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  test('Provides new functions', () => {
 | 
				
			||||||
 | 
					    const strapiFS = fs(strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(strapiFS.writeAppFile).toBeInstanceOf(Function);
 | 
				
			||||||
 | 
					    expect(strapiFS.writePluginFile).toBeInstanceOf(Function);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('Write App File', () => {
 | 
				
			||||||
 | 
					    test('Makes sure the path exists and writes', async () => {
 | 
				
			||||||
 | 
					      const strapiFS = fs(strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const content = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      await strapiFS.writeAppFile('test', content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(fse.ensureFile).toHaveBeenCalledWith(path.join('/', 'tmp', 'test'));
 | 
				
			||||||
 | 
					      expect(fse.writeFile).toHaveBeenCalledWith(path.join('/', 'tmp', 'test'), content);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test('Normalize the path to avoid relative access to folders in parent directories', async () => {
 | 
				
			||||||
 | 
					      const strapiFS = fs(strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const content = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      await strapiFS.writeAppFile('../../test', content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(fse.ensureFile).toHaveBeenCalledWith(path.join('/', 'tmp', 'test'));
 | 
				
			||||||
 | 
					      expect(fse.writeFile).toHaveBeenCalledWith(path.join('/', 'tmp', 'test'), content);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test('Works with array path', async () => {
 | 
				
			||||||
 | 
					      const strapiFS = fs(strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const content = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      await strapiFS.writeAppFile(['test', 'sub', 'path'], content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(fse.ensureFile).toHaveBeenCalledWith(path.join('/', 'tmp', 'test', 'sub', 'path'));
 | 
				
			||||||
 | 
					      expect(fse.writeFile).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        path.join('/', 'tmp', 'test', 'sub', 'path'),
 | 
				
			||||||
 | 
					        content
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('Write Plugin File', () => {
 | 
				
			||||||
 | 
					    test('Scopes the writes in the extensions folder', async () => {
 | 
				
			||||||
 | 
					      const strapiFS = fs(strapi);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const content = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      strapiFS.writeAppFile = jest.fn(() => Promise.resolve());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      await strapiFS.writePluginFile('users-permissions', ['test', 'sub', 'path'], content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      expect(strapiFS.writeAppFile).toHaveBeenCalledWith(
 | 
				
			||||||
 | 
					        'extensions/users-permissions/test/sub/path',
 | 
				
			||||||
 | 
					        content
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -1,41 +0,0 @@
 | 
				
			|||||||
"use strict";
 | 
					 | 
				
			||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
 | 
					 | 
				
			||||||
    return (mod && mod.__esModule) ? mod : { "default": mod };
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
					 | 
				
			||||||
const worker_queue_1 = __importDefault(require("../worker-queue"));
 | 
					 | 
				
			||||||
describe('WorkerQueue', () => {
 | 
					 | 
				
			||||||
    test('Executes worker', async () => {
 | 
					 | 
				
			||||||
        const fn = jest.fn();
 | 
					 | 
				
			||||||
        const input = 1;
 | 
					 | 
				
			||||||
        const q = new worker_queue_1.default({
 | 
					 | 
				
			||||||
            logger: console.log.bind(console),
 | 
					 | 
				
			||||||
            concurrency: 1,
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        q.subscribe(fn);
 | 
					 | 
				
			||||||
        q.enqueue(input);
 | 
					 | 
				
			||||||
        await new Promise((resolve) => {
 | 
					 | 
				
			||||||
            setTimeout(resolve);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledWith(input);
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(1);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    test('Executes worker', async () => {
 | 
					 | 
				
			||||||
        const fn = jest.fn();
 | 
					 | 
				
			||||||
        const input = 1;
 | 
					 | 
				
			||||||
        const q = new worker_queue_1.default({
 | 
					 | 
				
			||||||
            logger: console.log.bind(console),
 | 
					 | 
				
			||||||
            concurrency: 1,
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        q.subscribe(fn);
 | 
					 | 
				
			||||||
        q.enqueue(input);
 | 
					 | 
				
			||||||
        q.enqueue(input);
 | 
					 | 
				
			||||||
        q.enqueue(input);
 | 
					 | 
				
			||||||
        await new Promise((resolve) => {
 | 
					 | 
				
			||||||
            setTimeout(resolve);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledWith(input);
 | 
					 | 
				
			||||||
        expect(fn).toHaveBeenCalledTimes(3);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
});
 | 
					 | 
				
			||||||
//# sourceMappingURL=worker-queue.test.js.map
 | 
					 | 
				
			||||||
@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					import WorkerQueue from '../worker-queue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('WorkerQueue', () => {
 | 
				
			||||||
 | 
					  test('Executes worker', async () => {
 | 
				
			||||||
 | 
					    const fn = jest.fn();
 | 
				
			||||||
 | 
					    const input = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const q = new WorkerQueue({
 | 
				
			||||||
 | 
					      logger: console.log.bind(console),
 | 
				
			||||||
 | 
					      concurrency: 1,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    q.subscribe(fn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    q.enqueue(input);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await new Promise((resolve) => {
 | 
				
			||||||
 | 
					      setTimeout(resolve);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledWith(input);
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(1);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  test('Executes worker', async () => {
 | 
				
			||||||
 | 
					    const fn = jest.fn();
 | 
				
			||||||
 | 
					    const input = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const q = new WorkerQueue({
 | 
				
			||||||
 | 
					      logger: console.log.bind(console),
 | 
				
			||||||
 | 
					      concurrency: 1,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    q.subscribe(fn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    q.enqueue(input);
 | 
				
			||||||
 | 
					    q.enqueue(input);
 | 
				
			||||||
 | 
					    q.enqueue(input);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await new Promise((resolve) => {
 | 
				
			||||||
 | 
					      setTimeout(resolve);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledWith(input);
 | 
				
			||||||
 | 
					    expect(fn).toHaveBeenCalledTimes(3);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user