import {createAppDefinitionWithActionsAndTriggers} from "./specHelpers";
import {getAppApis} from "../src";
import {permission} from "../src/authApi/permissions";

describe("actions execute", () => {

    it("should successfully execute actions", async () => {
        const {emails, app} = await createAppDefinitionWithActionsAndTriggers();

        app.actions.sendEmail("an email");
        expect(emails).toEqual(["an email"]);
    });

    it("should successfully execute actions via actions api", async () => {
        const {emails, actionsApi} = await createAppDefinitionWithActionsAndTriggers();

        actionsApi.execute("sendEmail", "an email");
        expect(emails).toEqual(["an email"]);
    });

    it("should throw error when user user does not have permission", async () => {
        const {actionsApi, app} = await createAppDefinitionWithActionsAndTriggers();
        app.removePermission(permission.executeAction.get("sendEmail"));
        expect(() => actionsApi.execute("sendEmail")).toThrow(/Unauthorized/);
    });

    it("should not depend on having any other permissions", async () => {
        const {actionsApi, app} = await createAppDefinitionWithActionsAndTriggers();
        app.withOnlyThisPermission(permission.executeAction.get("sendEmail"));
        actionsApi.execute("sendEmail", "am email");
    });
    
});

describe("triggers execute", () => {

    it("should run action when no condition is set", async () => {
        const {logs, 
            templateApi, behaviourSources} = await createAppDefinitionWithActionsAndTriggers();

        const {recordApi, withFullAccess} = await getAppApis(
            templateApi._storeHandle, behaviourSources);
        withFullAccess();
        // trigger setup to add to logs on recordApi:save:onError event
        const customer = recordApi.getNew("/customers", "customer");

        let errCaught;
        try {
            await recordApi.save(customer);
        } catch (e) {
            errCaught = e.message;
        }

        expect(logs).toEqual([errCaught]);

    });

    it("should run action when condition is met", async () => {
        const {call_timers, 
               templateApi, 
               behaviourSources} = await createAppDefinitionWithActionsAndTriggers();

        const {recordApi, withFullAccess} = await getAppApis(
            templateApi._storeHandle, behaviourSources);
        withFullAccess();

        const customer = recordApi.getNew("/customers", "customer");
        customer.surname = "Ledog";

        // trigger call_timer set to return 999 all the time, just for test
        // trigger set to run for type = customer
        await recordApi.save(customer);
        
        expect(call_timers).toEqual([999]);
    });

    it("should not run action when condition is not met", async () => {
        const {call_timers, 
               templateApi, 
               behaviourSources} = await createAppDefinitionWithActionsAndTriggers();

        const {recordApi, withFullAccess} = await getAppApis(
            templateApi._storeHandle, behaviourSources);
        withFullAccess();

        const partner = recordApi.getNew("/partners", "partner");

        // trigger call_timer set to return 999 all the time, just for test
        // trigger set to run for type = customer
        await recordApi.save(partner);
        
        expect(call_timers).toEqual([]);
    });

});