import {getMemoryTemplateApi, basicAppHierarchyCreator_WithFields_AndIndexes} from "./specHelpers";
import {initialiseData} from "../src/appInitialise/initialiseData";
import {TRANSACTIONS_FOLDER} from "../src/transactions/transactionsCommon";
import {AUTH_FOLDER, USERS_LIST_FILE, ACCESS_LEVELS_FILE} from "../src/authApi/authCommon";

describe("initialiseData", () => {

    it("should create csv file for each index, when does not exist", async () => {
        const {appDef, datastore} = getApplicationDefinition();
        await initialiseData(datastore, appDef);
    
        expect(await datastore.exists(`/customer_index/index.csv`)).toBeTruthy();
        expect(await datastore.exists(`/customer_index`)).toBeTruthy();
        expect(await datastore.exists(`/deceased/index.csv`)).toBeTruthy();
        expect(await datastore.exists(`/deceased`)).toBeTruthy();
    });

    it("should create folder for collection", async () => {
        const {appDef, datastore} = getApplicationDefinition();
        await initialiseData(datastore, appDef);
        expect(await datastore.exists(`/customers`)).toBeTruthy();
    });


    it("should create allids folders", async () => {
        const {appDef, datastore, h} = getApplicationDefinition();
        await initialiseData(datastore, appDef);

        const allIdsTypeFolder = "/customers/allids/" + h.customerRecord.nodeId;
        const allIdsFolder = "/customers/allids";
        expect(await datastore.exists(allIdsTypeFolder)).toBeTruthy();
        expect(await datastore.exists(allIdsFolder)).toBeTruthy();
    });

    it("should create transactions folder", async () => {
        const {appDef, datastore} = getApplicationDefinition();
        await initialiseData(datastore, appDef);
        expect(await datastore.exists(TRANSACTIONS_FOLDER)).toBeTruthy();
    });

    it("should create auth folder", async () => {
        const {appDef, datastore} = getApplicationDefinition();
        await initialiseData(datastore, appDef);
        expect(await datastore.exists(AUTH_FOLDER)).toBeTruthy();
    });

    it("should create users list", async () => {
        const {appDef, datastore} = getApplicationDefinition();
        await initialiseData(datastore, appDef);
        expect(await datastore.exists(USERS_LIST_FILE)).toBeTruthy();
    });

    it("should create access levels file", async () => {
        const {appDef, datastore} = getApplicationDefinition();
        await initialiseData(datastore, appDef);
        expect(await datastore.exists(ACCESS_LEVELS_FILE)).toBeTruthy();
    });

    it("should create access levels file, with supplied object", async () => {
        const {appDef, datastore} = getApplicationDefinition();
        await initialiseData(datastore, appDef, { version: 0, levels: [{
            name:"owner", permissions:[{type:"create user"}]
        }] });
        const levels = await datastore.loadJson(ACCESS_LEVELS_FILE);
        expect(levels.levels[0].name).toBe("owner");
    });

    const getApplicationDefinition = () => {
        const {templateApi, app} = getMemoryTemplateApi();
        const h = basicAppHierarchyCreator_WithFields_AndIndexes(templateApi);
        return {appDef:{hierarchy:h.root, actions:[], triggers:[]}, datastore:app.datastore, h};
    }

});