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(),
    })
}));

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',
                })
            );
        });
    })
});