import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import path from 'path'; import fs from 'fs/promises'; import os from 'os'; import { getAutomakerDir, getFeaturesDir, getFeatureDir, getFeatureImagesDir, getBoardDir, getImagesDir, getWorktreesDir, getAppSpecPath, getBranchTrackingPath, ensureAutomakerDir, getGlobalSettingsPath, getCredentialsPath, getProjectSettingsPath, ensureDataDir, } from '@automaker/platform'; describe('automaker-paths.ts', () => { const projectPath = path.join('/test', 'project'); describe('getAutomakerDir', () => { it('should return path to .automaker directory', () => { expect(getAutomakerDir(projectPath)).toBe(path.join(projectPath, '.automaker')); }); it('should handle paths with trailing slashes', () => { const pathWithSlash = path.join('/test', 'project') + path.sep; expect(getAutomakerDir(pathWithSlash)).toBe(path.join(pathWithSlash, '.automaker')); }); }); describe('getFeaturesDir', () => { it('should return path to features directory', () => { expect(getFeaturesDir(projectPath)).toBe(path.join(projectPath, '.automaker', 'features')); }); }); describe('getFeatureDir', () => { it('should return path to specific feature directory', () => { expect(getFeatureDir(projectPath, 'feature-123')).toBe( path.join(projectPath, '.automaker', 'features', 'feature-123') ); }); it('should handle feature IDs with special characters', () => { expect(getFeatureDir(projectPath, 'my-feature_v2')).toBe( path.join(projectPath, '.automaker', 'features', 'my-feature_v2') ); }); }); describe('getFeatureImagesDir', () => { it('should return path to feature images directory', () => { expect(getFeatureImagesDir(projectPath, 'feature-123')).toBe( path.join(projectPath, '.automaker', 'features', 'feature-123', 'images') ); }); }); describe('getBoardDir', () => { it('should return path to board directory', () => { expect(getBoardDir(projectPath)).toBe(path.join(projectPath, '.automaker', 'board')); }); }); describe('getImagesDir', () => { it('should return path to images directory', () => { expect(getImagesDir(projectPath)).toBe(path.join(projectPath, '.automaker', 'images')); }); }); describe('getWorktreesDir', () => { it('should return path to worktrees directory', () => { expect(getWorktreesDir(projectPath)).toBe(path.join(projectPath, '.automaker', 'worktrees')); }); }); describe('getAppSpecPath', () => { it('should return path to app_spec.txt file', () => { expect(getAppSpecPath(projectPath)).toBe( path.join(projectPath, '.automaker', 'app_spec.txt') ); }); }); describe('getBranchTrackingPath', () => { it('should return path to active-branches.json file', () => { expect(getBranchTrackingPath(projectPath)).toBe( path.join(projectPath, '.automaker', 'active-branches.json') ); }); }); describe('ensureAutomakerDir', () => { let testDir: string; beforeEach(async () => { testDir = path.join(os.tmpdir(), `automaker-paths-test-${Date.now()}`); await fs.mkdir(testDir, { recursive: true }); }); afterEach(async () => { try { await fs.rm(testDir, { recursive: true, force: true }); } catch { // Ignore cleanup errors } }); it('should create automaker directory and return path', async () => { const result = await ensureAutomakerDir(testDir); expect(result).toBe(path.join(testDir, '.automaker')); const stats = await fs.stat(result); expect(stats.isDirectory()).toBe(true); }); it('should succeed if directory already exists', async () => { const automakerDir = path.join(testDir, '.automaker'); await fs.mkdir(automakerDir, { recursive: true }); const result = await ensureAutomakerDir(testDir); expect(result).toBe(automakerDir); }); }); describe('getGlobalSettingsPath', () => { it('should return path to settings.json in data directory', () => { const dataDir = '/test/data'; const result = getGlobalSettingsPath(dataDir); expect(result).toBe(path.join(dataDir, 'settings.json')); }); it('should handle paths with trailing slashes', () => { const dataDir = '/test/data' + path.sep; const result = getGlobalSettingsPath(dataDir); expect(result).toBe(path.join(dataDir, 'settings.json')); }); }); describe('getCredentialsPath', () => { it('should return path to credentials.json in data directory', () => { const dataDir = '/test/data'; const result = getCredentialsPath(dataDir); expect(result).toBe(path.join(dataDir, 'credentials.json')); }); it('should handle paths with trailing slashes', () => { const dataDir = '/test/data' + path.sep; const result = getCredentialsPath(dataDir); expect(result).toBe(path.join(dataDir, 'credentials.json')); }); }); describe('getProjectSettingsPath', () => { it('should return path to settings.json in project .automaker directory', () => { const projectPath = '/test/project'; const result = getProjectSettingsPath(projectPath); expect(result).toBe(path.join(projectPath, '.automaker', 'settings.json')); }); it('should handle paths with trailing slashes', () => { const projectPath = '/test/project' + path.sep; const result = getProjectSettingsPath(projectPath); expect(result).toBe(path.join(projectPath, '.automaker', 'settings.json')); }); }); describe('ensureDataDir', () => { let testDir: string; beforeEach(async () => { testDir = path.join(os.tmpdir(), `data-dir-test-${Date.now()}`); }); afterEach(async () => { try { await fs.rm(testDir, { recursive: true, force: true }); } catch { // Ignore cleanup errors } }); it('should create data directory and return path', async () => { const result = await ensureDataDir(testDir); expect(result).toBe(testDir); const stats = await fs.stat(testDir); expect(stats.isDirectory()).toBe(true); }); it('should succeed if directory already exists', async () => { await fs.mkdir(testDir, { recursive: true }); const result = await ensureDataDir(testDir); expect(result).toBe(testDir); }); it('should create nested directories', async () => { const nestedDir = path.join(testDir, 'nested', 'deep'); const result = await ensureDataDir(nestedDir); expect(result).toBe(nestedDir); const stats = await fs.stat(nestedDir); expect(stats.isDirectory()).toBe(true); }); }); });