@objectstack/objectql 4.0.4 → 4.1.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.
@@ -1,181 +0,0 @@
1
- // Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
2
-
3
- import { describe, it, expect, beforeEach } from 'vitest';
4
- import { ObjectQL } from './engine.js';
5
- import { SchemaRegistry } from './registry.js';
6
-
7
- // Mock driver for testing
8
- const createMockDriver = (name: string) => ({
9
- name,
10
- version: '1.0.0',
11
- supports: {},
12
- connect: async () => {},
13
- disconnect: async () => {},
14
- checkHealth: async () => true,
15
- find: async () => [],
16
- findOne: async () => null,
17
- create: async (obj: string, data: any) => ({ id: '1', ...data }),
18
- update: async (obj: string, id: string, data: any) => ({ id, ...data }),
19
- delete: async () => true,
20
- count: async () => 0,
21
- bulkCreate: async () => [],
22
- bulkUpdate: async () => [],
23
- bulkDelete: async () => {},
24
- execute: async () => ({}),
25
- findStream: async function* () {},
26
- upsert: async (obj: string, data: any) => ({ id: '1', ...data }),
27
- beginTransaction: async () => ({}),
28
- commit: async () => {},
29
- rollback: async () => {},
30
- syncSchema: async () => {},
31
- });
32
-
33
- describe('DatasourceMapping', () => {
34
- let engine: ObjectQL;
35
-
36
- beforeEach(() => {
37
- engine = new ObjectQL();
38
- SchemaRegistry.reset();
39
- });
40
-
41
- it('should route objects by namespace', async () => {
42
- const memoryDriver = createMockDriver('memory');
43
- const tursoDriver = createMockDriver('turso');
44
-
45
- engine.registerDriver(memoryDriver);
46
- engine.registerDriver(tursoDriver, true); // default
47
-
48
- // Configure mapping: crm namespace → memory
49
- engine.setDatasourceMapping([
50
- { namespace: 'crm', datasource: 'memory' },
51
- ]);
52
-
53
- // Register an object in crm namespace
54
- SchemaRegistry.registerObject(
55
- {
56
- name: 'account',
57
- fields: { name: { type: 'text' } },
58
- },
59
- 'com.example.crm',
60
- 'crm',
61
- 'own'
62
- );
63
-
64
- // Test that it uses memory driver
65
- const result = await engine.insert('account', { name: 'Test Account' });
66
- expect(result).toBeDefined();
67
- expect(result.name).toBe('Test Account');
68
- });
69
-
70
- it('should route objects by pattern', async () => {
71
- const memoryDriver = createMockDriver('memory');
72
- const tursoDriver = createMockDriver('turso');
73
-
74
- engine.registerDriver(memoryDriver);
75
- engine.registerDriver(tursoDriver, true);
76
-
77
- // Configure mapping: sys_* pattern → turso
78
- engine.setDatasourceMapping([
79
- { objectPattern: 'sys_*', datasource: 'turso' },
80
- { default: true, datasource: 'memory' },
81
- ]);
82
-
83
- // Register system objects
84
- SchemaRegistry.registerObject(
85
- {
86
- name: 'sys_user',
87
- fields: { username: { type: 'text' } },
88
- },
89
- 'com.objectstack.system',
90
- 'system',
91
- 'own'
92
- );
93
-
94
- const result = await engine.insert('sys_user', { username: 'admin' });
95
- expect(result).toBeDefined();
96
- });
97
-
98
- it('should respect priority order', async () => {
99
- const memoryDriver = createMockDriver('memory');
100
- const tursoDriver = createMockDriver('turso');
101
-
102
- engine.registerDriver(memoryDriver);
103
- engine.registerDriver(tursoDriver);
104
-
105
- // Higher priority rule should win
106
- engine.setDatasourceMapping([
107
- { namespace: 'crm', datasource: 'memory', priority: 100 },
108
- { namespace: 'crm', datasource: 'turso', priority: 50 }, // Lower number = higher priority
109
- ]);
110
-
111
- SchemaRegistry.registerObject(
112
- {
113
- name: 'account',
114
- fields: { name: { type: 'text' } },
115
- },
116
- 'com.example.crm',
117
- 'crm',
118
- 'own'
119
- );
120
-
121
- // Should use turso (priority 50) not memory (priority 100)
122
- const result = await engine.insert('account', { name: 'Test' });
123
- expect(result).toBeDefined();
124
- });
125
-
126
- it('should fallback to default rule', async () => {
127
- const memoryDriver = createMockDriver('memory');
128
- const tursoDriver = createMockDriver('turso');
129
-
130
- engine.registerDriver(memoryDriver);
131
- engine.registerDriver(tursoDriver);
132
-
133
- engine.setDatasourceMapping([
134
- { namespace: 'auth', datasource: 'turso' },
135
- { default: true, datasource: 'memory' },
136
- ]);
137
-
138
- // Register object in different namespace
139
- SchemaRegistry.registerObject(
140
- {
141
- name: 'task',
142
- fields: { title: { type: 'text' } },
143
- },
144
- 'com.example.todo',
145
- 'todo',
146
- 'own'
147
- );
148
-
149
- // Should use memory (default)
150
- const result = await engine.insert('task', { title: 'Do something' });
151
- expect(result).toBeDefined();
152
- });
153
-
154
- it('should prefer object explicit datasource over mapping', async () => {
155
- const memoryDriver = createMockDriver('memory');
156
- const tursoDriver = createMockDriver('turso');
157
-
158
- engine.registerDriver(memoryDriver);
159
- engine.registerDriver(tursoDriver);
160
-
161
- engine.setDatasourceMapping([
162
- { namespace: 'crm', datasource: 'memory' },
163
- ]);
164
-
165
- // Object explicitly sets datasource
166
- SchemaRegistry.registerObject(
167
- {
168
- name: 'account',
169
- datasource: 'turso', // Explicit override
170
- fields: { name: { type: 'text' } },
171
- },
172
- 'com.example.crm',
173
- 'crm',
174
- 'own'
175
- );
176
-
177
- // Should use turso (explicit) not memory (mapping)
178
- const result = await engine.insert('account', { name: 'Test' });
179
- expect(result).toBeDefined();
180
- });
181
- });