@malloydata/malloy-tests 0.0.69-dev230808200646 → 0.0.69

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 (79) hide show
  1. package/dist/databases/all/db_index.spec.d.ts +1 -1
  2. package/dist/databases/all/db_index.spec.js +116 -6
  3. package/dist/databases/all/db_index.spec.js.map +1 -1
  4. package/dist/databases/all/expr.spec.js +542 -6
  5. package/dist/databases/all/expr.spec.js.map +1 -1
  6. package/dist/databases/all/functions.spec.d.ts +1 -1
  7. package/dist/databases/all/functions.spec.js +745 -6
  8. package/dist/databases/all/functions.spec.js.map +1 -1
  9. package/dist/databases/all/join.spec.d.ts +1 -1
  10. package/dist/databases/all/join.spec.js +272 -6
  11. package/dist/databases/all/join.spec.js.map +1 -1
  12. package/dist/databases/all/nomodel.spec.d.ts +1 -1
  13. package/dist/databases/all/nomodel.spec.js +919 -6
  14. package/dist/databases/all/nomodel.spec.js.map +1 -1
  15. package/dist/databases/all/orderby.spec.d.ts +1 -1
  16. package/dist/databases/all/orderby.spec.js +187 -6
  17. package/dist/databases/all/orderby.spec.js.map +1 -1
  18. package/dist/databases/all/problems.spec.d.ts +1 -1
  19. package/dist/databases/all/problems.spec.js +76 -6
  20. package/dist/databases/all/problems.spec.js.map +1 -1
  21. package/dist/databases/all/sql_expressions.spec.d.ts +1 -1
  22. package/dist/databases/all/sql_expressions.spec.js +58 -6
  23. package/dist/databases/all/sql_expressions.spec.js.map +1 -1
  24. package/dist/databases/all/time.spec.d.ts +1 -1
  25. package/dist/databases/all/time.spec.js +609 -5
  26. package/dist/databases/all/time.spec.js.map +1 -1
  27. package/dist/databases/shared/test_list.js +1 -20
  28. package/dist/databases/shared/test_list.js.map +1 -1
  29. package/dist/index.d.ts +0 -8
  30. package/dist/index.js +1 -17
  31. package/dist/index.js.map +1 -1
  32. package/package.json +6 -6
  33. package/src/databases/all/db_index.spec.ts +137 -6
  34. package/src/databases/all/expr.spec.ts +661 -7
  35. package/src/databases/all/functions.spec.ts +1092 -6
  36. package/src/databases/all/join.spec.ts +309 -6
  37. package/src/databases/all/nomodel.spec.ts +1114 -7
  38. package/src/databases/all/orderby.spec.ts +229 -6
  39. package/src/databases/all/problems.spec.ts +82 -6
  40. package/src/databases/all/sql_expressions.spec.ts +65 -6
  41. package/src/databases/all/time.spec.ts +734 -5
  42. package/src/databases/shared/test_list.ts +1 -20
  43. package/src/index.ts +0 -9
  44. package/dist/databases/shared/db_index.d.ts +0 -3
  45. package/dist/databases/shared/db_index.js +0 -123
  46. package/dist/databases/shared/db_index.js.map +0 -1
  47. package/dist/databases/shared/expr.d.ts +0 -3
  48. package/dist/databases/shared/expr.js +0 -551
  49. package/dist/databases/shared/expr.js.map +0 -1
  50. package/dist/databases/shared/functions.d.ts +0 -3
  51. package/dist/databases/shared/functions.js +0 -754
  52. package/dist/databases/shared/functions.js.map +0 -1
  53. package/dist/databases/shared/join.d.ts +0 -3
  54. package/dist/databases/shared/join.js +0 -302
  55. package/dist/databases/shared/join.js.map +0 -1
  56. package/dist/databases/shared/nomodel.d.ts +0 -3
  57. package/dist/databases/shared/nomodel.js +0 -950
  58. package/dist/databases/shared/nomodel.js.map +0 -1
  59. package/dist/databases/shared/orderby.d.ts +0 -3
  60. package/dist/databases/shared/orderby.js +0 -217
  61. package/dist/databases/shared/orderby.js.map +0 -1
  62. package/dist/databases/shared/problems.d.ts +0 -3
  63. package/dist/databases/shared/problems.js +0 -106
  64. package/dist/databases/shared/problems.js.map +0 -1
  65. package/dist/databases/shared/sql_expressions.d.ts +0 -3
  66. package/dist/databases/shared/sql_expressions.js +0 -88
  67. package/dist/databases/shared/sql_expressions.js.map +0 -1
  68. package/dist/databases/shared/time.d.ts +0 -3
  69. package/dist/databases/shared/time.js +0 -640
  70. package/dist/databases/shared/time.js.map +0 -1
  71. package/src/databases/shared/db_index.ts +0 -167
  72. package/src/databases/shared/expr.ts +0 -695
  73. package/src/databases/shared/functions.ts +0 -1126
  74. package/src/databases/shared/join.ts +0 -340
  75. package/src/databases/shared/nomodel.ts +0 -1150
  76. package/src/databases/shared/orderby.ts +0 -260
  77. package/src/databases/shared/problems.ts +0 -113
  78. package/src/databases/shared/sql_expressions.ts +0 -96
  79. package/src/databases/shared/time.ts +0 -786
