"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("../../../../testing/dom-test-environment");
const useOnInstallHandler_1 = require("./useOnInstallHandler");
const react_1 = require("@testing-library/react");
const PluginService_1 = require("../../../../services/plugins/PluginService");
jest.mock('../../../../services/plugins/PluginService');
const pluginServiceInstance = {
    updatePluginFromRepo: jest.fn(),
    installPluginFromRepo: jest.fn(),
};
const pluginId = 'test.plugin';
const setInstallingPluginIds = jest.fn();
const repoApi = jest.fn();
const onPluginSettingsChange = jest.fn();
const itemEvent = {
    item: { manifest: { id: pluginId } },
};
const callHook = (isUpdate, pluginEnabled = true, pluginInstalledViaGUI = true) => () => (0, useOnInstallHandler_1.default)(setInstallingPluginIds, { current: {
        [pluginId]: pluginInstalledViaGUI ? {
            enabled: pluginEnabled,
            deleted: false,
            hasBeenUpdated: false,
        } : undefined,
    } }, repoApi, onPluginSettingsChange, isUpdate);
describe('useOnInstallHandler', () => {
    beforeAll(() => {
        PluginService_1.default.instance.mockReturnValue(pluginServiceInstance);
        PluginService_1.defaultPluginSetting.mockImplementation(jest.requireActual('../../../../services/plugins/PluginService').defaultPluginSetting);
    });
    beforeEach(() => {
        jest.clearAllMocks();
    });
    test('should report that the plugin is being updated', async () => {
        const { result: { current: onUpdate } } = (0, react_1.renderHook)(callHook(true));
        await onUpdate(itemEvent);
        expect(setInstallingPluginIds).toHaveBeenCalledTimes(2);
        expect(setInstallingPluginIds.mock.calls[0][0]({})).toMatchObject({ [pluginId]: true });
        expect(setInstallingPluginIds.mock.calls[1][0]({})).toMatchObject({ [pluginId]: false });
    });
    test('should update the plugin when there is an update', async () => {
        const { result: { current: onUpdate } } = (0, react_1.renderHook)(callHook(true));
        await onUpdate(itemEvent);
        expect(pluginServiceInstance.updatePluginFromRepo).toHaveBeenCalledWith(undefined, pluginId);
    });
    test('should install the plugin when it is not yet installed', async () => {
        const { result: { current: onInstall } } = (0, react_1.renderHook)(callHook(false));
        await onInstall(itemEvent);
        expect(pluginServiceInstance.installPluginFromRepo).toHaveBeenCalledWith(undefined, pluginId);
    });
    test('should preserve the enabled flag when plugin is updated', async () => {
        const { result: { current: onUpdate } } = (0, react_1.renderHook)(callHook(true, false));
        await onUpdate(itemEvent);
        const newSettings = onPluginSettingsChange.mock.calls[0][0].value;
        expect(newSettings[pluginId].enabled).toBe(false);
    });
    test('should indicate it when plugin has been updated', async () => {
        const { result: { current: onUpdate } } = (0, react_1.renderHook)(callHook(true));
        await onUpdate(itemEvent);
        const newSettings = onPluginSettingsChange.mock.calls[0][0].value;
        expect(newSettings[pluginId].hasBeenUpdated).toBe(true);
    });
    test('should not fail when plugin was not installed through the GUI', async () => {
        const { result: { current: onUpdate } } = (0, react_1.renderHook)(callHook(true, true, false));
        await onUpdate(itemEvent);
    });
});
//# sourceMappingURL=useOnInstallHandler.test.js.map