import { useAuthFactory } from "../../Models/SettingInfo";
import { useHeader, useTokenInfo, useUrls } from "../../Models/StorageManager/TokenInfo";
import { LoginByUserPass } from "./LoginByUserPass";

test("request and response of login", async () => {
    const authFactory = useAuthFactory();
    const loginByUserPass = LoginByUserPass.createNew(authFactory);
    const header = useHeader();

    expect(loginByUserPass).toBeTruthy();
    if (!loginByUserPass) {
        return;
    }

    expect(loginByUserPass.actionPath).toBe('login');
    expect(loginByUserPass.controllerPath).toBe('auth');
    expect(loginByUserPass.routerPath).toBe('/home');
    expect(header.headers!.Accept).toBe(loginByUserPass.authFactory.mainStateManager.tokenInfo.headerOfAxios.headers!.Accept);
    expect(header.headers!["content-type"]).toBe(loginByUserPass.authFactory.mainStateManager.tokenInfo.headerOfAxios.headers!["content-type"]);
    expect(header.headers!.Authorization).toBe(loginByUserPass.authFactory.mainStateManager.tokenInfo.headerOfAxios.headers!.Authorization);

    var result = await loginByUserPass.loginAxios("admin", "1", false);
    expect(result).not.toBeFalsy();
    expect(result).toBeTruthy();

    expect(result.message).toBeFalsy();
    expect(result.message).not.toBeTruthy();

    expect(result.isSuccess).not.toBeFalsy();
    expect(result.isSuccess).toBeTruthy();

    expect(result.token).not.toBeFalsy();
    expect(result.token).toBeTruthy();

    expect(result.data).not.toBeFalsy();
    expect(result.data).toBeTruthy();

    expect(result.data.userInfo).not.toBeFalsy();
    expect(result.data.userInfo).toBeTruthy();

    expect(result.data.fiscalYearsInfo).not.toBeFalsy();
    expect(result.data.fiscalYearsInfo).toBeTruthy();
    expect(result.data.fiscalYearsInfo.activeFiscalYearId)

    expect(result.data.settingInfo).not.toBeFalsy();
    expect(result.data.settingInfo).toBeTruthy();

    expect(result.data.subSystemsInfo).not.toBeFalsy();
    expect(result.data.subSystemsInfo).toBeTruthy();
}, 15000);


test("only login", async () => {
    const authFactory = useAuthFactory();
    const loginByUserPass = LoginByUserPass.createNew(authFactory);
    const tokenInfo = useTokenInfo();

    expect(loginByUserPass).toBeTruthy();
    if (!loginByUserPass) {
        return;
    }

    var result = await loginByUserPass.loginAxios("admin", "1", false);

    if (result.isSuccess) {
        const authFactory = loginByUserPass.authFactory;
        expect(tokenInfo.token).toBe(result.token);
        expect(authFactory.mainStateManager.userInfo.id).toBe(1);
        expect(authFactory.mainStateManager.userInfo.code).toBe(0);
        expect(authFactory.mainStateManager.userInfo.email).toBe('');
        expect(authFactory.mainStateManager.userInfo.family).toBe('');
        expect(authFactory.mainStateManager.userInfo.image).toBe('');
        expect(authFactory.mainStateManager.userInfo.isAdmin).toBe(true);
        expect(authFactory.mainStateManager.userInfo.isInactive).toBe(false);
        expect(authFactory.mainStateManager.userInfo.mobile).toBe('');
        expect(authFactory.mainStateManager.userInfo.name).toBe('کاربر ارشد');
        expect(authFactory.mainStateManager.userInfo.user).toBe('admin');
        expect(authFactory.mainStateManager.userInfo.isAuthenticated()).toBe(true);

        expect(result.data.settingInfo.codingHesab.includes(authFactory.mainStateManager.settingInfo.codingHesab.coding) && authFactory.mainStateManager.settingInfo.codingHesab.coding).toBeTruthy();
        expect(result.data.settingInfo.codingMarkaz1.includes(authFactory.mainStateManager.settingInfo.codingMarkaz1.coding) && authFactory.mainStateManager.settingInfo.codingMarkaz1.coding).toBeTruthy();
        expect(result.data.settingInfo.codingMarkaz2.includes(authFactory.mainStateManager.settingInfo.codingMarkaz2.coding) && authFactory.mainStateManager.settingInfo.codingMarkaz2.coding).toBeTruthy();
        expect(result.data.settingInfo.codingMarkaz3.includes(authFactory.mainStateManager.settingInfo.codingMarkaz3.coding) && authFactory.mainStateManager.settingInfo.codingMarkaz3.coding).toBeTruthy();
        expect(result.data.settingInfo.codingKala.includes(authFactory.mainStateManager.settingInfo.codingKala.coding) && authFactory.mainStateManager.settingInfo.codingKala.coding).toBeTruthy();

        expect(authFactory.mainStateManager.fiscalYearsInfo.activeFiscalYear?.id).toBe(result.data.fiscalYearsInfo.activeFiscalYearId);
        expect(authFactory.mainStateManager.fiscalYearsInfo.fiscalYears.length).toBe(result.data.fiscalYearsInfo.fiscalYears.length);

        expect(authFactory.mainStateManager.subSystemsInfo.all.length).toBe(result.data.subSystemsInfo.all.length);
        expect(authFactory.mainStateManager.subSystemsInfo.all.length > 10).toBeTruthy();


        expect(authFactory.mainStateManager.subSystemsInfo.roled.length).toBe(result.data.subSystemsInfo.roled.length);
        expect(authFactory.mainStateManager.subSystemsInfo.selected.length).toBe(result.data.subSystemsInfo.selected.length);
    }
}, 15000);