jenesius-vue-form
Version:
Heavy form system for Vue.js
316 lines (255 loc) • 10.9 kB
text/typescript
import Form from "../../../src/classes/Form";
import wait from "../../wait";
describe("Form read/save", () => {
/**
* READ
* */
test("Simple read", async () => {
const form = new Form()
const mockRead = jest.fn(v => v);
form.read = () => new Promise(resolve => setTimeout(resolve.bind(null, {name: "Jack"}), 100));
form.on(Form.EVENT_READ, mockRead)
const promise = form.read();
await wait();
expect(form.wait).toBe(true);
await wait(60);
expect(form.wait).toBe(true);
await promise;
expect(form.wait).toBe(false);
expect(mockRead.mock.calls.length).toBe(1);
expect(mockRead.mock.results[0].value).toEqual({name: "Jack"});
})
test("Reading with child item", async () => {
const form = new Form();
const child = new Form({name: "address"});
form.subscribe(child);
const mockChild = jest.fn(v => v);
const mockParent = jest.fn(v => v);
child.read = () => new Promise(resolve => setTimeout(resolve.bind(null, {city: "Mogilev"}), 20));
form.read = () => new Promise(resolve => setTimeout(resolve.bind(null,{username: "Jenesius", age: 24}), 100));
form.on(Form.EVENT_READ, mockParent)
child.on(Form.EVENT_READ, mockChild)
const promise = form.read()
await wait(4)
expect(child.wait).toBe(true)
expect(form.wait).toBe(true)
await wait(40);
expect(child.wait).toBe(false)
expect(form.wait).toBe(true)
await promise;
expect(child.wait).toBe(false)
expect(form.wait).toBe(false)
expect(mockParent.mock.results.length).toBe(1)
expect(mockParent.mock.results[0].value).toEqual({
username: "Jenesius", age: 24
})
expect(mockChild.mock.results.length).toBe(1)
expect(mockChild.mock.results[0].value).toEqual({
city: "Mogilev"
})
})
test("Wait in parent should be true until child stay in wait status", async () => {
const form = new Form();
const child = new Form({
name: "address"
});
form.subscribe(child);
child.read = () => wait(100);
const promise = form.read();
await wait(10);
expect(form.wait).toBe(true)
expect(child.wait).toBe(true);
await promise;
expect(form.wait).toBe(false)
expect(child.wait).toBe(false)
})
test("Rejecting request should turn wait to false", async () => {
const form = new Form();
form.read = () =>new Promise((resolve, reject) => setTimeout(reject.bind(null, new Error("Yps")), 20));
const promise = form.read();
await wait(1);
expect(form.wait).toBe(true);
await expect(promise).rejects.toEqual(new Error('Yps'))
expect(form.wait).toBe(false)
})
test("Rejecting request at child should turn wait to false", async () => {
const form = new Form();
const child = new Form({name: "address"});
form.subscribe(child)
child.read = () =>new Promise((resolve, reject) => setTimeout(reject.bind(null, new Error("Test")), 20));
const promise = form.read();
await wait(5);
expect(form.wait).toBe(true);
expect(child.wait).toBe(true);
await expect(promise).rejects.toEqual(new Error("Test"))
expect(form.wait).toBe(false)
expect(child.wait).toBe(false)
})
test("Child wait should be set to true firstly than parent wait", async () => {
const form = new Form();
const child = new Form({name: "address"});
form.subscribe(child)
child.read = () =>new Promise((resolve, reject) => setTimeout(resolve, 20));
form.read = () =>new Promise((resolve, reject) => setTimeout(resolve, 100));
const promise = form.read();
await wait(5);
expect(form.wait).toBe(true);
expect(child.wait).toBe(true);
await wait(50);
expect(child.wait).toBe(false);
expect(form.wait).toBe(true);
await promise;
expect(form.wait).toBe(false)
expect(child.wait).toBe(false)
})
/**
* SAVE
* */
test("Simple save", async () => {
const form = new Form()
const mockSave = jest.fn(v => v);
form.save = () => new Promise(resolve => setTimeout(resolve.bind(null, {version: 4}), 100));
form.on(Form.EVENT_SAVE, mockSave)
const promise = form.save();
await wait();
expect(form.wait).toBe(true);
await wait(10);
expect(form.wait).toBe(true);
await promise;
expect(form.wait).toBe(false);
expect(mockSave.mock.calls.length).toBe(1);
expect(mockSave.mock.results[0].value).toEqual({version: 4});
})
test("Changes must be clean after save was success, and values should be mixed with changes", async () => {
const form = new Form();
form.change({
name: "Jack"
})
await form.save();
expect(form.values).toEqual({
name: "Jack"
})
expect(form.changes).toEqual({})
expect(form.changed).toBe(false)
})
test("Saving with child item", async () => {
const form = new Form();
const child = new Form({name: "address"});
form.subscribe(child);
const mockChild = jest.fn(v => v);
const mockParent = jest.fn(v => v);
child.save = () => new Promise(resolve => setTimeout(resolve.bind(null, {version: 1}), 20));
form.save = () => new Promise(resolve => setTimeout(resolve.bind(null,{version: 4}), 100));
form.on(Form.EVENT_SAVE, mockParent)
child.on(Form.EVENT_SAVE, mockChild)
const promise = form.save()
await wait(4)
expect(child.wait).toBe(true)
expect(form.wait).toBe(true)
await wait(40);
expect(child.wait).toBe(false)
expect(form.wait).toBe(true)
await promise;
expect(child.wait).toBe(false)
expect(form.wait).toBe(false)
expect(mockParent.mock.results.length).toBe(1)
expect(mockParent.mock.results[0].value).toEqual({
version: 4
})
expect(mockChild.mock.results.length).toBe(1)
expect(mockChild.mock.results[0].value).toEqual({
version: 1
})
})
test("Parent should stay in wait status until child status in wait", async () => {
const form = new Form();
const child = new Form({
name: "address"
});
form.subscribe(child);
child.save = () => wait(100);
const promise = form.save();
await wait(10);
expect(form.wait).toBe(true)
expect(child.wait).toBe(true);
await promise;
expect(form.wait).toBe(false)
expect(child.wait).toBe(false)
})
test("Rejecting request until save until save should turn wait to false", async () => {
const form = new Form();
form.save = () =>new Promise((resolve, reject) => setTimeout(reject.bind(null, new Error('save reject')), 20));
const promise = form.save();
await wait(1);
expect(form.wait).toBe(true);
await expect(promise).rejects.toEqual(new Error('save reject'))
expect(form.wait).toBe(false)
})
test("Rejecting request until save at child should turn wait to false", async () => {
const form = new Form();
const child = new Form({name: "address"});
form.subscribe(child)
// Reject request
child.save = () => new Promise((resolve, reject) => setTimeout(reject.bind(null, "Error from Child"), 20));
// Save execution
const promise = form.save();
await wait(1);
expect(form.wait).toBe(true);
expect(child.wait).toBe(true);
// Await until all save methods will be executed.
await expect(promise).rejects.toBe("Error from Child");
expect(form.wait).toBe(false)
expect(child.wait).toBe(false)
})
test("Rejecting request not execute revert function", async () => {
const form = new Form();
form.change({
name: "Jack"
})
form.save = () =>new Promise((resolve, reject) => setTimeout(reject, 20));
await expect(form.save()).rejects.toBe(undefined);
expect(form.changes).toEqual({
name: "Jack"
})
expect(form.changed).toBe(true)
})
/**
* Тест используется в том случае, когда дочерний элемент является обособленным от родителя. В таком случае он имеет
* свой набор значений, которым пользуется самостоятельно.
* */
test("Rejecting request at child will not execute child's revert function", async () => {
const form = new Form();
const child = new Form({name: "test"});
form.change({
name: "Jack"
})
form.subscribe(child);
// Reject request
child.save = () => new Promise((resolve, reject) => setTimeout(reject.bind(null, "Error from Child"), 20));
// Save execution
await expect(form.save()).rejects.toBe("Error from Child")
expect(form.changes).toEqual({name: "Jack"})
})
test("Объект сохранений должен доходить до родительского, если в дочернем нет save", async () => {
const form = new Form();
const child = new Form({
name: "address"
})
form.subscribe(child);
const mockSave = jest.fn(() => {
return JSON.parse(JSON.stringify(form.changes))
});
child.change({
x: 1,
y: 2
})
form.save = mockSave
await form.save();
expect(mockSave.mock.results.length).toBe(1);
expect(mockSave.mock.results[0].value).toEqual({
address: {
x: 1, y: 2
}
});
})
})