-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
256 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
import type { | ||
FilterSet, | ||
FilterSetAffix, | ||
FilterSetConfig, | ||
FilterSetExact, | ||
FilterSetIn, | ||
FilterSetRange, | ||
FilterSetValue, | ||
} from './types' | ||
import {DRFFilters} from './types' | ||
|
||
export function isFilterSetValue<K>(config: FilterSetValue<K> | FilterSet<K> | Partial<Record<string, K>> | FilterSetConfig<K>): config is FilterSetValue<K> { | ||
return (config as FilterSetValue<K>).value !== undefined | ||
} | ||
|
||
export function isFilterSetConfig<K>(config: FilterSetValue<K> | FilterSet<K> | FilterSetConfig<K>): config is FilterSetConfig<K> { | ||
const keys = Object.keys(config) | ||
const attributes = keys.filter(item => !DRFFilters.includes(item) && item !== 'value') // exclude all default drf Filters and value | ||
return attributes.length > 0 | ||
} | ||
|
||
export function isFilterSetRange<K>(config: FilterSetValue<K> | FilterSet<K> | FilterSetConfig<K>): config is FilterSetRange<K> { | ||
const keys = Object.keys(config) | ||
const rangeKeys = ['lt', 'gt', 'lte', 'gte'] | ||
const attributes = keys.filter(item => rangeKeys.includes(item)) // exclude all default drf Filters | ||
return attributes.length > 0 | ||
} | ||
|
||
export function isFilterSetExact<K>(config: FilterSetValue<K> | FilterSet<K> | FilterSetConfig<K>): config is FilterSetExact<K> { | ||
return (config as FilterSetExact<K>).exact !== undefined | ||
} | ||
|
||
export function isFilterSetIn<K>(config: FilterSetValue<K> | FilterSet<K> | FilterSetConfig<K>): config is FilterSetIn<K> { | ||
return (config as FilterSetIn<K>).in !== undefined | ||
} | ||
|
||
export function isFilterSetAffix<K>(config: FilterSetValue<K> | FilterSet<K> | FilterSetConfig<K>): config is FilterSetAffix<K> { | ||
return (config as FilterSetAffix<K>).startswith !== undefined || (config as FilterSetAffix<K>).endswith !== undefined | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
import type {FilterSetConfig} from '../types' | ||
import {isFilterSetAffix, isFilterSetConfig, isFilterSetIn, isFilterSetRange, isFilterSetValue} from '../guards' | ||
import {convertFilterSetConfig} from '../middleware' | ||
|
||
interface Data { | ||
number: number | ||
} | ||
|
||
test('it should be possible to set a value by using a guard', () => { | ||
const config: FilterSetConfig<Data> = { | ||
number: {value: 123}, | ||
} | ||
if (isFilterSetValue(config.number)) | ||
config.number.value = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
expect(converted).toEqual({number: 3}) | ||
}) | ||
|
||
test('if its not a FilterSetValue it should not be editable', () => { | ||
const config: FilterSetConfig<Data> = { | ||
number: {lt: 123}, | ||
} | ||
if (isFilterSetValue(config.number)) | ||
config.number.value = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
// eslint-disable-next-line camelcase | ||
expect(converted).toEqual({number__lt: 123}) | ||
}) | ||
|
||
test('it should be possible to set a range by using a guard', () => { | ||
const config: FilterSetConfig<Data> = { | ||
number: {gt: 123}, | ||
} | ||
if (isFilterSetRange(config.number)) | ||
config.number.gt = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
// eslint-disable-next-line camelcase | ||
expect(converted).toEqual({number__gt: 3}) | ||
}) | ||
|
||
test('if its not a isFilterSetRange it should not be editable', () => { | ||
const config: FilterSetConfig<Data> = { | ||
number: {value: 123}, | ||
} | ||
if (isFilterSetRange(config.number)) | ||
config.number.gt = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
expect(converted).toEqual({number: 123}) | ||
}) | ||
|
||
test('it should be possible to set a in filter by using a guard', () => { | ||
const numberList = [1, 2, 3] | ||
const config: FilterSetConfig<Data> = { | ||
number: {in: numberList}, | ||
} | ||
if (isFilterSetIn(config.number)) | ||
config.number.in = [4] | ||
|
||
const converted = convertFilterSetConfig(config) | ||
// eslint-disable-next-line camelcase | ||
expect(converted).toEqual({number__in: [4]}) | ||
}) | ||
|
||
test('if its not a isFilterSetIn it should not be editable', () => { | ||
const config: FilterSetConfig<Data> = { | ||
number: {value: 123}, | ||
} | ||
if (isFilterSetIn(config.number)) | ||
config.number.in = [3] | ||
|
||
const converted = convertFilterSetConfig(config) | ||
expect(converted).toEqual({number: 123}) | ||
}) | ||
|
||
test('it should be possible to set a in affix by using a guard', () => { | ||
const config: FilterSetConfig<Data> = { | ||
number: {startswith: 123}, | ||
} | ||
if (isFilterSetAffix(config.number)) | ||
config.number.startswith = 4 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
// eslint-disable-next-line camelcase | ||
expect(converted).toEqual({number__startswith: 4}) | ||
}) | ||
|
||
test('if its not a isFilterSetAffix it should not be editable', () => { | ||
const config: FilterSetConfig<Data> = { | ||
number: {value: 123}, | ||
} | ||
if (isFilterSetAffix(config.number)) | ||
config.number.startswith = 4 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
expect(converted).toEqual({number: 123}) | ||
}) | ||
|
||
interface Complex { | ||
id: number | ||
} | ||
|
||
interface ComplexData { | ||
complex: Complex | ||
} | ||
|
||
test('it should be possible to set a range by using a guard', () => { | ||
const config: FilterSetConfig<ComplexData> = { | ||
complex: {id: {value: 123}}, | ||
} | ||
if (isFilterSetConfig(config.complex) && isFilterSetValue(config.complex.id)) | ||
config.complex.id.value = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
// eslint-disable-next-line camelcase | ||
expect(converted).toEqual({complex__id: 3}) | ||
}) | ||
|
||
test('if its not a isFilterSetConfig it should not be editable', () => { | ||
const complexData = {id: 123} | ||
const config: FilterSetConfig<ComplexData> = { | ||
complex: {value: complexData}, | ||
} | ||
if (isFilterSetConfig(config.complex) && isFilterSetValue(config.complex.id)) | ||
config.complex.id.value = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
expect(converted).toEqual({complex: complexData}) | ||
}) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
import type {FilterSetConfig} from '../types' | ||
import {isFilterSetExact, isFilterSetRange, isFilterSetValue} from '../guards' | ||
import {convertFilterSetConfig} from '../middleware' | ||
|
||
interface Data { | ||
number: number | ||
} | ||
|
||
interface FilterSetKeyConfig { | ||
number: 'exact' | 'lte' | 'lt' | 'gt' | ||
} | ||
|
||
test('it should be possible to set a value by using a guard with a key config', () => { | ||
const config: FilterSetConfig<Data, FilterSetKeyConfig> = { | ||
number: {exact: 123}, | ||
} | ||
if (isFilterSetExact(config.number)) | ||
config.number.exact = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
// eslint-disable-next-line camelcase | ||
expect(converted).toEqual({number__exact: 3}) | ||
}) | ||
|
||
test('if the config is not a FilterSetValue it should not be editable with a key config', () => { | ||
const config: FilterSetConfig<Data> = { | ||
number: {lt: 123}, | ||
} | ||
if (isFilterSetValue(config.number)) | ||
config.number.value = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
// eslint-disable-next-line camelcase | ||
expect(converted).toEqual({number__lt: 123}) | ||
}) | ||
|
||
test('it should be possible to set a value by using a guard with a key config', () => { | ||
const config: FilterSetConfig<Data, FilterSetKeyConfig> = { | ||
number: {value: 123}, | ||
} | ||
if (isFilterSetValue(config.number)) | ||
config.number.value = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
expect(converted).toEqual({number: 3}) | ||
}) | ||
|
||
test('it should be possible to set range by using a guard with a key config', () => { | ||
const config: FilterSetConfig<Data, FilterSetKeyConfig> = { | ||
number: {lt: 123}, | ||
} | ||
if (isFilterSetRange(config.number)) | ||
config.number.lt = 3 | ||
|
||
const converted = convertFilterSetConfig(config) | ||
// eslint-disable-next-line camelcase | ||
expect(converted).toEqual({number__lt: 3}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import type {FilterSetConfig} from '../types' | ||
import {isFilterSetRange} from '../guards' | ||
import {convertFilterSetConfig} from '../middleware' | ||
|
||
interface Data { | ||
number: number | ||
} | ||
|
||
test('it should not be possible to set a in Filter by using a range guard', () => { | ||
const config: FilterSetConfig<Data> = { | ||
number: {gt: 123}, | ||
} | ||
if (isFilterSetRange(config.number)) | ||
// @ts-expect-error in has type never | ||
config.number.in = [3] | ||
|
||
const converted = convertFilterSetConfig(config) | ||
// eslint-disable-next-line camelcase | ||
expect(converted).toEqual({number__gt: 123, number__in: [3]}) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters