mirror of
https://github.com/bitwarden/browser.git
synced 2024-12-01 13:13:36 +01:00
a4fba0e1c5
* Switch to jest * Fix jslib-angular package name * Make angular test project * Split up tests by jslib project * Remove obsolete node test script * Use legacy deps with jest-preset-angular * Move web tests to common * Remove build from pipeline This was only being used because we were not using ts runners. We are now, so build is unnecessary
111 lines
2.6 KiB
TypeScript
111 lines
2.6 KiB
TypeScript
import { sequentialize } from "jslib-common/misc/sequentialize";
|
|
import { throttle } from "jslib-common/misc/throttle";
|
|
|
|
describe("throttle decorator", () => {
|
|
it("should call the function once at a time", async () => {
|
|
const foo = new Foo();
|
|
const promises = [];
|
|
for (let i = 0; i < 10; i++) {
|
|
promises.push(foo.bar(1));
|
|
}
|
|
await Promise.all(promises);
|
|
|
|
expect(foo.calls).toBe(10);
|
|
});
|
|
|
|
it("should call the function once at a time for each object", async () => {
|
|
const foo = new Foo();
|
|
const foo2 = new Foo();
|
|
const promises = [];
|
|
for (let i = 0; i < 10; i++) {
|
|
promises.push(foo.bar(1));
|
|
promises.push(foo2.bar(1));
|
|
}
|
|
await Promise.all(promises);
|
|
|
|
expect(foo.calls).toBe(10);
|
|
expect(foo2.calls).toBe(10);
|
|
});
|
|
|
|
it("should call the function limit at a time", async () => {
|
|
const foo = new Foo();
|
|
const promises = [];
|
|
for (let i = 0; i < 10; i++) {
|
|
promises.push(foo.baz(1));
|
|
}
|
|
await Promise.all(promises);
|
|
|
|
expect(foo.calls).toBe(10);
|
|
});
|
|
|
|
it("should call the function limit at a time for each object", async () => {
|
|
const foo = new Foo();
|
|
const foo2 = new Foo();
|
|
const promises = [];
|
|
for (let i = 0; i < 10; i++) {
|
|
promises.push(foo.baz(1));
|
|
promises.push(foo2.baz(1));
|
|
}
|
|
await Promise.all(promises);
|
|
|
|
expect(foo.calls).toBe(10);
|
|
expect(foo2.calls).toBe(10);
|
|
});
|
|
|
|
it("should work together with sequentialize", async () => {
|
|
const foo = new Foo();
|
|
const promises = [];
|
|
for (let i = 0; i < 10; i++) {
|
|
promises.push(foo.qux(Math.floor(i / 2) * 2));
|
|
}
|
|
await Promise.all(promises);
|
|
|
|
expect(foo.calls).toBe(5);
|
|
});
|
|
});
|
|
|
|
class Foo {
|
|
calls = 0;
|
|
inflight = 0;
|
|
|
|
@throttle(1, () => "bar")
|
|
bar(a: number) {
|
|
this.calls++;
|
|
this.inflight++;
|
|
return new Promise((res) => {
|
|
setTimeout(() => {
|
|
expect(this.inflight).toBe(1);
|
|
this.inflight--;
|
|
res(a * 2);
|
|
}, Math.random() * 10);
|
|
});
|
|
}
|
|
|
|
@throttle(5, () => "baz")
|
|
baz(a: number) {
|
|
this.calls++;
|
|
this.inflight++;
|
|
return new Promise((res) => {
|
|
setTimeout(() => {
|
|
expect(this.inflight).toBeLessThanOrEqual(5);
|
|
this.inflight--;
|
|
res(a * 3);
|
|
}, Math.random() * 10);
|
|
});
|
|
}
|
|
|
|
@sequentialize((args) => "qux" + args[0])
|
|
@throttle(1, () => "qux")
|
|
qux(a: number) {
|
|
this.calls++;
|
|
this.inflight++;
|
|
return new Promise((res) => {
|
|
setTimeout(() => {
|
|
expect(this.inflight).toBe(1);
|
|
this.inflight--;
|
|
res(a * 3);
|
|
}, Math.random() * 10);
|
|
});
|
|
}
|
|
}
|