Skip to content

Commit 23a2f89

Browse files
committed
add more tests for views and errors
1 parent 991e1b0 commit 23a2f89

File tree

2 files changed

+215
-0
lines changed

2 files changed

+215
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
cube('orders', {
2+
sql_table: 'public.orders',
3+
4+
dimensions: {
5+
id: {
6+
sql: 'id',
7+
type: 'number',
8+
primary_key: true,
9+
},
10+
11+
status: {
12+
sql: 'status',
13+
type: 'string',
14+
},
15+
16+
created_at: {
17+
sql: 'created_at',
18+
type: 'time',
19+
},
20+
21+
completed_at: {
22+
sql: 'completed_at',
23+
type: 'time',
24+
},
25+
},
26+
27+
measures: {
28+
count: {
29+
type: 'count',
30+
},
31+
status: {
32+
type: 'count',
33+
},
34+
},
35+
36+
hierarchies: {
37+
hello: {
38+
title: 'World',
39+
levels: [status],
40+
},
41+
},
42+
});

packages/cubejs-schema-compiler/test/unit/schema.test.ts

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,26 @@ describe('Schema Testing', () => {
372372
});
373373
});
374374

375+
it('throws an error on duplicate member names', async () => {
376+
const orders = fs.readFileSync(
377+
path.join(process.cwd(), '/test/unit/fixtures/orders_dup_members.js'),
378+
'utf8'
379+
);
380+
381+
const { compiler } = prepareCompiler([
382+
{
383+
content: orders,
384+
fileName: 'orders.js',
385+
},
386+
]);
387+
388+
try {
389+
await compiler.compile();
390+
} catch (e: any) {
391+
expect(e.toString()).toMatch(/status defined more than once/);
392+
}
393+
});
394+
375395
it('valid schema with accessPolicy', async () => {
376396
const { compiler } = prepareJsCompiler([
377397
createCubeSchemaWithAccessPolicy('ProtectedCube'),
@@ -380,6 +400,159 @@ describe('Schema Testing', () => {
380400
compiler.throwIfAnyErrors();
381401
});
382402

403+
describe('Views', () => {
404+
it('throws errors for incorrect referenced includes members', async () => {
405+
const orders = fs.readFileSync(
406+
path.join(process.cwd(), '/test/unit/fixtures/orders.js'),
407+
'utf8'
408+
);
409+
const ordersView = `
410+
views:
411+
- name: orders_view
412+
cubes:
413+
- join_path: orders
414+
includes:
415+
- id
416+
- status
417+
- nonexistent1
418+
- nonexistent2.via.path
419+
`;
420+
421+
const { compiler } = prepareCompiler([
422+
{
423+
content: orders,
424+
fileName: 'orders.js',
425+
},
426+
{
427+
content: ordersView,
428+
fileName: 'order_view.yml',
429+
},
430+
]);
431+
432+
try {
433+
await compiler.compile();
434+
} catch (e: any) {
435+
expect(e.toString()).toMatch(/Paths aren't allowed in cube includes but 'nonexistent2\.via\.path' provided as include member/);
436+
expect(e.toString()).toMatch(/Member 'nonexistent1' is included in 'orders_view' but not defined in any cube/);
437+
expect(e.toString()).toMatch(/Member 'nonexistent2\.via\.path' is included in 'orders_view' but not defined in any cube/);
438+
}
439+
});
440+
441+
it('throws errors for incorrect referenced excludes members', async () => {
442+
const orders = fs.readFileSync(
443+
path.join(process.cwd(), '/test/unit/fixtures/orders.js'),
444+
'utf8'
445+
);
446+
const ordersView = `
447+
views:
448+
- name: orders_view
449+
cubes:
450+
- join_path: orders
451+
includes: "*"
452+
excludes:
453+
- id
454+
- status
455+
- nonexistent3
456+
- nonexistent4
457+
`;
458+
459+
const { compiler } = prepareCompiler([
460+
{
461+
content: orders,
462+
fileName: 'orders.js',
463+
},
464+
{
465+
content: ordersView,
466+
fileName: 'order_view.yml',
467+
},
468+
]);
469+
470+
try {
471+
await compiler.compile();
472+
} catch (e: any) {
473+
expect(e.toString()).toMatch(/Member 'nonexistent3' is included in 'orders_view' but not defined in any cube/);
474+
expect(e.toString()).toMatch(/Member 'nonexistent4' is included in 'orders_view' but not defined in any cube/);
475+
}
476+
});
477+
478+
it('throws errors for incorrect referenced excludes members with path', async () => {
479+
const orders = fs.readFileSync(
480+
path.join(process.cwd(), '/test/unit/fixtures/orders.js'),
481+
'utf8'
482+
);
483+
const ordersView = `
484+
views:
485+
- name: orders_view
486+
cubes:
487+
- join_path: orders
488+
includes: "*"
489+
excludes:
490+
- id
491+
- status
492+
- nonexistent5.via.path
493+
`;
494+
495+
const { compiler } = prepareCompiler([
496+
{
497+
content: orders,
498+
fileName: 'orders.js',
499+
},
500+
{
501+
content: ordersView,
502+
fileName: 'order_view.yml',
503+
},
504+
]);
505+
506+
try {
507+
await compiler.compile();
508+
} catch (e: any) {
509+
expect(e.toString()).toMatch(/Paths aren't allowed in cube excludes but 'nonexistent5\.via\.path' provided as exclude member/);
510+
}
511+
});
512+
513+
it('throws errors for conflicting members of included cubes', async () => {
514+
const orders = fs.readFileSync(
515+
path.join(process.cwd(), '/test/unit/fixtures/orders_big.js'),
516+
'utf8'
517+
);
518+
const orderUsers = fs.readFileSync(
519+
path.join(process.cwd(), '/test/unit/fixtures/order_users.yml'),
520+
'utf8'
521+
);
522+
const ordersView = `
523+
views:
524+
- name: orders_view
525+
cubes:
526+
- join_path: orders
527+
includes: "*"
528+
- join_path: orders.order_users
529+
includes: "*"
530+
`;
531+
532+
const { compiler } = prepareCompiler([
533+
{
534+
content: orders,
535+
fileName: 'orders.js',
536+
},
537+
{
538+
content: orderUsers,
539+
fileName: 'order_users.yml',
540+
},
541+
{
542+
content: ordersView,
543+
fileName: 'order_view.yml',
544+
},
545+
]);
546+
547+
try {
548+
await compiler.compile();
549+
} catch (e: any) {
550+
expect(e.toString()).toMatch(/Included member 'count' conflicts with existing member of 'orders_view'\. Please consider excluding this member or assigning it an alias/);
551+
expect(e.toString()).toMatch(/Included member 'id' conflicts with existing member of 'orders_view'\. Please consider excluding this member or assigning it an alias/);
552+
}
553+
});
554+
});
555+
383556
describe('Inheritance', () => {
384557
it('CubeB.js correctly extends cubeA.js (no additions)', async () => {
385558
const orders = fs.readFileSync(

0 commit comments

Comments
 (0)