Merge pull request #20 from psyko-gh/add-more-tests
test: added more tests
This commit is contained in:
@@ -15,6 +15,9 @@ import { ScorePredicate } from '@core/lib/rules/predicate/score';
|
|||||||
import { StatusPredicate } from '@core/lib/rules/predicate/status';
|
import { StatusPredicate } from '@core/lib/rules/predicate/status';
|
||||||
import { VoteCountPredicate } from '@core/lib/rules/predicate/voteCount';
|
import { VoteCountPredicate } from '@core/lib/rules/predicate/voteCount';
|
||||||
import { WatchprovidersPredicate } from '@core/lib/rules/predicate/watchproviders';
|
import { WatchprovidersPredicate } from '@core/lib/rules/predicate/watchproviders';
|
||||||
|
import { AndPredicate } from '@core/lib/rules/predicate/and';
|
||||||
|
import { NotPredicate } from '@core/lib/rules/predicate/not';
|
||||||
|
import { OrPredicate } from '@core/lib/rules/predicate/or';
|
||||||
|
|
||||||
const from = (data: string) => {
|
const from = (data: string) => {
|
||||||
const options = yaml.load(data) as PredicateOption;
|
const options = yaml.load(data) as PredicateOption;
|
||||||
@@ -199,3 +202,77 @@ describe('WatchProvidersPredicateBuilder', () => {
|
|||||||
`).toEqual(new WatchprovidersPredicate({ terms: ['Platform 1', 'Platform 2'], region: 'us' }));
|
`).toEqual(new WatchprovidersPredicate({ terms: ['Platform 1', 'Platform 2'], region: 'us' }));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('OrPredicateBuilder', () => {
|
||||||
|
it('should match', async () => {
|
||||||
|
expectPredicate(`
|
||||||
|
or:
|
||||||
|
- voteCount: greater than 1000
|
||||||
|
- score: above 7
|
||||||
|
`).toEqual(new OrPredicate([new VoteCountPredicate({ operator: 'gt', threshold: 1000 }), new ScorePredicate({ operator: 'gt', threshold: 7 })]));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not match', async () => {
|
||||||
|
expectPredicate(`
|
||||||
|
and:
|
||||||
|
- voteCount: greater than 1000
|
||||||
|
- score: above 7
|
||||||
|
`).not.toEqual(new OrPredicate([new VoteCountPredicate({ operator: 'gt', threshold: 1000 }), new ScorePredicate({ operator: 'gt', threshold: 7 })]));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not match', async () => {
|
||||||
|
expectPredicate(`
|
||||||
|
not:
|
||||||
|
- voteCount: greater than 1000
|
||||||
|
- score: above 7
|
||||||
|
`).not.toEqual(new OrPredicate([new VoteCountPredicate({ operator: 'gt', threshold: 1000 }), new ScorePredicate({ operator: 'gt', threshold: 7 })]));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('AndPredicateBuilder', () => {
|
||||||
|
it('should match', async () => {
|
||||||
|
expectPredicate(`
|
||||||
|
and:
|
||||||
|
- voteCount: greater than 1000
|
||||||
|
- score: above 7
|
||||||
|
`).toEqual(new AndPredicate([new VoteCountPredicate({ operator: 'gt', threshold: 1000 }), new ScorePredicate({ operator: 'gt', threshold: 7 })]));
|
||||||
|
});
|
||||||
|
it('should match', async () => {
|
||||||
|
expectPredicate(`
|
||||||
|
not:
|
||||||
|
- voteCount: greater than 1000
|
||||||
|
- score: above 7
|
||||||
|
`).not.toEqual(new AndPredicate([new VoteCountPredicate({ operator: 'gt', threshold: 1000 }), new ScorePredicate({ operator: 'gt', threshold: 7 })]));
|
||||||
|
});
|
||||||
|
it('should match', async () => {
|
||||||
|
expectPredicate(`
|
||||||
|
or:
|
||||||
|
- voteCount: greater than 1000
|
||||||
|
- score: above 7
|
||||||
|
`).not.toEqual(new AndPredicate([new VoteCountPredicate({ operator: 'gt', threshold: 1000 }), new ScorePredicate({ operator: 'gt', threshold: 7 })]));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('NotPredicateBuilder', () => {
|
||||||
|
it('should match', async () => {
|
||||||
|
expectPredicate(`
|
||||||
|
not:
|
||||||
|
- voteCount: greater than 1000
|
||||||
|
- score: above 7
|
||||||
|
`).toEqual(new NotPredicate([new VoteCountPredicate({ operator: 'gt', threshold: 1000 }), new ScorePredicate({ operator: 'gt', threshold: 7 })]));
|
||||||
|
});
|
||||||
|
it('should match', async () => {
|
||||||
|
expectPredicate(`
|
||||||
|
and:
|
||||||
|
- voteCount: greater than 1000
|
||||||
|
- score: above 7
|
||||||
|
`).not.toEqual(new NotPredicate([new VoteCountPredicate({ operator: 'gt', threshold: 1000 }), new ScorePredicate({ operator: 'gt', threshold: 7 })]));
|
||||||
|
});
|
||||||
|
it('should match', async () => {
|
||||||
|
expectPredicate(`
|
||||||
|
or:
|
||||||
|
- voteCount: greater than 1000
|
||||||
|
- score: above 7
|
||||||
|
`).not.toEqual(new NotPredicate([new VoteCountPredicate({ operator: 'gt', threshold: 1000 }), new ScorePredicate({ operator: 'gt', threshold: 7 })]));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -15,6 +15,10 @@ import { RuntimePredicate } from '@core/lib/rules/predicate/runtime';
|
|||||||
import { OriginalLanguagePredicate } from '@core/lib/rules/predicate/originalLanguage';
|
import { OriginalLanguagePredicate } from '@core/lib/rules/predicate/originalLanguage';
|
||||||
import { StatusPredicate } from '@core/lib/rules/predicate/status';
|
import { StatusPredicate } from '@core/lib/rules/predicate/status';
|
||||||
import { fromHumanReadableDuration } from '@core/lib/rules/predicate/time';
|
import { fromHumanReadableDuration } from '@core/lib/rules/predicate/time';
|
||||||
|
import { ProductionCompanyPredicate } from '@core/lib/rules/predicate/productionCompany';
|
||||||
|
import { NotPredicate } from '@core/lib/rules/predicate/not';
|
||||||
|
import { ReleasedPredicate } from '@core/lib/rules/predicate/released';
|
||||||
|
import { WatchprovidersPredicate } from '@core/lib/rules/predicate/watchproviders';
|
||||||
|
|
||||||
const movie = movieJson as MovieDetails;
|
const movie = movieJson as MovieDetails;
|
||||||
const testRule = (predicate: Predicate | Predicate[]) => new Rule('test rule', Array.isArray(predicate) ? predicate : [predicate], 'accept');
|
const testRule = (predicate: Predicate | Predicate[]) => new Rule('test rule', Array.isArray(predicate) ? predicate : [predicate], 'accept');
|
||||||
@@ -307,3 +311,134 @@ describe('status predicate', () => {
|
|||||||
assertRuleDoesntMatch(testRule(new StatusPredicate({ terms: ['canceled', 'post production'] })), movie);
|
assertRuleDoesntMatch(testRule(new StatusPredicate({ terms: ['canceled', 'post production'] })), movie);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('productionCompany predicate', () => {
|
||||||
|
it('should match', async () => {
|
||||||
|
assertRuleMatches(testRule(new ProductionCompanyPredicate({ terms: ['20th Century Fox'] })), movie);
|
||||||
|
assertRuleMatches(testRule(new ProductionCompanyPredicate({ terms: ['20th Century Fox', 'Bobcat studios'] })), movie);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not match', async () => {
|
||||||
|
assertRuleDoesntMatch(testRule(new ProductionCompanyPredicate({ terms: ['Bobcat studios'] })), movie);
|
||||||
|
assertRuleDoesntMatch(testRule(new ProductionCompanyPredicate({ terms: ['Bobcat studios', '11th Century Fox'] })), movie);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('not predicate', () => {
|
||||||
|
it('should match', async () => {
|
||||||
|
assertRuleMatches(testRule(new NotPredicate([new RuntimePredicate({ operator: 'gt', threshold: 3 * 60 * 60 })])), movie);
|
||||||
|
assertRuleMatches(testRule(new NotPredicate([new RuntimePredicate({ operator: 'lt', threshold: 2 * 60 * 60 })])), movie);
|
||||||
|
assertRuleMatches(
|
||||||
|
testRule(
|
||||||
|
new NotPredicate([
|
||||||
|
new RuntimePredicate({ operator: 'lt', threshold: 2 * 60 * 60 }),
|
||||||
|
new ProductionCompanyPredicate({ terms: ['12th Century Fox'] }),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
movie
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not match', async () => {
|
||||||
|
assertRuleDoesntMatch(testRule(new NotPredicate([new RuntimePredicate({ operator: 'lt', threshold: 3 * 60 * 60 })])), movie);
|
||||||
|
assertRuleDoesntMatch(testRule(new NotPredicate([new RuntimePredicate({ operator: 'gt', threshold: 2 * 60 * 60 })])), movie);
|
||||||
|
assertRuleDoesntMatch(
|
||||||
|
testRule(
|
||||||
|
new NotPredicate([
|
||||||
|
new RuntimePredicate({ operator: 'lt', threshold: 2 * 60 * 60 }),
|
||||||
|
new ProductionCompanyPredicate({ terms: ['20th Century Fox'] }),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
movie
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('or predicate', () => {
|
||||||
|
it('should match', async () => {
|
||||||
|
assertRuleMatches(
|
||||||
|
testRule(
|
||||||
|
new OrPredicate([
|
||||||
|
new StatusPredicate({ terms: ['released'] }),
|
||||||
|
new OriginalLanguagePredicate({ terms: ['en'] }),
|
||||||
|
new CastPredicate({ terms: ['Sigourney Weaver', 'Jessica Alba'], excludeVoice: false }),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
movie
|
||||||
|
);
|
||||||
|
|
||||||
|
assertRuleMatches(
|
||||||
|
testRule(
|
||||||
|
new OrPredicate([
|
||||||
|
new StatusPredicate({ terms: ['canceled'] }),
|
||||||
|
new OriginalLanguagePredicate({ terms: ['de'] }),
|
||||||
|
new CastPredicate({ terms: ['Sigourney Weaver', 'Jessica Alba'], excludeVoice: false }),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
movie
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not match', async () => {
|
||||||
|
assertRuleDoesntMatch(
|
||||||
|
testRule(
|
||||||
|
new OrPredicate([
|
||||||
|
new StatusPredicate({ terms: ['canceled'] }),
|
||||||
|
new OriginalLanguagePredicate({ terms: ['de'] }),
|
||||||
|
new CastPredicate({ terms: ['Jessica Alba'], excludeVoice: false }),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
movie
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('and predicate', () => {
|
||||||
|
it('should match', async () => {
|
||||||
|
assertRuleMatches(
|
||||||
|
testRule(
|
||||||
|
new AndPredicate([
|
||||||
|
new StatusPredicate({ terms: ['released'] }),
|
||||||
|
new OriginalLanguagePredicate({ terms: ['en'] }),
|
||||||
|
new CastPredicate({ terms: ['Sigourney Weaver', 'Jessica Alba'], excludeVoice: false }),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
movie
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not match', async () => {
|
||||||
|
assertRuleDoesntMatch(
|
||||||
|
testRule(
|
||||||
|
new AndPredicate([
|
||||||
|
new StatusPredicate({ terms: ['canceled'] }), // Movie is not cancelled
|
||||||
|
new OriginalLanguagePredicate({ terms: ['en'] }),
|
||||||
|
new CastPredicate({ terms: ['Sigourney Weaver', 'Jessica Alba'], excludeVoice: false }),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
movie
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('released predicate', () => {
|
||||||
|
it('should match', async () => {
|
||||||
|
assertRuleMatches(testRule(new ReleasedPredicate({ value: true })), movie);
|
||||||
|
// assertRuleMatches(testRule(new ReleasedPredicate({ value: true })), { ...movie, status: 'test' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not match', async () => {
|
||||||
|
assertRuleDoesntMatch(testRule(new ReleasedPredicate({ value: false })), movie);
|
||||||
|
// assertRuleDoesntMatch(testRule(new ReleasedPredicate({ value: false })), { ...movie, status: 'test' });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('watchProviders predicate', () => {
|
||||||
|
it('should match', async () => {
|
||||||
|
assertRuleMatches(testRule(new WatchprovidersPredicate({ region: 'CA', terms: ['Disney Plus', 'Crave'] })), movie);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not match', async () => {
|
||||||
|
assertRuleDoesntMatch(testRule(new WatchprovidersPredicate({ region: 'CA', terms: ['Platform 1', 'Platform 2'] })), movie);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import { AndFilterOptions } from '@core/lib/rules/interfaces';
|
|||||||
import type { PredicateFactoryClass } from '@core/lib/rules/factory';
|
import type { PredicateFactoryClass } from '@core/lib/rules/factory';
|
||||||
|
|
||||||
export class AndPredicate extends GroupPredicate {
|
export class AndPredicate extends GroupPredicate {
|
||||||
|
private readonly type: string = 'and';
|
||||||
|
|
||||||
constructor(children: Predicate[]) {
|
constructor(children: Predicate[]) {
|
||||||
super(children);
|
super(children);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ import { NotFilterOptions } from '@core/lib/rules/interfaces';
|
|||||||
import type { PredicateFactoryClass } from '@core/lib/rules/factory';
|
import type { PredicateFactoryClass } from '@core/lib/rules/factory';
|
||||||
|
|
||||||
export class NotPredicate extends GroupPredicate {
|
export class NotPredicate extends GroupPredicate {
|
||||||
|
private readonly type: string = 'not';
|
||||||
|
|
||||||
constructor(children: Predicate[]) {
|
constructor(children: Predicate[]) {
|
||||||
super(children);
|
super(children);
|
||||||
}
|
}
|
||||||
|
|
||||||
matches(movie: MovieDetails): boolean {
|
matches(movie: MovieDetails): boolean {
|
||||||
return !this.children.every((p) => p.matches(movie));
|
return this.children.every((p) => !p.matches(movie));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import { OrFilterOptions } from '@core/lib/rules/interfaces';
|
|||||||
import type { PredicateFactoryClass } from '@core/lib/rules/factory';
|
import type { PredicateFactoryClass } from '@core/lib/rules/factory';
|
||||||
|
|
||||||
export class OrPredicate extends GroupPredicate {
|
export class OrPredicate extends GroupPredicate {
|
||||||
|
private readonly type: string = 'or';
|
||||||
|
|
||||||
constructor(children: Predicate[]) {
|
constructor(children: Predicate[]) {
|
||||||
super(children);
|
super(children);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export class WatchprovidersPredicate extends TagsPredicate {
|
|||||||
}
|
}
|
||||||
const tags: string[] = [];
|
const tags: string[] = [];
|
||||||
for (const region of movie.watchProviders) {
|
for (const region of movie.watchProviders) {
|
||||||
if (region.iso_3166_1.toLowerCase() === this.region) {
|
if (region.iso_3166_1.toLowerCase() === this.region.toLowerCase()) {
|
||||||
if (region.flatrate) {
|
if (region.flatrate) {
|
||||||
tags.push(...region.flatrate.map((r) => r.name));
|
tags.push(...region.flatrate.map((r) => r.name));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user