import {ZipProcessor} from '../src/index.js';
import path from 'path';
import fs from 'fs';

jest.mock('@apic/studio-logger', ()=> ({
    LoggerConfig: {
        isLoggerEnabled: jest.fn(),
    },
}));

jest.mock('@apic/studio-shared', () => ({
    ErrorResponse: jest.fn(),
    Metadata_Ref: jest.fn(),
    SpecObject: jest.fn(),
    YamlContent: jest.fn(),
    UpperCaseKinds: jest.fn(),
}));

jest.mock('../src/service/log-wrapper.ts');

describe('ZipProcessor', () => {
    it('should process and send the response for valid Asset', async() => {

        const zipFilePath = path.resolve(__dirname, './assets/gateway-asset.zip');
        const Buffer = fs.readFileSync(zipFilePath);
        const zipprocess = new ZipProcessor(Buffer);
        const result=await zipprocess.processZip();
        expect(result).not.toBe(undefined);
        expect(result).not.toBe(false);

    });

    it('should return null for the invalid asset', async () => {

        const zipFilePath = path.resolve(__dirname, './assets/gateway-asset-error.zip');
        const Buffer = fs.readFileSync(zipFilePath);
        const zipprocess = new ZipProcessor(Buffer);
        const result=await zipprocess.processZip();
        expect(result).not.toBe(undefined);
        expect(result).not.toBe(false);
        expect(result).toBe(null);

    });

    it('should return false if zip file does not contain minimum required files', async () => {
        const obj = new ZipProcessor(Buffer.from(''));
        jest.spyOn(obj as any, 'validateReferences').mockResolvedValue(true);
        jest.spyOn(obj as any, 'validatePaths').mockResolvedValue(true);
        jest.spyOn(obj as any, 'validateZip').mockResolvedValue(false);
        const result = await obj['validate']();
        expect(result).toBe(false);
    });

    it('should return false if api file is not valid', async () => {
        const obj = new ZipProcessor(Buffer.from(''));
        jest.spyOn(obj as any, 'validateReferences').mockResolvedValue(true);
        jest.spyOn(obj as any, 'validatePaths').mockResolvedValue(true);
        jest.spyOn(obj as any, 'validateZip').mockResolvedValue(true);
        jest.spyOn(obj as any, 'validateApiFiles').mockResolvedValue(false);
        const result = await obj['validate']();
        expect(result).toBe(false);
    });

    it('should return false if yaml file is not valid', async () => {
        const obj = new ZipProcessor(Buffer.from(''));
        jest.spyOn(obj as any, 'validateReferences').mockResolvedValue(true);
        jest.spyOn(obj as any, 'validatePaths').mockResolvedValue(true);
        jest.spyOn(obj as any, 'validateZip').mockResolvedValue(true);
        jest.spyOn(obj as any, 'validateApiFiles').mockResolvedValue(true);
        jest.spyOn(obj as any, 'validateYamlStructure').mockResolvedValue(false);
        const result = await obj['validate']();
        expect(result).toBe(false);
    });
});