diff --git a/packages/backend/src/managers/applicationManager.spec.ts b/packages/backend/src/managers/applicationManager.spec.ts index 692cf1068..7e6d913a8 100644 --- a/packages/backend/src/managers/applicationManager.spec.ts +++ b/packages/backend/src/managers/applicationManager.spec.ts @@ -4,8 +4,20 @@ import type { RecipeStatusRegistry } from '../registries/RecipeStatusRegistry'; import type { ExtensionContext } from '@podman-desktop/api'; import type { GitManager } from './gitManager'; import os from 'os'; -import fs, { type Dirent } from 'fs'; +import fs, { Stats, type Dirent } from 'fs'; import path from 'path'; +import type { Recipe } from '@shared/src/models/IRecipe'; +import type { ModelInfo } from '@shared/src/models/IModelInfo'; + +const mocks = vi.hoisted(() => { + return { + parseYamlMock: vi.fn(), + }; +}); + +vi.mock('../models/AIConfig', () => ({ + parseYaml: mocks.parseYamlMock, +})); test('appUserDirectory should be under home directory', () => { vi.spyOn(os, 'homedir').mockReturnValue('/home/user'); @@ -54,3 +66,73 @@ test('getLocalModels should return models in local directory', () => { }, ]); }); + +test('pullApplication should clone repository and call downloadModelMain', async () => { + const setStatusMock = vi.fn(); + const cloneRepositoryMock = vi.fn(); + vi.spyOn(os, 'homedir').mockReturnValue('/home/user'); + vi.spyOn(fs, 'mkdirSync').mockReturnValue(undefined); + vi.spyOn(fs, 'existsSync').mockImplementation((path: string) => { + if (path.endsWith('recipe1')) { + return false; + } else if (path.endsWith('ai-studio.yaml')) { + return true; + } + return false; + }); + vi.spyOn(fs, 'statSync').mockImplementation((path: string) => { + if (path.endsWith('recipe1')) { + const stat = new Stats(); + stat.isDirectory = () => true; + return stat; + } else if (path.endsWith('ai-studio.yaml')) { + const stat = new Stats(); + stat.isDirectory = () => false; + return stat; + } + }); + vi.spyOn(fs, 'readFileSync').mockImplementation((_path: string) => { + return ''; + }); + mocks.parseYamlMock.mockReturnValue({ + application: { + containers: [], + }, + }); + const manager = new ApplicationManager( + { + cloneRepository: cloneRepositoryMock, + } as unknown as GitManager, + { + setStatus: setStatusMock, + } as unknown as RecipeStatusRegistry, + {} as ExtensionContext, + ); + + const getLocalModelsSpy = vi.spyOn(manager, 'getLocalModels'); + getLocalModelsSpy.mockReturnValue([]); + const downloadModelMainSpy = vi.spyOn(manager, 'downloadModelMain'); + downloadModelMainSpy.mockResolvedValue(''); + + const recipe: Recipe = { + id: 'recipe1', + name: 'Recipe 1', + categories: [], + description: '', + readme: '', + repository: 'repo', + }; + const model: ModelInfo = { + id: 'model1', + description: '', + hw: '', + license: '', + name: 'Model 1', + popularity: 1, + registry: '', + url: '', + }; + await manager.pullApplication(recipe, model); + expect(cloneRepositoryMock).toHaveBeenNthCalledWith(1, 'repo', '/home/user/podman-desktop/ai-studio/recipe1'); + expect(downloadModelMainSpy).toHaveBeenCalledOnce(); +});