@@ -24,12 +24,235 @@
24
24
 
25
25
  import {RuntimeList, allDatabases} from '../../runtimes';
26
26
  import {databasesFromEnvironmentOr} from '../../util';
27
- import {orderBySharedTests} from '../shared/orderby';
27
+ import '../../util/db-jest-matchers';
28
+ import * as malloy from '@malloydata/malloy';
28
29
 
29
30
  const runtimes = new RuntimeList(databasesFromEnvironmentOr(allDatabases));
30
31
 
31
- /*
32
- * This test file reuses common tests definitions.
33
- * For actual test development please go to: test/src/databases/shared/orderby.spec.ts
34
- */
35
- orderBySharedTests(runtimes);
32
+ afterAll(async () => {
33
+ await runtimes.closeAll();
34
+ });
35
+
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'){
61
+ measure: model_count is count()
62
+ }
63
+ `)
64
+ )
65
+ );
66
+
67
+ expressionModels.forEach((orderByModel, databaseName) => {
68
+ 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);
81
+ });
82
+
83
+ 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);
101
+ });
102
+
103
+ 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);
117
+ });
118
+
119
+ it(`reserved words are quoted - ${databaseName}`, async () => {
120
+ const sql = await orderByModel
121
+ .loadQuery(
122
+ `
123
+ query: models->{
124
+ aggregate: fetch is count()
125
+ }->{
126
+ group_by: fetch
127
+ }
128
+ `
129
+ )
130
+ .getSQL();
131
+ await validateCompilation(databaseName, sql);
132
+ });
133
+
134
+ it(`reserved words are quoted in turtles - ${databaseName}`, async () => {
135
+ const sql = await orderByModel
136
+ .loadQuery(
137
+ `
138
+ query: models->{
139
+ nest: withx is {
140
+ group_by: select is UPPER(manufacturer)
141
+ aggregate: fetch is count()
142
+ }
143
+ } -> {
144
+ project:
145
+ withxz is lower(withx.select)
146
+ fetch is withx.fetch
147
+ }
148
+ `
149
+ )
150
+ .getSQL();
151
+ await validateCompilation(databaseName, sql);
152
+ });
153
+
154
+ it.skip('reserved words in structure definitions', async () => {
155
+ const sql = await orderByModel
156
+ .loadQuery(
157
+ `
158
+ query: models->{
159
+ nest: withx is {
160
+ group_by: is select is UPPER(manufacturer)
161
+ aggregate: fetch is count()
162
+ }
163
+ } -> {
164
+ project: withxis lower(withx.select)
165
+ project: fetch is with.fetch
166
+ }
167
+ `
168
+ )
169
+ .getSQL();
170
+ await validateCompilation(databaseName, sql);
171
+ });
172
+
173
+ 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%' }
179
+ }
180
+ `
181
+ )
182
+ .getSQL();
183
+ await validateCompilation(databaseName, sql);
184
+ });
185
+
186
+ // I'm not sure I have the syntax right here...
187
+ 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
+ project: manufacturer, model_count
200
+ }
201
+ `
202
+ )
203
+ .run();
204
+ expect(result.data.row(0).cell('model_count').value).toBe(102);
205
+ });
206
+
207
+ it(`modeled having complex - ${databaseName}`, async () => {
208
+ const result = await orderByModel
209
+ .loadQuery(
210
+ `
211
+ source: popular_names is from(models->{
212
+ having: model_count > 100
213
+ group_by: manufacturer
214
+ aggregate: model_count
215
+ nest: l is {
216
+ top: 5
217
+ group_by: manufacturer
218
+ aggregate: model_count
219
+ }
220
+ })
221
+
222
+ query: popular_names->{
223
+ order_by: 2
224
+ project: manufacturer, model_count
225
+ }
226
+ `
227
+ )
228
+ .run();
229
+ expect(result.data.row(0).cell('model_count').value).toBe(102);
230
+ });
231
+
232
+ 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
+ }
240
+
241
+ source: f is table('malloytest.flights'){
242
+ primary_key: id2
243
+ join_one: a with tail_num
244
+
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);
257
+ });
258
+ });
@@ -24,12 +24,88 @@
24
24
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
25
  import {RuntimeList, allDatabases} from '../../runtimes';
26
26
  import {databasesFromEnvironmentOr} from '../../util';
27
- import {problemsSharedTests} from '../shared/problems';
27
+ import '../../util/db-jest-matchers';
28
28
 
29
29
  const runtimes = new RuntimeList(databasesFromEnvironmentOr(allDatabases));
30
30
 
31
- /*
32
- * This test file reuses common tests definitions.
33
- * For actual test development please go to: test/src/databases/shared/problems.spec.ts
34
- */
35
- problemsSharedTests(runtimes);
31
+ afterAll(async () => {
32
+ await runtimes.closeAll();
33
+ });
34
+
35
+ async function getError<T>(fn: () => Promise<T>) {
36
+ try {
37
+ await fn();
38
+ } catch (error) {
39
+ return error;
40
+ }
41
+ }
42
+
43
+ runtimes.runtimeMap.forEach((runtime, databaseName) => {
44
+ describe('warnings', () => {
45
+ // Today we don't show errors after the first model entry with an error,
46
+ // so this can't work yet.
47
+ it.skip(`can appear after errors - ${databaseName}`, async () => {
48
+ const source = `
49
+ source: foo is table('asdfds');
50
+ source: bar is table('malloytest.state_facts') {
51
+ dimension: a is LENGTH('foo')
52
+ }
53
+ `;
54
+ const error = await getError(() => runtime.getModel(source));
55
+ expect(error).not.toBeUndefined();
56
+ expect(error).toMatchObject({
57
+ problems: [
58
+ {
59
+ severity: 'error',
60
+ },
61
+ {
62
+ message:
63
+ "Case insensitivity for function names is deprecated, use 'length' instead",
64
+ severity: 'warn',
65
+ },
66
+ ],
67
+ });
68
+ });
69
+
70
+ it(`can appear before errors - ${databaseName}`, async () => {
71
+ const source = `
72
+ source: bar is table('malloytest.state_facts') {
73
+ dimension: a is LENGTH('foo')
74
+ }
75
+ source: foo is table('asdfds');
76
+ `;
77
+ const error = await getError(() => runtime.getModel(source));
78
+ expect(error).not.toBeUndefined();
79
+ expect(error).toMatchObject({
80
+ problems: [
81
+ {
82
+ message:
83
+ "Case insensitivity for function names is deprecated, use 'length' instead",
84
+ severity: 'warn',
85
+ },
86
+ {
87
+ severity: 'error',
88
+ },
89
+ ],
90
+ });
91
+ });
92
+
93
+ it(`can appear alone - ${databaseName}`, async () => {
94
+ const source = `
95
+ source: bar is table('malloytest.state_facts') {
96
+ dimension: a is LENGTH('foo')
97
+ }
98
+ `;
99
+ const model = await runtime.getModel(source);
100
+ expect(model).toMatchObject({
101
+ problems: [
102
+ {
103
+ message:
104
+ "Case insensitivity for function names is deprecated, use 'length' instead",
105
+ severity: 'warn',
106
+ },
107
+ ],
108
+ });
109
+ });
110
+ });
111
+ });
@@ -26,12 +26,71 @@
26
26
 
27
27
  import {RuntimeList, allDatabases} from '../../runtimes';
28
28
  import {databasesFromEnvironmentOr} from '../../util';
29
- import {sqlExpressionsSharedTests} from '../shared/sql_expressions';
29
+ import '../../util/db-jest-matchers';
30
+ // No prebuilt shared model, each test is complete. Makes debugging easier.
30
31
 
31
32
  const runtimes = new RuntimeList(databasesFromEnvironmentOr(allDatabases));
32
33
 
33
- /*
34
- * This test file reuses common tests definitions.
35
- * For actual test development please go to: test/src/databases/shared/sql_expressions.spec.ts
36
- */
37
- sqlExpressionsSharedTests(runtimes);
34
+ afterAll(async () => {
35
+ await runtimes.closeAll();
36
+ });
37
+
38
+ runtimes.runtimeMap.forEach((runtime, databaseName) => {
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
+ project: *
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') -> {
63
+ aggregate: c is count()
64
+ }
65
+ b is ${databaseName}.sql(
66
+ """SELECT * FROM (%{ -> a -> { project: * } }) AS state_facts """
67
+ ) -> {
68
+ project: *
69
+ }
70
+ run: b
71
+ `
72
+ )
73
+ .run();
74
+ expect(result.data.value[0]['c']).toBe(51);
75
+ });
76
+ 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);
89
+ });
90
+ 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);
95
+ });
96
+ });