@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.
Files changed (84) hide show
  1. package/README.md +213 -1
  2. package/dist/api.spec.d.ts +1 -1
  3. package/dist/api.spec.js +6 -13
  4. package/dist/api.spec.js.map +1 -1
  5. package/dist/databases/all/db_index.spec.js +21 -41
  6. package/dist/databases/all/db_index.spec.js.map +1 -1
  7. package/dist/databases/all/expr.spec.js +262 -339
  8. package/dist/databases/all/expr.spec.js.map +1 -1
  9. package/dist/databases/all/functions.spec.js +37 -35
  10. package/dist/databases/all/functions.spec.js.map +1 -1
  11. package/dist/databases/all/join.spec.js +125 -169
  12. package/dist/databases/all/join.spec.js.map +1 -1
  13. package/dist/databases/all/nomodel.spec.js +335 -594
  14. package/dist/databases/all/nomodel.spec.js.map +1 -1
  15. package/dist/databases/all/orderby.spec.js +82 -128
  16. package/dist/databases/all/orderby.spec.js.map +1 -1
  17. package/dist/databases/all/sql_expressions.spec.js +27 -43
  18. package/dist/databases/all/sql_expressions.spec.js.map +1 -1
  19. package/dist/databases/all/time.spec.js +63 -103
  20. package/dist/databases/all/time.spec.js.map +1 -1
  21. package/dist/databases/bigquery/double_truncation.spec.js +1 -1
  22. package/dist/databases/bigquery/handexpr.spec.js +12 -12
  23. package/dist/databases/bigquery/injestion_time_partitioning.spec.js +22 -22
  24. package/dist/databases/bigquery/joined_filters.spec.js +3 -3
  25. package/dist/databases/bigquery/json.spec.d.ts +1 -1
  26. package/dist/databases/bigquery/json.spec.js +25 -45
  27. package/dist/databases/bigquery/json.spec.js.map +1 -1
  28. package/dist/databases/bigquery/malloy_query.spec.d.ts +1 -1
  29. package/dist/databases/bigquery/malloy_query.spec.js +47 -48
  30. package/dist/databases/bigquery/malloy_query.spec.js.map +1 -1
  31. package/dist/databases/bigquery/time.spec.js +9 -13
  32. package/dist/databases/bigquery/time.spec.js.map +1 -1
  33. package/dist/databases/bigquery/wildcard_table_names.spec.js +19 -19
  34. package/dist/databases/bigquery-duckdb/nested_source_table.spec.js +53 -87
  35. package/dist/databases/bigquery-duckdb/nested_source_table.spec.js.map +1 -1
  36. package/dist/databases/bigquery-postgres/multi_connection.spec.js +5 -20
  37. package/dist/databases/bigquery-postgres/multi_connection.spec.js.map +1 -1
  38. package/dist/databases/bigquery-postgres/streaming.spec.js +6 -6
  39. package/dist/databases/bigquery-postgres/streaming.spec.js.map +1 -1
  40. package/dist/databases/duckdb/duckdb.spec.js +24 -33
  41. package/dist/databases/duckdb/duckdb.spec.js.map +1 -1
  42. package/dist/databases/postgres/postgres.spec.js +46 -67
  43. package/dist/databases/postgres/postgres.spec.js.map +1 -1
  44. package/dist/jestMatcher.spec.d.ts +1 -0
  45. package/dist/jestMatcher.spec.js +81 -0
  46. package/dist/jestMatcher.spec.js.map +1 -0
  47. package/dist/render/render.spec.js +10 -12
  48. package/dist/render/render.spec.js.map +1 -1
  49. package/dist/tags.spec.js +22 -2
  50. package/dist/tags.spec.js.map +1 -1
  51. package/dist/util/db-jest-matchers.d.ts +17 -6
  52. package/dist/util/db-jest-matchers.js +81 -20
  53. package/dist/util/db-jest-matchers.js.map +1 -1
  54. package/dist/util/index.d.ts +1 -2
  55. package/dist/util/index.js +11 -13
  56. package/dist/util/index.js.map +1 -1
  57. package/package.json +6 -6
  58. package/src/api.spec.ts +7 -16
  59. package/src/databases/all/db_index.spec.ts +22 -48
  60. package/src/databases/all/expr.spec.ts +273 -431
  61. package/src/databases/all/functions.spec.ts +37 -35
  62. package/src/databases/all/join.spec.ts +130 -196
  63. package/src/databases/all/nomodel.spec.ts +333 -689
  64. package/src/databases/all/orderby.spec.ts +87 -161
  65. package/src/databases/all/sql_expressions.spec.ts +29 -49
  66. package/src/databases/all/time.spec.ts +73 -130
  67. package/src/databases/bigquery/double_truncation.spec.ts +1 -1
  68. package/src/databases/bigquery/handexpr.spec.ts +12 -12
  69. package/src/databases/bigquery/injestion_time_partitioning.spec.ts +22 -22
  70. package/src/databases/bigquery/joined_filters.spec.ts +3 -3
  71. package/src/databases/bigquery/json.spec.ts +25 -49
  72. package/src/databases/bigquery/malloy_query.spec.ts +47 -54
  73. package/src/databases/bigquery/time.spec.ts +13 -17
  74. package/src/databases/bigquery/wildcard_table_names.spec.ts +19 -19
  75. package/src/databases/bigquery-duckdb/nested_source_table.spec.ts +56 -98
  76. package/src/databases/bigquery-postgres/multi_connection.spec.ts +5 -23
  77. package/src/databases/bigquery-postgres/streaming.spec.ts +12 -6
  78. package/src/databases/duckdb/duckdb.spec.ts +31 -43
  79. package/src/databases/postgres/postgres.spec.ts +54 -84
  80. package/src/jestMatcher.spec.ts +88 -0
  81. package/src/render/render.spec.ts +10 -12
  82. package/src/tags.spec.ts +22 -2
  83. package/src/util/db-jest-matchers.ts +106 -32
  84. 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
