@malloydata/malloy-tests 0.0.95-dev231019211822 → 0.0.95
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/README.md +213 -1
- package/dist/api.spec.d.ts +1 -1
- package/dist/api.spec.js +6 -13
- package/dist/api.spec.js.map +1 -1
- package/dist/databases/all/db_index.spec.js +21 -41
- package/dist/databases/all/db_index.spec.js.map +1 -1
- package/dist/databases/all/expr.spec.js +262 -339
- package/dist/databases/all/expr.spec.js.map +1 -1
- package/dist/databases/all/functions.spec.js +37 -35
- package/dist/databases/all/functions.spec.js.map +1 -1
- package/dist/databases/all/join.spec.js +125 -169
- package/dist/databases/all/join.spec.js.map +1 -1
- package/dist/databases/all/nomodel.spec.js +335 -594
- package/dist/databases/all/nomodel.spec.js.map +1 -1
- package/dist/databases/all/orderby.spec.js +82 -128
- package/dist/databases/all/orderby.spec.js.map +1 -1
- package/dist/databases/all/sql_expressions.spec.js +27 -43
- package/dist/databases/all/sql_expressions.spec.js.map +1 -1
- package/dist/databases/all/time.spec.js +63 -103
- package/dist/databases/all/time.spec.js.map +1 -1
- package/dist/databases/bigquery/double_truncation.spec.js +1 -1
- package/dist/databases/bigquery/handexpr.spec.js +12 -12
- package/dist/databases/bigquery/injestion_time_partitioning.spec.js +22 -22
- package/dist/databases/bigquery/joined_filters.spec.js +3 -3
- package/dist/databases/bigquery/json.spec.d.ts +1 -1
- package/dist/databases/bigquery/json.spec.js +25 -45
- package/dist/databases/bigquery/json.spec.js.map +1 -1
- package/dist/databases/bigquery/malloy_query.spec.d.ts +1 -1
- package/dist/databases/bigquery/malloy_query.spec.js +47 -48
- package/dist/databases/bigquery/malloy_query.spec.js.map +1 -1
- package/dist/databases/bigquery/time.spec.js +9 -13
- package/dist/databases/bigquery/time.spec.js.map +1 -1
- package/dist/databases/bigquery/wildcard_table_names.spec.js +19 -19
- package/dist/databases/bigquery-duckdb/nested_source_table.spec.js +53 -87
- package/dist/databases/bigquery-duckdb/nested_source_table.spec.js.map +1 -1
- package/dist/databases/bigquery-postgres/multi_connection.spec.js +5 -20
- package/dist/databases/bigquery-postgres/multi_connection.spec.js.map +1 -1
- package/dist/databases/bigquery-postgres/streaming.spec.js +6 -6
- package/dist/databases/bigquery-postgres/streaming.spec.js.map +1 -1
- package/dist/databases/duckdb/duckdb.spec.js +24 -33
- package/dist/databases/duckdb/duckdb.spec.js.map +1 -1
- package/dist/databases/postgres/postgres.spec.js +46 -67
- package/dist/databases/postgres/postgres.spec.js.map +1 -1
- package/dist/jestMatcher.spec.d.ts +1 -0
- package/dist/jestMatcher.spec.js +81 -0
- package/dist/jestMatcher.spec.js.map +1 -0
- package/dist/render/render.spec.js +10 -12
- package/dist/render/render.spec.js.map +1 -1
- package/dist/tags.spec.js +22 -2
- package/dist/tags.spec.js.map +1 -1
- package/dist/util/db-jest-matchers.d.ts +17 -6
- package/dist/util/db-jest-matchers.js +81 -20
- package/dist/util/db-jest-matchers.js.map +1 -1
- package/dist/util/index.d.ts +1 -2
- package/dist/util/index.js +11 -13
- package/dist/util/index.js.map +1 -1
- package/package.json +6 -6
- package/src/api.spec.ts +7 -16
- package/src/databases/all/db_index.spec.ts +22 -48
- package/src/databases/all/expr.spec.ts +273 -431
- package/src/databases/all/functions.spec.ts +37 -35
- package/src/databases/all/join.spec.ts +130 -196
- package/src/databases/all/nomodel.spec.ts +333 -689
- package/src/databases/all/orderby.spec.ts +87 -161
- package/src/databases/all/sql_expressions.spec.ts +29 -49
- package/src/databases/all/time.spec.ts +73 -130
- package/src/databases/bigquery/double_truncation.spec.ts +1 -1
- package/src/databases/bigquery/handexpr.spec.ts +12 -12
- package/src/databases/bigquery/injestion_time_partitioning.spec.ts +22 -22
- package/src/databases/bigquery/joined_filters.spec.ts +3 -3
- package/src/databases/bigquery/json.spec.ts +25 -49
- package/src/databases/bigquery/malloy_query.spec.ts +47 -54
- package/src/databases/bigquery/time.spec.ts +13 -17
- package/src/databases/bigquery/wildcard_table_names.spec.ts +19 -19
- package/src/databases/bigquery-duckdb/nested_source_table.spec.ts +56 -98
- package/src/databases/bigquery-postgres/multi_connection.spec.ts +5 -23
- package/src/databases/bigquery-postgres/streaming.spec.ts +12 -6
- package/src/databases/duckdb/duckdb.spec.ts +31 -43
- package/src/databases/postgres/postgres.spec.ts +54 -84
- package/src/jestMatcher.spec.ts +88 -0
- package/src/render/render.spec.ts +10 -12
- package/src/tags.spec.ts +22 -2
- package/src/util/db-jest-matchers.ts +106 -32
- package/src/util/index.ts +16 -14
|
@@ -23,9 +23,8 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import {RuntimeList, allDatabases} from '../../runtimes';
|
|
26
|
-
import {databasesFromEnvironmentOr} from '../../util';
|
|
26
|
+
import {databasesFromEnvironmentOr, testIf} from '../../util';
|
|
27
27
|
import '../../util/db-jest-matchers';
|
|
28
|
-
import * as malloy from '@malloydata/malloy';
|
|
29
28
|
|
|
30
29
|
const runtimes = new RuntimeList(databasesFromEnvironmentOr(allDatabases));
|
|
31
30
|
|
|
@@ -33,109 +32,64 @@ afterAll(async () => {
|
|
|
33
32
|
await runtimes.closeAll();
|
|
34
33
|
});
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
): Promise<boolean> {
|
|
40
|
-
try {
|
|
41
|
-
const runtime = runtimes.runtimeMap.get(databaseName);
|
|
42
|
-
if (runtime === undefined) {
|
|
43
|
-
throw new Error(`Unknown database ${databaseName}`);
|
|
44
|
-
}
|
|
45
|
-
await (
|
|
46
|
-
await runtime.connections.lookupConnection(databaseName)
|
|
47
|
-
).runSQL(`WITH test AS(\n${sql}) SELECT '[{"foo":1}]' as results`);
|
|
48
|
-
} catch (e) {
|
|
49
|
-
console.log(`SQL: didn't compile\n=============\n${sql}`);
|
|
50
|
-
throw e;
|
|
51
|
-
}
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const expressionModels = new Map<string, malloy.ModelMaterializer>();
|
|
56
|
-
runtimes.runtimeMap.forEach((runtime, databaseName) =>
|
|
57
|
-
expressionModels.set(
|
|
58
|
-
databaseName,
|
|
59
|
-
runtime.loadModel(`
|
|
60
|
-
source: models is table('malloytest.aircraft_models'){
|
|
35
|
+
describe.each(runtimes.runtimeList)('%s', (databaseName, runtime) => {
|
|
36
|
+
const orderByModel = runtime.loadModel(`
|
|
37
|
+
source: models is ${databaseName}.table('malloytest.aircraft_models') extend {
|
|
61
38
|
measure: model_count is count()
|
|
62
|
-
}
|
|
63
|
-
`)
|
|
64
|
-
)
|
|
65
|
-
);
|
|
39
|
+
}`);
|
|
66
40
|
|
|
67
|
-
expressionModels.forEach((orderByModel, databaseName) => {
|
|
68
41
|
it(`boolean type - ${databaseName}`, async () => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
.run();
|
|
79
|
-
expect(result.data.row(0).cell('big').value).toBe(false);
|
|
80
|
-
expect(result.data.row(0).cell('model_count').value).toBe(58451);
|
|
42
|
+
await expect(`
|
|
43
|
+
run: models-> {
|
|
44
|
+
group_by: big is seats >=20
|
|
45
|
+
aggregate: model_count is count()
|
|
46
|
+
}
|
|
47
|
+
`).malloyResultMatches(orderByModel, {
|
|
48
|
+
big: false,
|
|
49
|
+
model_count: 58451,
|
|
50
|
+
});
|
|
81
51
|
});
|
|
82
52
|
|
|
83
53
|
it(`boolean in pipeline - ${databaseName}`, async () => {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
.run();
|
|
99
|
-
expect(result.data.row(0).cell('big').value).toBe(false);
|
|
100
|
-
expect(result.data.row(0).cell('model_count').value).toBe(58500);
|
|
54
|
+
await expect(`
|
|
55
|
+
run: models->{
|
|
56
|
+
group_by:
|
|
57
|
+
manufacturer,
|
|
58
|
+
big is seats >=21
|
|
59
|
+
aggregate: model_count is count()
|
|
60
|
+
}->{
|
|
61
|
+
group_by: big
|
|
62
|
+
aggregate: model_count is model_count.sum()
|
|
63
|
+
}
|
|
64
|
+
`).malloyResultMatches(orderByModel, {
|
|
65
|
+
big: false,
|
|
66
|
+
model_count: 58500,
|
|
67
|
+
});
|
|
101
68
|
});
|
|
102
69
|
|
|
103
70
|
it(`filtered measures in model are aggregates #352 - ${databaseName}`, async () => {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
group_by: j_names
|
|
112
|
-
}
|
|
113
|
-
`
|
|
114
|
-
)
|
|
115
|
-
.run();
|
|
116
|
-
expect(result.data.row(0).cell('j_names').value).toBe(1358);
|
|
71
|
+
await expect(`
|
|
72
|
+
run: models->{
|
|
73
|
+
aggregate: j_names is model_count {where: manufacturer ~ 'J%'}
|
|
74
|
+
} -> {
|
|
75
|
+
group_by: j_names
|
|
76
|
+
}
|
|
77
|
+
`).malloyResultMatches(orderByModel, {j_names: 1358});
|
|
117
78
|
});
|
|
118
79
|
|
|
119
80
|
it(`reserved words are quoted - ${databaseName}`, async () => {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
`
|
|
123
|
-
query: models->{
|
|
81
|
+
await expect(`
|
|
82
|
+
run: models->{
|
|
124
83
|
aggregate: fetch is count()
|
|
125
84
|
}->{
|
|
126
85
|
group_by: fetch
|
|
127
86
|
}
|
|
128
|
-
|
|
129
|
-
)
|
|
130
|
-
.getSQL();
|
|
131
|
-
await validateCompilation(databaseName, sql);
|
|
87
|
+
`).malloyResultMatches(orderByModel, {});
|
|
132
88
|
});
|
|
133
89
|
|
|
134
90
|
it(`reserved words are quoted in turtles - ${databaseName}`, async () => {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
`
|
|
138
|
-
query: models->{
|
|
91
|
+
await expect(`
|
|
92
|
+
run: models->{
|
|
139
93
|
nest: withx is {
|
|
140
94
|
group_by: select is UPPER(manufacturer)
|
|
141
95
|
aggregate: fetch is count()
|
|
@@ -145,17 +99,12 @@ expressionModels.forEach((orderByModel, databaseName) => {
|
|
|
145
99
|
withxz is lower(withx.select)
|
|
146
100
|
fetch is withx.fetch
|
|
147
101
|
}
|
|
148
|
-
|
|
149
|
-
)
|
|
150
|
-
.getSQL();
|
|
151
|
-
await validateCompilation(databaseName, sql);
|
|
102
|
+
`).malloyResultMatches(orderByModel, {});
|
|
152
103
|
});
|
|
153
104
|
|
|
154
105
|
it.skip('reserved words in structure definitions', async () => {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
`
|
|
158
|
-
query: models->{
|
|
106
|
+
await expect(`
|
|
107
|
+
run: models->{
|
|
159
108
|
nest: withx is {
|
|
160
109
|
group_by: is select is UPPER(manufacturer)
|
|
161
110
|
aggregate: fetch is count()
|
|
@@ -164,51 +113,37 @@ expressionModels.forEach((orderByModel, databaseName) => {
|
|
|
164
113
|
select: withxis lower(withx.select)
|
|
165
114
|
select: fetch is with.fetch
|
|
166
115
|
}
|
|
167
|
-
|
|
168
|
-
)
|
|
169
|
-
.getSQL();
|
|
170
|
-
await validateCompilation(databaseName, sql);
|
|
116
|
+
`).malloyResultMatches(orderByModel, {});
|
|
171
117
|
});
|
|
172
118
|
|
|
173
119
|
it(`aggregate and scalar conditions - ${databaseName}`, async () => {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
query: models->{
|
|
178
|
-
aggregate: model_count is count(){? manufacturer ? ~'A%' }
|
|
120
|
+
await expect(`
|
|
121
|
+
run: models->{
|
|
122
|
+
aggregate: model_count is count(){ where: manufacturer ? ~'A%' }
|
|
179
123
|
}
|
|
180
|
-
|
|
181
|
-
)
|
|
182
|
-
.getSQL();
|
|
183
|
-
await validateCompilation(databaseName, sql);
|
|
124
|
+
`).malloyResultMatches(orderByModel, {});
|
|
184
125
|
});
|
|
185
126
|
|
|
186
127
|
// I'm not sure I have the syntax right here...
|
|
187
128
|
it(`modeled having simple - ${databaseName}`, async () => {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
select: manufacturer, model_count
|
|
200
|
-
}
|
|
201
|
-
`
|
|
202
|
-
)
|
|
203
|
-
.run();
|
|
204
|
-
expect(result.data.row(0).cell('model_count').value).toBe(102);
|
|
129
|
+
await expect(`
|
|
130
|
+
source: popular_names is models->{
|
|
131
|
+
having: model_count > 100
|
|
132
|
+
group_by: manufacturer
|
|
133
|
+
aggregate: model_count
|
|
134
|
+
}
|
|
135
|
+
run: popular_names->{
|
|
136
|
+
order_by: 2
|
|
137
|
+
select: manufacturer, model_count
|
|
138
|
+
}
|
|
139
|
+
`).malloyResultMatches(orderByModel, {model_count: 102});
|
|
205
140
|
});
|
|
206
141
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
source: popular_names is
|
|
142
|
+
testIf(runtime.supportsNesting)(
|
|
143
|
+
`modeled having complex - ${databaseName}`,
|
|
144
|
+
async () => {
|
|
145
|
+
await expect(`
|
|
146
|
+
source: popular_names is models->{
|
|
212
147
|
having: model_count > 100
|
|
213
148
|
group_by: manufacturer
|
|
214
149
|
aggregate: model_count
|
|
@@ -217,42 +152,33 @@ expressionModels.forEach((orderByModel, databaseName) => {
|
|
|
217
152
|
group_by: manufacturer
|
|
218
153
|
aggregate: model_count
|
|
219
154
|
}
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
query: popular_names->{
|
|
223
|
-
order_by: 2
|
|
224
|
-
select: manufacturer, model_count
|
|
225
155
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
156
|
+
run: popular_names->{
|
|
157
|
+
order_by: 2
|
|
158
|
+
select: manufacturer, model_count
|
|
159
|
+
}
|
|
160
|
+
`).malloyResultMatches(orderByModel, {model_count: 102});
|
|
161
|
+
}
|
|
162
|
+
);
|
|
231
163
|
|
|
232
164
|
it(`turtle references joined element - ${databaseName}`, async () => {
|
|
233
|
-
|
|
234
|
-
.
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
measure: aircraft_count is count()
|
|
239
|
-
}
|
|
165
|
+
await expect(`
|
|
166
|
+
source: a is ${databaseName}.table('malloytest.aircraft') extend {
|
|
167
|
+
primary_key: tail_num
|
|
168
|
+
measure: aircraft_count is count()
|
|
169
|
+
}
|
|
240
170
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
171
|
+
run: ${databaseName}.table('malloytest.flights') extend {
|
|
172
|
+
primary_key: id2
|
|
173
|
+
join_one: a with tail_num
|
|
244
174
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
`
|
|
254
|
-
)
|
|
255
|
-
.getSQL();
|
|
256
|
-
await validateCompilation(databaseName, sql);
|
|
175
|
+
measure: flight_count is count()
|
|
176
|
+
view: foo is {
|
|
177
|
+
group_by: carrier
|
|
178
|
+
aggregate: flight_count
|
|
179
|
+
aggregate: a.aircraft_count
|
|
180
|
+
}
|
|
181
|
+
} -> foo
|
|
182
|
+
`).malloyResultMatches(orderByModel, {});
|
|
257
183
|
});
|
|
258
184
|
});
|
|
@@ -37,60 +37,40 @@ afterAll(async () => {
|
|
|
37
37
|
|
|
38
38
|
runtimes.runtimeMap.forEach((runtime, databaseName) => {
|
|
39
39
|
it(`sql expression with turducken - ${databaseName}`, async () => {
|
|
40
|
-
|
|
41
|
-
.
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"""SELECT * FROM (%{
|
|
45
|
-
${databaseName}.table('malloytest.state_facts') -> {
|
|
46
|
-
aggregate: c is count()
|
|
47
|
-
}
|
|
48
|
-
}) AS state_facts """
|
|
49
|
-
) -> {
|
|
50
|
-
select: *
|
|
51
|
-
}
|
|
52
|
-
`
|
|
53
|
-
)
|
|
54
|
-
.run();
|
|
55
|
-
expect(result.data.value[0]['c']).toBe(51);
|
|
56
|
-
});
|
|
57
|
-
it(`sql expression in second of two queries in same block, dependent on first query - ${databaseName}`, async () => {
|
|
58
|
-
const result = await runtime
|
|
59
|
-
.loadQuery(
|
|
60
|
-
`
|
|
61
|
-
query:
|
|
62
|
-
a is ${databaseName}.table('malloytest.state_facts') -> {
|
|
40
|
+
await expect(`
|
|
41
|
+
run: ${databaseName}.sql(
|
|
42
|
+
"""SELECT * FROM (%{
|
|
43
|
+
${databaseName}.table('malloytest.state_facts') -> {
|
|
63
44
|
aggregate: c is count()
|
|
64
45
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
46
|
+
}) AS state_facts """
|
|
47
|
+
) -> { select: * }
|
|
48
|
+
`).malloyResultMatches(runtime, {c: 51});
|
|
49
|
+
});
|
|
50
|
+
it(`sql expression in second of two queries in same block, dependent on first query - ${databaseName}`, async () => {
|
|
51
|
+
await expect(`
|
|
52
|
+
query:
|
|
53
|
+
a is ${databaseName}.table('malloytest.state_facts') -> {
|
|
54
|
+
aggregate: c is count()
|
|
55
|
+
}
|
|
56
|
+
b is ${databaseName}.sql(
|
|
57
|
+
"""SELECT * FROM (%{ a -> { select: * } }) AS state_facts """
|
|
58
|
+
) -> { select: * }
|
|
59
|
+
run: b
|
|
60
|
+
`).malloyResultMatches(runtime, {c: 51});
|
|
75
61
|
});
|
|
76
62
|
it(`sql expression in other sql expression - ${databaseName}`, async () => {
|
|
77
|
-
|
|
78
|
-
.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
""") -> { group_by: one }
|
|
85
|
-
`
|
|
86
|
-
)
|
|
87
|
-
.run();
|
|
88
|
-
expect(result.data.value[0]['one']).toBe(1);
|
|
63
|
+
await expect(`
|
|
64
|
+
run: ${databaseName}.sql("""
|
|
65
|
+
SELECT * from (%{
|
|
66
|
+
${databaseName}.sql("""SELECT 1 as one""") -> { group_by: one }
|
|
67
|
+
}) as the_table
|
|
68
|
+
""") -> { group_by: one }
|
|
69
|
+
`).malloyResultMatches(runtime, {one: 1});
|
|
89
70
|
});
|
|
90
71
|
it(`run sql expression as query - ${databaseName}`, async () => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
expect(result.data.value[0]['one']).toBe(1);
|
|
72
|
+
await expect(
|
|
73
|
+
`run: ${databaseName}.sql("""SELECT 1 as one""")`
|
|
74
|
+
).malloyResultMatches(runtime, {one: 1});
|
|
95
75
|
});
|
|
96
76
|
});
|