appwrite-utils-cli 1.5.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +199 -0
- package/README.md +251 -29
- package/dist/adapters/AdapterFactory.d.ts +10 -3
- package/dist/adapters/AdapterFactory.js +213 -17
- package/dist/adapters/TablesDBAdapter.js +60 -17
- package/dist/backups/operations/bucketBackup.d.ts +19 -0
- package/dist/backups/operations/bucketBackup.js +197 -0
- package/dist/backups/operations/collectionBackup.d.ts +30 -0
- package/dist/backups/operations/collectionBackup.js +201 -0
- package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
- package/dist/backups/operations/comprehensiveBackup.js +238 -0
- package/dist/backups/schemas/bucketManifest.d.ts +93 -0
- package/dist/backups/schemas/bucketManifest.js +33 -0
- package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
- package/dist/backups/schemas/comprehensiveManifest.js +32 -0
- package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
- package/dist/backups/tracking/centralizedTracking.js +274 -0
- package/dist/cli/commands/configCommands.d.ts +8 -0
- package/dist/cli/commands/configCommands.js +160 -0
- package/dist/cli/commands/databaseCommands.d.ts +13 -0
- package/dist/cli/commands/databaseCommands.js +478 -0
- package/dist/cli/commands/functionCommands.d.ts +7 -0
- package/dist/cli/commands/functionCommands.js +289 -0
- package/dist/cli/commands/schemaCommands.d.ts +7 -0
- package/dist/cli/commands/schemaCommands.js +134 -0
- package/dist/cli/commands/transferCommands.d.ts +5 -0
- package/dist/cli/commands/transferCommands.js +384 -0
- package/dist/collections/attributes.d.ts +5 -4
- package/dist/collections/attributes.js +539 -246
- package/dist/collections/indexes.js +39 -37
- package/dist/collections/methods.d.ts +2 -16
- package/dist/collections/methods.js +90 -538
- package/dist/collections/transferOperations.d.ts +7 -0
- package/dist/collections/transferOperations.js +331 -0
- package/dist/collections/wipeOperations.d.ts +16 -0
- package/dist/collections/wipeOperations.js +328 -0
- package/dist/config/configMigration.d.ts +87 -0
- package/dist/config/configMigration.js +390 -0
- package/dist/config/configValidation.d.ts +66 -0
- package/dist/config/configValidation.js +358 -0
- package/dist/config/yamlConfig.d.ts +455 -1
- package/dist/config/yamlConfig.js +145 -52
- package/dist/databases/methods.js +3 -2
- package/dist/databases/setup.d.ts +1 -2
- package/dist/databases/setup.js +9 -87
- package/dist/examples/yamlTerminologyExample.d.ts +42 -0
- package/dist/examples/yamlTerminologyExample.js +269 -0
- package/dist/functions/deployments.js +11 -10
- package/dist/functions/methods.d.ts +1 -1
- package/dist/functions/methods.js +5 -4
- package/dist/init.js +9 -9
- package/dist/interactiveCLI.d.ts +8 -17
- package/dist/interactiveCLI.js +181 -1172
- package/dist/main.js +364 -21
- package/dist/migrations/afterImportActions.js +22 -30
- package/dist/migrations/appwriteToX.js +71 -25
- package/dist/migrations/dataLoader.js +35 -26
- package/dist/migrations/importController.js +29 -30
- package/dist/migrations/relationships.js +13 -12
- package/dist/migrations/services/ImportOrchestrator.js +16 -19
- package/dist/migrations/transfer.js +46 -46
- package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +3 -1
- package/dist/migrations/yaml/YamlImportConfigLoader.js +6 -3
- package/dist/migrations/yaml/YamlImportIntegration.d.ts +9 -3
- package/dist/migrations/yaml/YamlImportIntegration.js +22 -11
- package/dist/migrations/yaml/generateImportSchemas.d.ts +14 -1
- package/dist/migrations/yaml/generateImportSchemas.js +736 -7
- package/dist/schemas/authUser.d.ts +1 -1
- package/dist/setupController.js +3 -2
- package/dist/shared/backupMetadataSchema.d.ts +94 -0
- package/dist/shared/backupMetadataSchema.js +38 -0
- package/dist/shared/backupTracking.d.ts +18 -0
- package/dist/shared/backupTracking.js +176 -0
- package/dist/shared/confirmationDialogs.js +15 -15
- package/dist/shared/errorUtils.d.ts +54 -0
- package/dist/shared/errorUtils.js +95 -0
- package/dist/shared/functionManager.js +20 -19
- package/dist/shared/indexManager.js +12 -11
- package/dist/shared/jsonSchemaGenerator.js +10 -26
- package/dist/shared/logging.d.ts +51 -0
- package/dist/shared/logging.js +70 -0
- package/dist/shared/messageFormatter.d.ts +2 -0
- package/dist/shared/messageFormatter.js +10 -0
- package/dist/shared/migrationHelpers.d.ts +6 -16
- package/dist/shared/migrationHelpers.js +24 -21
- package/dist/shared/operationLogger.d.ts +8 -1
- package/dist/shared/operationLogger.js +11 -24
- package/dist/shared/operationQueue.d.ts +28 -1
- package/dist/shared/operationQueue.js +268 -66
- package/dist/shared/operationsTable.d.ts +26 -0
- package/dist/shared/operationsTable.js +286 -0
- package/dist/shared/operationsTableSchema.d.ts +48 -0
- package/dist/shared/operationsTableSchema.js +35 -0
- package/dist/shared/relationshipExtractor.d.ts +56 -0
- package/dist/shared/relationshipExtractor.js +138 -0
- package/dist/shared/schemaGenerator.d.ts +19 -1
- package/dist/shared/schemaGenerator.js +56 -75
- package/dist/storage/backupCompression.d.ts +20 -0
- package/dist/storage/backupCompression.js +67 -0
- package/dist/storage/methods.d.ts +16 -2
- package/dist/storage/methods.js +98 -14
- package/dist/users/methods.js +9 -8
- package/dist/utils/configDiscovery.d.ts +78 -0
- package/dist/utils/configDiscovery.js +430 -0
- package/dist/utils/directoryUtils.d.ts +22 -0
- package/dist/utils/directoryUtils.js +59 -0
- package/dist/utils/getClientFromConfig.d.ts +17 -8
- package/dist/utils/getClientFromConfig.js +162 -17
- package/dist/utils/helperFunctions.d.ts +16 -2
- package/dist/utils/helperFunctions.js +19 -5
- package/dist/utils/loadConfigs.d.ts +34 -9
- package/dist/utils/loadConfigs.js +236 -316
- package/dist/utils/pathResolvers.d.ts +53 -0
- package/dist/utils/pathResolvers.js +72 -0
- package/dist/utils/projectConfig.d.ts +119 -0
- package/dist/utils/projectConfig.js +171 -0
- package/dist/utils/retryFailedPromises.js +4 -2
- package/dist/utils/sessionAuth.d.ts +48 -0
- package/dist/utils/sessionAuth.js +164 -0
- package/dist/utils/sessionPreservationExample.d.ts +1666 -0
- package/dist/utils/sessionPreservationExample.js +101 -0
- package/dist/utils/setupFiles.js +301 -41
- package/dist/utils/typeGuards.d.ts +35 -0
- package/dist/utils/typeGuards.js +57 -0
- package/dist/utils/versionDetection.js +145 -9
- package/dist/utils/yamlConverter.d.ts +53 -3
- package/dist/utils/yamlConverter.js +232 -13
- package/dist/utils/yamlLoader.d.ts +70 -0
- package/dist/utils/yamlLoader.js +263 -0
- package/dist/utilsController.d.ts +36 -3
- package/dist/utilsController.js +186 -56
- package/package.json +12 -2
- package/src/adapters/AdapterFactory.ts +263 -35
- package/src/adapters/TablesDBAdapter.ts +225 -36
- package/src/backups/operations/bucketBackup.ts +277 -0
- package/src/backups/operations/collectionBackup.ts +310 -0
- package/src/backups/operations/comprehensiveBackup.ts +342 -0
- package/src/backups/schemas/bucketManifest.ts +78 -0
- package/src/backups/schemas/comprehensiveManifest.ts +76 -0
- package/src/backups/tracking/centralizedTracking.ts +352 -0
- package/src/cli/commands/configCommands.ts +194 -0
- package/src/cli/commands/databaseCommands.ts +635 -0
- package/src/cli/commands/functionCommands.ts +379 -0
- package/src/cli/commands/schemaCommands.ts +163 -0
- package/src/cli/commands/transferCommands.ts +457 -0
- package/src/collections/attributes.ts +900 -621
- package/src/collections/attributes.ts.backup +1555 -0
- package/src/collections/indexes.ts +116 -114
- package/src/collections/methods.ts +295 -968
- package/src/collections/transferOperations.ts +516 -0
- package/src/collections/wipeOperations.ts +501 -0
- package/src/config/README.md +274 -0
- package/src/config/configMigration.ts +575 -0
- package/src/config/configValidation.ts +445 -0
- package/src/config/yamlConfig.ts +168 -55
- package/src/databases/methods.ts +3 -2
- package/src/databases/setup.ts +11 -138
- package/src/examples/yamlTerminologyExample.ts +341 -0
- package/src/functions/deployments.ts +14 -12
- package/src/functions/methods.ts +11 -11
- package/src/functions/templates/hono-typescript/README.md +286 -0
- package/src/functions/templates/hono-typescript/package.json +26 -0
- package/src/functions/templates/hono-typescript/src/adapters/request.ts +74 -0
- package/src/functions/templates/hono-typescript/src/adapters/response.ts +106 -0
- package/src/functions/templates/hono-typescript/src/app.ts +180 -0
- package/src/functions/templates/hono-typescript/src/context.ts +103 -0
- package/src/functions/templates/hono-typescript/src/index.ts +54 -0
- package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +119 -0
- package/src/functions/templates/hono-typescript/tsconfig.json +20 -0
- package/src/functions/templates/typescript-node/package.json +2 -1
- package/src/functions/templates/typescript-node/src/context.ts +103 -0
- package/src/functions/templates/typescript-node/src/index.ts +18 -12
- package/src/functions/templates/uv/pyproject.toml +1 -0
- package/src/functions/templates/uv/src/context.py +125 -0
- package/src/functions/templates/uv/src/index.py +35 -5
- package/src/init.ts +9 -11
- package/src/interactiveCLI.ts +278 -1596
- package/src/main.ts +418 -24
- package/src/migrations/afterImportActions.ts +71 -44
- package/src/migrations/appwriteToX.ts +100 -34
- package/src/migrations/dataLoader.ts +48 -34
- package/src/migrations/importController.ts +44 -39
- package/src/migrations/relationships.ts +28 -18
- package/src/migrations/services/ImportOrchestrator.ts +24 -27
- package/src/migrations/transfer.ts +159 -121
- package/src/migrations/yaml/YamlImportConfigLoader.ts +11 -4
- package/src/migrations/yaml/YamlImportIntegration.ts +47 -20
- package/src/migrations/yaml/generateImportSchemas.ts +751 -12
- package/src/setupController.ts +3 -2
- package/src/shared/backupMetadataSchema.ts +93 -0
- package/src/shared/backupTracking.ts +211 -0
- package/src/shared/confirmationDialogs.ts +19 -19
- package/src/shared/errorUtils.ts +110 -0
- package/src/shared/functionManager.ts +21 -20
- package/src/shared/indexManager.ts +12 -11
- package/src/shared/jsonSchemaGenerator.ts +38 -52
- package/src/shared/logging.ts +75 -0
- package/src/shared/messageFormatter.ts +14 -1
- package/src/shared/migrationHelpers.ts +45 -38
- package/src/shared/operationLogger.ts +11 -36
- package/src/shared/operationQueue.ts +322 -93
- package/src/shared/operationsTable.ts +338 -0
- package/src/shared/operationsTableSchema.ts +60 -0
- package/src/shared/relationshipExtractor.ts +214 -0
- package/src/shared/schemaGenerator.ts +179 -219
- package/src/storage/backupCompression.ts +88 -0
- package/src/storage/methods.ts +131 -34
- package/src/users/methods.ts +11 -9
- package/src/utils/configDiscovery.ts +502 -0
- package/src/utils/directoryUtils.ts +61 -0
- package/src/utils/getClientFromConfig.ts +205 -22
- package/src/utils/helperFunctions.ts +23 -5
- package/src/utils/loadConfigs.ts +313 -345
- package/src/utils/pathResolvers.ts +81 -0
- package/src/utils/projectConfig.ts +299 -0
- package/src/utils/retryFailedPromises.ts +4 -2
- package/src/utils/sessionAuth.ts +230 -0
- package/src/utils/setupFiles.ts +322 -54
- package/src/utils/typeGuards.ts +65 -0
- package/src/utils/versionDetection.ts +218 -64
- package/src/utils/yamlConverter.ts +296 -13
- package/src/utils/yamlLoader.ts +364 -0
- package/src/utilsController.ts +314 -110
- package/tests/README.md +497 -0
- package/tests/adapters/AdapterFactory.test.ts +277 -0
- package/tests/integration/syncOperations.test.ts +463 -0
- package/tests/jest.config.js +25 -0
- package/tests/migration/configMigration.test.ts +546 -0
- package/tests/setup.ts +62 -0
- package/tests/testUtils.ts +340 -0
- package/tests/utils/loadConfigs.test.ts +350 -0
- package/tests/validation/configValidation.test.ts +412 -0
- package/src/utils/schemaStrings.ts +0 -517
package/tests/README.md
ADDED
@@ -0,0 +1,497 @@
|
|
1
|
+
# Testing Framework for Dual Schema Implementation
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
This testing framework provides comprehensive coverage for the dual schema architecture, ensuring reliability, performance, and compatibility across different Appwrite versions and configuration scenarios.
|
6
|
+
|
7
|
+
## Quick Start
|
8
|
+
|
9
|
+
```bash
|
10
|
+
# Install dependencies
|
11
|
+
npm install
|
12
|
+
|
13
|
+
# Run all tests
|
14
|
+
npm test
|
15
|
+
|
16
|
+
# Run tests with coverage
|
17
|
+
npm test:coverage
|
18
|
+
|
19
|
+
# Run tests in watch mode during development
|
20
|
+
npm test:watch
|
21
|
+
|
22
|
+
# Run tests for CI/CD
|
23
|
+
npm test:ci
|
24
|
+
```
|
25
|
+
|
26
|
+
## Test Structure
|
27
|
+
|
28
|
+
```
|
29
|
+
tests/
|
30
|
+
├── README.md # This file
|
31
|
+
├── setup.ts # Global test setup and mocks
|
32
|
+
├── testUtils.ts # Shared utilities and helpers
|
33
|
+
├── jest.config.js # Jest configuration
|
34
|
+
├── utils/ # Unit tests for utilities
|
35
|
+
│ └── loadConfigs.test.ts # Configuration loading tests
|
36
|
+
├── adapters/ # Adapter system tests
|
37
|
+
│ └── AdapterFactory.test.ts # Adapter creation and selection
|
38
|
+
├── integration/ # Integration and E2E tests
|
39
|
+
│ └── syncOperations.test.ts # Sync operations testing
|
40
|
+
├── validation/ # Configuration validation tests
|
41
|
+
│ └── configValidation.test.ts
|
42
|
+
├── migration/ # Migration utilities tests
|
43
|
+
│ └── configMigration.test.ts
|
44
|
+
└── fixtures/ # Test data and configurations
|
45
|
+
├── collections/
|
46
|
+
├── tables/
|
47
|
+
└── configs/
|
48
|
+
```
|
49
|
+
|
50
|
+
## Test Categories
|
51
|
+
|
52
|
+
### 1. Unit Tests (`utils/`, `adapters/`)
|
53
|
+
|
54
|
+
**Purpose**: Test individual functions and classes in isolation
|
55
|
+
|
56
|
+
**Coverage**:
|
57
|
+
- Configuration loading logic
|
58
|
+
- YAML/TypeScript parsing
|
59
|
+
- Adapter factory patterns
|
60
|
+
- Version detection algorithms
|
61
|
+
- Validation functions
|
62
|
+
|
63
|
+
**Example**:
|
64
|
+
```typescript
|
65
|
+
describe('loadConfig', () => {
|
66
|
+
it('should load dual directories correctly', async () => {
|
67
|
+
const testDir = TestUtils.createTestProject({
|
68
|
+
hasCollections: true,
|
69
|
+
hasTables: true,
|
70
|
+
});
|
71
|
+
|
72
|
+
const config = await loadConfig(testDir);
|
73
|
+
|
74
|
+
expect(config.collections).toHaveLength(2);
|
75
|
+
expect(config.collections.some(c => c._isFromTablesDir)).toBe(true);
|
76
|
+
});
|
77
|
+
});
|
78
|
+
```
|
79
|
+
|
80
|
+
### 2. Integration Tests (`integration/`)
|
81
|
+
|
82
|
+
**Purpose**: Test complete workflows and system interactions
|
83
|
+
|
84
|
+
**Coverage**:
|
85
|
+
- End-to-end sync operations
|
86
|
+
- API version compatibility
|
87
|
+
- File system operations
|
88
|
+
- Network error handling
|
89
|
+
- Performance under load
|
90
|
+
|
91
|
+
**Example**:
|
92
|
+
```typescript
|
93
|
+
describe('Sync Operations', () => {
|
94
|
+
it('should sync from Appwrite to local configuration', async () => {
|
95
|
+
mockAdapter.getDatabases.mockResolvedValue([mockDatabase]);
|
96
|
+
mockAdapter.getCollections.mockResolvedValue([mockCollection]);
|
97
|
+
|
98
|
+
await mockAdapter.syncFromAppwrite(testDir);
|
99
|
+
|
100
|
+
expect(fs.existsSync(path.join(testDir, 'collections'))).toBe(true);
|
101
|
+
});
|
102
|
+
});
|
103
|
+
```
|
104
|
+
|
105
|
+
### 3. Validation Tests (`validation/`)
|
106
|
+
|
107
|
+
**Purpose**: Test configuration validation and error detection
|
108
|
+
|
109
|
+
**Coverage**:
|
110
|
+
- Schema validation
|
111
|
+
- Naming conflict detection
|
112
|
+
- API compatibility checks
|
113
|
+
- Strict mode behavior
|
114
|
+
- Error reporting
|
115
|
+
|
116
|
+
**Example**:
|
117
|
+
```typescript
|
118
|
+
describe('Configuration Validation', () => {
|
119
|
+
it('should detect naming conflicts', async () => {
|
120
|
+
const mockValidation = {
|
121
|
+
isValid: false,
|
122
|
+
errors: [{
|
123
|
+
type: 'naming_conflict',
|
124
|
+
message: 'Duplicate name found between directories',
|
125
|
+
}],
|
126
|
+
};
|
127
|
+
|
128
|
+
const result = await loadConfigWithPath(testDir, { validate: true });
|
129
|
+
|
130
|
+
expect(result.validation.errors).toHaveLength(1);
|
131
|
+
});
|
132
|
+
});
|
133
|
+
```
|
134
|
+
|
135
|
+
### 4. Migration Tests (`migration/`)
|
136
|
+
|
137
|
+
**Purpose**: Test configuration migration utilities
|
138
|
+
|
139
|
+
**Coverage**:
|
140
|
+
- Migration detection logic
|
141
|
+
- TypeScript to YAML conversion
|
142
|
+
- Directory structure changes
|
143
|
+
- Backup and rollback procedures
|
144
|
+
- Large-scale migrations
|
145
|
+
|
146
|
+
**Example**:
|
147
|
+
```typescript
|
148
|
+
describe('Migration Operations', () => {
|
149
|
+
it('should migrate collections to tables directory', async () => {
|
150
|
+
const result = migrateToTablesDir(testDir, {
|
151
|
+
preserveOriginal: true,
|
152
|
+
convertToYaml: true,
|
153
|
+
});
|
154
|
+
|
155
|
+
expect(result.success).toBe(true);
|
156
|
+
expect(result.migratedFiles).toHaveLength(1);
|
157
|
+
});
|
158
|
+
});
|
159
|
+
```
|
160
|
+
|
161
|
+
## Test Utilities
|
162
|
+
|
163
|
+
### TestUtils Class
|
164
|
+
|
165
|
+
Central utility class for creating test environments:
|
166
|
+
|
167
|
+
```typescript
|
168
|
+
class TestUtils {
|
169
|
+
// Directory Management
|
170
|
+
static createTempDir(): string
|
171
|
+
static createTestProject(options): string
|
172
|
+
static cleanup(): void
|
173
|
+
|
174
|
+
// Configuration Creation
|
175
|
+
static createTestAppwriteConfig(overrides): AppwriteConfig
|
176
|
+
static createTestCollection(overrides): CollectionCreate
|
177
|
+
static createTestTable(overrides): TableCreate
|
178
|
+
|
179
|
+
// Mock Generation
|
180
|
+
static createMockAppwriteResponses(): MockClient
|
181
|
+
}
|
182
|
+
```
|
183
|
+
|
184
|
+
### Usage Examples
|
185
|
+
|
186
|
+
```typescript
|
187
|
+
// Create a test project with both collections and tables
|
188
|
+
const testDir = TestUtils.createTestProject({
|
189
|
+
hasCollections: true,
|
190
|
+
hasTables: true,
|
191
|
+
hasConflicts: true, // Test naming conflicts
|
192
|
+
useYaml: true, // Use YAML format
|
193
|
+
});
|
194
|
+
|
195
|
+
// Create mock configurations
|
196
|
+
const mockConfig = TestUtils.createTestAppwriteConfig({
|
197
|
+
appwriteProject: 'test-project',
|
198
|
+
databases: [{ name: 'test-db', $id: 'test-db-id' }],
|
199
|
+
});
|
200
|
+
|
201
|
+
// Automatic cleanup after tests
|
202
|
+
afterEach(() => {
|
203
|
+
TestUtils.cleanup();
|
204
|
+
});
|
205
|
+
```
|
206
|
+
|
207
|
+
## Mocking Strategy
|
208
|
+
|
209
|
+
### Global Mocks (setup.ts)
|
210
|
+
|
211
|
+
```typescript
|
212
|
+
// Mock external dependencies
|
213
|
+
jest.mock('winston'); // Logging
|
214
|
+
jest.mock('chalk'); // Terminal colors
|
215
|
+
jest.mock('inquirer'); // Interactive prompts
|
216
|
+
jest.mock('cli-progress'); // Progress bars
|
217
|
+
|
218
|
+
// Mock file system operations when needed
|
219
|
+
jest.mock('fs', () => ({
|
220
|
+
...jest.requireActual('fs'),
|
221
|
+
writeFileSync: jest.fn(),
|
222
|
+
readFileSync: jest.fn(),
|
223
|
+
}));
|
224
|
+
```
|
225
|
+
|
226
|
+
### Adapter Mocking
|
227
|
+
|
228
|
+
```typescript
|
229
|
+
// Mock adapter responses
|
230
|
+
const mockAdapter = {
|
231
|
+
syncFromAppwrite: jest.fn(),
|
232
|
+
syncToAppwrite: jest.fn(),
|
233
|
+
getDatabases: jest.fn().mockResolvedValue([mockDatabase]),
|
234
|
+
getCollections: jest.fn().mockResolvedValue([mockCollection]),
|
235
|
+
validateConfiguration: jest.fn().mockReturnValue({ isValid: true }),
|
236
|
+
};
|
237
|
+
|
238
|
+
(AdapterFactory.createAdapter as jest.Mock).mockResolvedValue(mockAdapter);
|
239
|
+
```
|
240
|
+
|
241
|
+
### Version Detection Mocking
|
242
|
+
|
243
|
+
```typescript
|
244
|
+
jest.mock('../../src/utils/versionDetection', () => ({
|
245
|
+
detectAppwriteVersionCached: jest.fn().mockResolvedValue({
|
246
|
+
serverVersion: '1.6.0',
|
247
|
+
apiMode: 'database',
|
248
|
+
}),
|
249
|
+
isVersionAtLeast: jest.fn((version, target) => version >= target),
|
250
|
+
}));
|
251
|
+
```
|
252
|
+
|
253
|
+
## Performance Testing
|
254
|
+
|
255
|
+
### Load Testing
|
256
|
+
|
257
|
+
```typescript
|
258
|
+
describe('Performance Tests', () => {
|
259
|
+
it('should handle large configurations efficiently', async () => {
|
260
|
+
// Create 500 collections + 300 tables
|
261
|
+
const largeConfig = createLargeConfiguration(500, 300);
|
262
|
+
|
263
|
+
const startTime = Date.now();
|
264
|
+
await loadConfig(testDir);
|
265
|
+
const loadTime = Date.now() - startTime;
|
266
|
+
|
267
|
+
expect(loadTime).toBeLessThan(5000); // 5 second max
|
268
|
+
});
|
269
|
+
});
|
270
|
+
```
|
271
|
+
|
272
|
+
### Memory Testing
|
273
|
+
|
274
|
+
```typescript
|
275
|
+
describe('Memory Usage', () => {
|
276
|
+
it('should not leak memory during repeated operations', async () => {
|
277
|
+
const initialMemory = process.memoryUsage().heapUsed;
|
278
|
+
|
279
|
+
// Perform many operations
|
280
|
+
for (let i = 0; i < 100; i++) {
|
281
|
+
await loadConfig(testDir);
|
282
|
+
}
|
283
|
+
|
284
|
+
const finalMemory = process.memoryUsage().heapUsed;
|
285
|
+
const increase = finalMemory - initialMemory;
|
286
|
+
|
287
|
+
expect(increase).toBeLessThan(50 * 1024 * 1024); // 50MB max
|
288
|
+
});
|
289
|
+
});
|
290
|
+
```
|
291
|
+
|
292
|
+
## Error Testing
|
293
|
+
|
294
|
+
### Network Errors
|
295
|
+
|
296
|
+
```typescript
|
297
|
+
describe('Network Error Handling', () => {
|
298
|
+
it('should handle API timeout gracefully', async () => {
|
299
|
+
mockAdapter.getDatabases.mockRejectedValue(
|
300
|
+
new Error('Request timeout')
|
301
|
+
);
|
302
|
+
|
303
|
+
await expect(syncFromAppwrite(testDir))
|
304
|
+
.rejects.toThrow('Request timeout');
|
305
|
+
});
|
306
|
+
});
|
307
|
+
```
|
308
|
+
|
309
|
+
### File System Errors
|
310
|
+
|
311
|
+
```typescript
|
312
|
+
describe('File System Errors', () => {
|
313
|
+
it('should handle permission denied errors', async () => {
|
314
|
+
jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {
|
315
|
+
throw new Error('EACCES: permission denied');
|
316
|
+
});
|
317
|
+
|
318
|
+
await expect(saveConfiguration(config, testDir))
|
319
|
+
.rejects.toThrow('permission denied');
|
320
|
+
});
|
321
|
+
});
|
322
|
+
```
|
323
|
+
|
324
|
+
## CI/CD Integration
|
325
|
+
|
326
|
+
### GitHub Actions
|
327
|
+
|
328
|
+
```yaml
|
329
|
+
name: Test Dual Schema
|
330
|
+
on: [push, pull_request]
|
331
|
+
|
332
|
+
jobs:
|
333
|
+
test:
|
334
|
+
runs-on: ubuntu-latest
|
335
|
+
strategy:
|
336
|
+
matrix:
|
337
|
+
node-version: [18, 20]
|
338
|
+
|
339
|
+
steps:
|
340
|
+
- uses: actions/checkout@v4
|
341
|
+
- uses: actions/setup-node@v4
|
342
|
+
with:
|
343
|
+
node-version: ${{ matrix.node-version }}
|
344
|
+
cache: 'npm'
|
345
|
+
|
346
|
+
- name: Install dependencies
|
347
|
+
run: npm ci
|
348
|
+
|
349
|
+
- name: Run tests
|
350
|
+
run: npm run test:ci
|
351
|
+
|
352
|
+
- name: Upload coverage
|
353
|
+
uses: codecov/codecov-action@v3
|
354
|
+
with:
|
355
|
+
file: ./coverage/lcov.info
|
356
|
+
```
|
357
|
+
|
358
|
+
### Coverage Requirements
|
359
|
+
|
360
|
+
- **Overall**: 90%+ coverage
|
361
|
+
- **Statements**: 90%+
|
362
|
+
- **Branches**: 85%+
|
363
|
+
- **Functions**: 95%+
|
364
|
+
- **Lines**: 90%+
|
365
|
+
|
366
|
+
## Debugging Tests
|
367
|
+
|
368
|
+
### Running Specific Tests
|
369
|
+
|
370
|
+
```bash
|
371
|
+
# Run single test file
|
372
|
+
npm test loadConfigs.test.ts
|
373
|
+
|
374
|
+
# Run specific test pattern
|
375
|
+
npm test -- --testNamePattern="dual schema"
|
376
|
+
|
377
|
+
# Run with verbose output
|
378
|
+
npm test -- --verbose
|
379
|
+
|
380
|
+
# Run with coverage for specific files
|
381
|
+
npm test -- --coverage --collectCoverageOnlyFrom="src/utils/loadConfigs.ts"
|
382
|
+
```
|
383
|
+
|
384
|
+
### Debug Mode
|
385
|
+
|
386
|
+
```bash
|
387
|
+
# Run with Node.js debugger
|
388
|
+
node --inspect-brk node_modules/.bin/jest --runInBand
|
389
|
+
|
390
|
+
# Debug single test
|
391
|
+
node --inspect-brk node_modules/.bin/jest --runInBand --testNamePattern="should load dual directories"
|
392
|
+
```
|
393
|
+
|
394
|
+
### VSCode Debug Configuration
|
395
|
+
|
396
|
+
```json
|
397
|
+
{
|
398
|
+
"type": "node",
|
399
|
+
"request": "launch",
|
400
|
+
"name": "Debug Jest Tests",
|
401
|
+
"program": "${workspaceFolder}/node_modules/.bin/jest",
|
402
|
+
"args": ["--runInBand"],
|
403
|
+
"console": "integratedTerminal",
|
404
|
+
"internalConsoleOptions": "neverOpen"
|
405
|
+
}
|
406
|
+
```
|
407
|
+
|
408
|
+
## Best Practices
|
409
|
+
|
410
|
+
### Test Organization
|
411
|
+
|
412
|
+
1. **Group Related Tests**: Use `describe` blocks to group related functionality
|
413
|
+
2. **Descriptive Names**: Test names should clearly describe the expected behavior
|
414
|
+
3. **Arrange-Act-Assert**: Structure tests with clear setup, execution, and verification
|
415
|
+
4. **Clean State**: Each test should start with a clean state
|
416
|
+
|
417
|
+
### Mock Management
|
418
|
+
|
419
|
+
1. **Clear Mocks**: Always clear mocks between tests
|
420
|
+
2. **Realistic Data**: Use realistic mock data that represents actual usage
|
421
|
+
3. **Error Scenarios**: Mock both success and failure scenarios
|
422
|
+
4. **External Dependencies**: Mock all external dependencies (APIs, file system, etc.)
|
423
|
+
|
424
|
+
### Performance Considerations
|
425
|
+
|
426
|
+
1. **Parallel Execution**: Use Jest's parallel execution for faster test runs
|
427
|
+
2. **Selective Testing**: Use test patterns to run only relevant tests during development
|
428
|
+
3. **Resource Cleanup**: Always clean up resources (temp files, network connections)
|
429
|
+
4. **Timeout Management**: Set appropriate timeouts for async operations
|
430
|
+
|
431
|
+
### Test Data Management
|
432
|
+
|
433
|
+
1. **Fixtures**: Use fixture files for complex test data
|
434
|
+
2. **Factories**: Use factory functions for generating test objects
|
435
|
+
3. **Randomization**: Use random data where appropriate to catch edge cases
|
436
|
+
4. **Reproducibility**: Ensure tests are deterministic and reproducible
|
437
|
+
|
438
|
+
## Troubleshooting
|
439
|
+
|
440
|
+
### Common Issues
|
441
|
+
|
442
|
+
#### "Jest encountered an unexpected token"
|
443
|
+
```bash
|
444
|
+
# Solution: Check Jest configuration for TypeScript
|
445
|
+
npm install --save-dev ts-jest @types/jest
|
446
|
+
```
|
447
|
+
|
448
|
+
#### "Module not found" errors
|
449
|
+
```bash
|
450
|
+
# Solution: Check import paths and ensure files exist
|
451
|
+
# Use absolute imports when necessary
|
452
|
+
```
|
453
|
+
|
454
|
+
#### "Tests are hanging"
|
455
|
+
```bash
|
456
|
+
# Solution: Check for unresolved promises or open handles
|
457
|
+
npm test -- --detectOpenHandles --forceExit
|
458
|
+
```
|
459
|
+
|
460
|
+
#### "Memory leaks detected"
|
461
|
+
```bash
|
462
|
+
# Solution: Ensure proper cleanup in afterEach/afterAll
|
463
|
+
# Check for unclosed file handles or timers
|
464
|
+
```
|
465
|
+
|
466
|
+
### Performance Issues
|
467
|
+
|
468
|
+
#### Slow test execution
|
469
|
+
```bash
|
470
|
+
# Solution: Run tests in parallel (default) or identify slow tests
|
471
|
+
npm test -- --verbose --runInBand # Serial execution for debugging
|
472
|
+
```
|
473
|
+
|
474
|
+
#### High memory usage
|
475
|
+
```bash
|
476
|
+
# Solution: Clear mocks and clean up test data
|
477
|
+
# Use smaller test datasets
|
478
|
+
# Check for memory leaks in test utilities
|
479
|
+
```
|
480
|
+
|
481
|
+
## Contributing
|
482
|
+
|
483
|
+
### Adding New Tests
|
484
|
+
|
485
|
+
1. **Follow Naming Convention**: `*.test.ts` for test files
|
486
|
+
2. **Use TestUtils**: Leverage shared utilities for consistency
|
487
|
+
3. **Add Documentation**: Document complex test scenarios
|
488
|
+
4. **Update Coverage**: Ensure new code has appropriate test coverage
|
489
|
+
|
490
|
+
### Test Categories
|
491
|
+
|
492
|
+
- **Unit Tests**: Test individual functions and classes
|
493
|
+
- **Integration Tests**: Test component interactions
|
494
|
+
- **Performance Tests**: Test system performance and scalability
|
495
|
+
- **Error Tests**: Test error handling and edge cases
|
496
|
+
|
497
|
+
This testing framework ensures the dual schema implementation is robust, reliable, and performs well across all supported scenarios and environments.
|