- async function validateCompilation(
37
- databaseName: string,
38
- sql: string
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
- const result = await orderByModel
70
- .loadQuery(
71
- `
72
- query: models-> {
73
- group_by: big is seats >=20
74
- aggregate: model_count is count()
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
- const result = await orderByModel
85
- .loadQuery(
86
- `
87
- query: models->{
88
- group_by:
89
- manufacturer,
90
- big is seats >=21
91
- aggregate: model_count is count()
92
- }->{
93
- group_by: big
94
- aggregate: model_count is model_count.sum()
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
- const result = await orderByModel
105
- .loadQuery(
106
- `
107
- query: models->{
108
- aggregate: j_names is model_count {where: manufacturer ~ 'J%'}
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
- const sql = await orderByModel
121
- .loadQuery(
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
- const sql = await orderByModel
136
- .loadQuery(
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
- const sql = await orderByModel
156
- .loadQuery(
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
- const sql = await orderByModel
175
- .loadQuery(
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
- const result = await orderByModel
189
- .loadQuery(
190
- `
191
- source: popular_names is from(models->{
192
- having: model_count > 100
193
- group_by: manufacturer
194
- aggregate: model_count
195
- })
196
-
197
- query: popular_names->{
198
- order_by: 2
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
- it(`modeled having complex - ${databaseName}`, async () => {
208
- const result = await orderByModel
209
- .loadQuery(
210
- `
211
- source: popular_names is from(models->{
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
- .run();
229
- expect(result.data.row(0).cell('model_count').value).toBe(102);
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
- const sql = await orderByModel
234
- .loadQuery(
235
- `
236
- source: a is table('malloytest.aircraft'){
237
- primary_key: tail_num
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
- source: f is table('malloytest.flights'){
242
- primary_key: id2
243
- join_one: a with tail_num
171
+ run: ${databaseName}.table('malloytest.flights') extend {
172
+ primary_key: id2
173
+ join_one: a with tail_num
244
174
 
245
- measure: flight_count is count()
246
- query: foo is {
247
- group_by: carrier
248
- aggregate: flight_count
249
- aggregate: a.aircraft_count
250
- }
251
- }
252
- query: f->foo
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
- const result = await runtime
41
- .loadQuery(
42
- `
43
- run: ${databaseName}.sql(
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
- b is ${databaseName}.sql(
66
- """SELECT * FROM (%{ -> a -> { select: * } }) AS state_facts """
67
- ) -> {
68
- select: *
69
- }
70
- run: b
71
- `
72
- )
73
- .run();
74
- expect(result.data.value[0]['c']).toBe(51);
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
- const result = await runtime
78
- .loadQuery(
79
- `
80
- run: ${databaseName}.sql("""
81
- SELECT * from (%{
82
- ${databaseName}.sql("""SELECT 1 as one""") -> { group_by: one }
83
- }) as the_table
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
- const result = await runtime
92
- .loadQuery(`run: ${databaseName}.sql("""SELECT 1 as one""")`)
93
- .run();
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
  });