Files
supabase/studio/tests/pages/projects/Logs.utils.test.js

101 lines
3.6 KiB
JavaScript

import {
ensureNoTimestampConflict,
genChartQuery,
genDefaultQuery,
LogsTableName,
SQL_FILTER_TEMPLATES,
} from 'components/interfaces/Settings/Logs'
import dayjs from 'dayjs'
describe.each(Object.values(LogsTableName))('%s', (table) => {
const templates = SQL_FILTER_TEMPLATES[table]
const stringTemplateKey = Object.keys(templates).find((key) => {
if (typeof templates[key] === 'string' && key.split('.').length === 2) {
return true
} else {
false
}
})
const [root, child] = (stringTemplateKey || '').split('.')
describe.each([
{ filter: { search_query: '' } },
{ filter: { search_query: undefined } },
{ filter: {} },
{ filter: { search_query: '123test' }, contains: ['123test'] },
// test behaviour with overrides
{
filter: { search_query: '123test', override: 'something' },
contains: ['123test', 'override', 'something'],
},
{
filter: { search_query: '', override: 'something' },
contains: ['override', 'something'],
},
{
filter: { search_query: undefined, override: 'something' },
contains: ['override', 'something'],
},
{
filter: { override: 'something' },
contains: ['override', 'something'],
},
{
filter: { 'override.nested': 'something' },
contains: ['override.nested', 'something'],
},
// check for when string templates are set to false.
...(stringTemplateKey
? [
{
filter: { search_query: 'some-search-query', [root]: { [child]: false } },
excludes: [templates[stringTemplateKey], '()'],
contains: ['some-search-query'],
},
]
: []),
])('generates sql for filter $filter', ({ filter, contains = [], excludes = [] }) => {
test('generates query correctly', async () => {
const generated = genDefaultQuery(table, filter)
// should not contain functions
expect(generated).not.toMatch(/function[ A-Za-z_-]+\(.+\).+\{.+return.+\}/)
expect(generated).not.toMatch(/\=\>|\$\{.+\}/)
expect(generated).not.toContain('return')
contains.forEach((str) => expect(generated).toContain(str))
excludes.forEach((str) => expect(generated).not.toContain(str))
})
test('generated chart query should include filters', () => {
const generated = genChartQuery(table, {}, { 'override.nested': 'something' })
expect(generated).toContain('override.nested')
expect(generated).toContain('something')
expect(generated).toContain('timestamp_trunc')
})
})
})
const base = dayjs().subtract(2, 'day')
const baseIso = base.toISOString()
test.each([
{
case: 'next start is after initial start',
initial: [base.subtract(1, 'day').toISOString(), baseIso],
next: [base.subtract(2, 'day').toISOString(), null],
expected: [base.subtract(2, 'day').toISOString(), baseIso],
},
{
case: 'next end is before initial start',
initial: [base.subtract(1, 'day').toISOString(), baseIso],
next: [null, base.subtract(2, 'day').toISOString()],
expected: [base.subtract(3, 'day').toISOString(), base.subtract(2, 'day').toISOString()],
},
{
case: 'next end is not before initial start',
initial: [base.subtract(2, 'day').toISOString(), baseIso],
next: [null, base.subtract(1, 'day').toISOString()],
expected: [base.subtract(2, 'day').toISOString(), base.subtract(1, 'day').toISOString()],
},
])('ensure no timestamp conflict: $case', ({ initial, next, expected }) => {
const result = ensureNoTimestampConflict(initial, next)
expect(result[0]).toEqual(expected[0])
expect(result[1]).toEqual(expected[1])
})