import { Notify } from 'quasar';
import { onRequest, onResponseError } from 'src/boot/axios';
import { describe, expect, it, vi } from 'vitest';

vi.mock('src/composables/useSession', () => ({
    useSession: () => ({
        getToken: () => 'DEFAULT_TOKEN',
        isLoggedIn: () => vi.fn(),
        destroy: () => vi.fn(),
    }),
}));

vi.mock('src/stores/useStateQueryStore', () => ({
    useStateQueryStore: () => ({
        add: () => vi.fn(),
        remove: () => vi.fn(),
    }),
}));

describe('Axios boot', () => {
    describe('onRequest()', async () => {
        it('should set the "Authorization" property on the headers', async () => {
            const config = { headers: {} };

            const resultConfig = onRequest(config);

            expect(resultConfig).toEqual(
                expect.objectContaining({
                    headers: {
                        Authorization: 'DEFAULT_TOKEN',
                    },
                })
            );
        });
    });

    describe('onResponseError()', async () => {
        it('should call to the Notify plugin with a message error for an status code "500"', async () => {
            Notify.create = vi.fn();

            const error = {
                response: {
                    status: 500,
                },
            };

            const result = onResponseError(error);

            expect(result).rejects.toEqual(expect.objectContaining(error));
            expect(Notify.create).toHaveBeenCalledWith(
                expect.objectContaining({
                    message: 'An internal server error has ocurred',
                    type: 'negative',
                })
            );
        });

        it('should call to the Notify plugin with a message from the response property', async () => {
            Notify.create = vi.fn();

            const error = {
                response: {
                    status: 401,
                    data: {
                        error: {
                            message: 'Invalid user or password',
                        },
                    },
                },
            };

            const result = onResponseError(error);

            expect(result).rejects.toEqual(expect.objectContaining(error));
            expect(Notify.create).toHaveBeenCalledWith(
                expect.objectContaining({
                    message: 'Invalid user or password',
                    type: 'negative',
                })
            );
        });
    });
});
