mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
7.4 KiB
225 lines
7.4 KiB
/*
|
|
* Squidex Headless CMS
|
|
*
|
|
* @license
|
|
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
|
|
*/
|
|
|
|
import { DialogService, RulesDto, RulesService, versioned } from '@app/shared/internal';
|
|
import { firstValueFrom, of, throwError } from 'rxjs';
|
|
import { onErrorResumeNext } from 'rxjs/operators';
|
|
import { IMock, It, Mock, Times } from 'typemoq';
|
|
import { RuleDto } from './../services/rules.service';
|
|
import { createRule } from './../services/rules.service.spec';
|
|
import { RulesState } from './rules.state';
|
|
import { TestValues } from './_test-helpers';
|
|
|
|
describe('RulesState', () => {
|
|
const {
|
|
app,
|
|
appsState,
|
|
newVersion,
|
|
} = TestValues;
|
|
|
|
const rule1 = createRule(1);
|
|
const rule2 = createRule(2);
|
|
|
|
const newRule = createRule(3);
|
|
|
|
let dialogs: IMock<DialogService>;
|
|
let rulesService: IMock<RulesService>;
|
|
let rulesState: RulesState;
|
|
|
|
beforeEach(() => {
|
|
dialogs = Mock.ofType<DialogService>();
|
|
|
|
rulesService = Mock.ofType<RulesService>();
|
|
rulesState = new RulesState(appsState.object, dialogs.object, rulesService.object);
|
|
});
|
|
|
|
afterEach(() => {
|
|
rulesService.verifyAll();
|
|
});
|
|
|
|
describe('Loading', () => {
|
|
it('should load rules', () => {
|
|
rulesService.setup(x => x.getRules(app))
|
|
.returns(() => of(new RulesDto([rule1, rule2], {}, rule1.id))).verifiable();
|
|
|
|
rulesState.load().subscribe();
|
|
|
|
expect(rulesState.snapshot.isLoaded).toBeTruthy();
|
|
expect(rulesState.snapshot.isLoading).toBeFalsy();
|
|
expect(rulesState.snapshot.rules).toEqual([rule1, rule2]);
|
|
|
|
let ruleRunning: RuleDto | undefined;
|
|
|
|
rulesState.runningRule.subscribe(result => {
|
|
ruleRunning = result;
|
|
});
|
|
|
|
expect(ruleRunning).toBe(rule1);
|
|
expect(rulesState.snapshot.runningRuleId).toBe(rule1.id);
|
|
|
|
dialogs.verify(x => x.notifyInfo(It.isAnyString()), Times.never());
|
|
});
|
|
|
|
it('should reset loading state if loading failed', () => {
|
|
rulesService.setup(x => x.getRules(app))
|
|
.returns(() => throwError(() => 'Service Error'));
|
|
|
|
rulesState.load().pipe(onErrorResumeNext()).subscribe();
|
|
|
|
expect(rulesState.snapshot.isLoading).toBeFalsy();
|
|
});
|
|
|
|
it('should show notification on load if reload is true', () => {
|
|
rulesService.setup(x => x.getRules(app))
|
|
.returns(() => of(new RulesDto([rule1, rule2]))).verifiable();
|
|
|
|
rulesState.load(true).subscribe();
|
|
|
|
expect().nothing();
|
|
|
|
dialogs.verify(x => x.notifyInfo(It.isAnyString()), Times.once());
|
|
});
|
|
});
|
|
|
|
describe('Updates', () => {
|
|
beforeEach(() => {
|
|
rulesService.setup(x => x.getRules(app))
|
|
.returns(() => of(new RulesDto([rule1, rule2]))).verifiable();
|
|
|
|
rulesState.load().subscribe();
|
|
});
|
|
|
|
it('should return rule on select and not load if already loaded', async () => {
|
|
const ruleSelected = await firstValueFrom(rulesState.select(rule1.id));
|
|
|
|
expect(ruleSelected).toEqual(rule1);
|
|
expect(rulesState.snapshot.selectedRule).toEqual(rule1);
|
|
});
|
|
|
|
it('should return null on select if unselecting rule', async () => {
|
|
const ruleSelected = await firstValueFrom(rulesState.select(null));
|
|
|
|
expect(ruleSelected).toBeNull();
|
|
expect(rulesState.snapshot.selectedRule).toBeNull();
|
|
});
|
|
|
|
it('should add rule to snapshot if created', () => {
|
|
const request = { trigger: { triggerType: 'trigger3', value: 3 }, action: { actionType: 'action3', value: 1 } };
|
|
|
|
rulesService.setup(x => x.postRule(app, request))
|
|
.returns(() => of(newRule));
|
|
|
|
rulesState.create(request).subscribe();
|
|
|
|
expect(rulesState.snapshot.rules).toEqual([rule1, rule2, newRule]);
|
|
});
|
|
|
|
it('should update rule if updated', () => {
|
|
const request = {};
|
|
|
|
const updated = createRule(1, '_new');
|
|
|
|
rulesService.setup(x => x.putRule(app, rule1, request, rule1.version))
|
|
.returns(() => of(updated)).verifiable();
|
|
|
|
rulesState.update(rule1, request).subscribe();
|
|
|
|
expect(rulesState.snapshot.rules).toEqual([updated, rule2]);
|
|
});
|
|
|
|
it('should not update rule in snapshot if triggered', () => {
|
|
rulesService.setup(x => x.triggerRule(app, rule1))
|
|
.returns(() => of(true)).verifiable();
|
|
|
|
rulesState.trigger(rule1).subscribe();
|
|
|
|
expect(rulesState.snapshot.rules).toEqual([rule1, rule2]);
|
|
});
|
|
|
|
it('should not update rule in snapshot if running', () => {
|
|
rulesService.setup(x => x.runRule(app, rule1))
|
|
.returns(() => of(true)).verifiable();
|
|
|
|
rulesState.run(rule1).subscribe();
|
|
|
|
expect(rulesState.snapshot.rules).toEqual([rule1, rule2]);
|
|
});
|
|
|
|
it('should not update rule in snapshot if running from snapshots', () => {
|
|
rulesService.setup(x => x.runRuleFromSnapshots(app, rule1))
|
|
.returns(() => of(true)).verifiable();
|
|
|
|
rulesState.runFromSnapshots(rule1).subscribe();
|
|
|
|
expect(rulesState.snapshot.rules).toEqual([rule1, rule2]);
|
|
});
|
|
|
|
it('should remove rule from snapshot if deleted', () => {
|
|
rulesService.setup(x => x.deleteRule(app, rule1, rule1.version))
|
|
.returns(() => of(versioned(newVersion))).verifiable();
|
|
|
|
rulesState.delete(rule1).subscribe();
|
|
|
|
expect(rulesState.snapshot.rules).toEqual([rule2]);
|
|
});
|
|
|
|
it('should invoke rule service if run is cancelled', () => {
|
|
rulesService.setup(x => x.runCancel(app))
|
|
.returns(() => of(true)).verifiable();
|
|
|
|
rulesState.runCancel().subscribe();
|
|
|
|
expect().nothing();
|
|
});
|
|
});
|
|
|
|
describe('Selection', () => {
|
|
beforeEach(() => {
|
|
rulesService.setup(x => x.getRules(app))
|
|
.returns(() => of(new RulesDto([rule1, rule2]))).verifiable(Times.atLeastOnce());
|
|
|
|
rulesState.load().subscribe();
|
|
rulesState.select(rule2.id).subscribe();
|
|
});
|
|
|
|
it('should update selected rule if reloaded', () => {
|
|
const newRules = [
|
|
createRule(1, '_new'),
|
|
createRule(2, '_new'),
|
|
];
|
|
|
|
rulesService.setup(x => x.getRules(app))
|
|
.returns(() => of(new RulesDto(newRules)));
|
|
|
|
rulesState.load().subscribe();
|
|
|
|
expect(rulesState.snapshot.selectedRule).toEqual(newRules[1]);
|
|
});
|
|
|
|
it('should update selected rule if updated', () => {
|
|
const request = {};
|
|
|
|
const updated = createRule(2, '_new');
|
|
|
|
rulesService.setup(x => x.putRule(app, rule2, request, rule2.version))
|
|
.returns(() => of(updated)).verifiable();
|
|
|
|
rulesState.update(rule2, request).subscribe();
|
|
|
|
expect(rulesState.snapshot.selectedRule).toEqual(updated);
|
|
});
|
|
|
|
it('should remove selected rule from snapshot if deleted', () => {
|
|
rulesService.setup(x => x.deleteRule(app, rule2, rule2.version))
|
|
.returns(() => of(versioned(newVersion))).verifiable();
|
|
|
|
rulesState.delete(rule2).subscribe();
|
|
|
|
expect(rulesState.snapshot.selectedRule).toBeNull();
|
|
});
|
|
});
|
|
});
|
|
|