tests: use node:test (#210)
All checks were successful
Publish latest version / build (push) Successful in 2m11s
All checks were successful
Publish latest version / build (push) Successful in 2m11s
Close #201 Tests run much faster and we don't need as much as libs Reviewed-on: #210 Co-authored-by: Mylloon <kennel.anri@tutanota.com> Co-committed-by: Mylloon <kennel.anri@tutanota.com>
This commit is contained in:
parent
884d62ceed
commit
a790ddf377
15 changed files with 930 additions and 3581 deletions
|
@ -293,11 +293,14 @@ Il est souhaité d'écrire des tests quand cela est possible.
|
|||
```ts
|
||||
import { fnReturnsTrue } from "../src/utils/file";
|
||||
|
||||
import { describe, it } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
describe("test name", () => {
|
||||
{
|
||||
const name = "to be tested";
|
||||
test(name, () => {
|
||||
expect(fnReturnsTrue() /* function to test */).toBe(true /* expected result */);
|
||||
it(name, () => {
|
||||
assert.strictEqual(fnReturnsTrue() /* function to test */, true /* expected result */);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
3727
package-lock.json
generated
3727
package-lock.json
generated
File diff suppressed because it is too large
Load diff
11
package.json
11
package.json
|
@ -10,7 +10,7 @@
|
|||
"lint": "npx eslint src",
|
||||
"format-check": "npx prettier --check src",
|
||||
"format-write": "npx prettier --write src",
|
||||
"test": "npx jest"
|
||||
"test": "node --import tsx --test **/*.test.ts"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -31,16 +31,11 @@
|
|||
"uuid": "^11.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "~29.5.14",
|
||||
"@typescript-eslint/eslint-plugin": "~8.17.0",
|
||||
"@typescript-eslint/parser": "~8.17.0",
|
||||
"dotenv": "~16.4.7",
|
||||
"jest": "~29.7.0",
|
||||
"prettier-eslint": "~16.3.0",
|
||||
"ts-jest": "~29.2.5",
|
||||
"ts-node-dev": "~2.0.0"
|
||||
},
|
||||
"jest": {
|
||||
"preset": "ts-jest"
|
||||
"ts-node-dev": "~2.0.0",
|
||||
"tsx": "^4.19.2"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
import "../../modules/string";
|
||||
|
||||
describe("Capitalize", () => {
|
||||
{
|
||||
const name = "test";
|
||||
test(name, () => {
|
||||
expect(name.capitalize()).toBe("Test");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "MACHIN";
|
||||
test(name, () => {
|
||||
expect(name.capitalize()).toBe("MACHIN");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "tRUC";
|
||||
test(name, () => {
|
||||
expect(name.capitalize()).toBe("TRUC");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "Super";
|
||||
test(name, () => {
|
||||
expect(name.capitalize()).toBe("Super");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "";
|
||||
test(name, () => {
|
||||
expect(name.capitalize()).toBe("");
|
||||
});
|
||||
}
|
||||
});
|
|
@ -1,28 +0,0 @@
|
|||
import { OptionReminder, splitTime } from "../../../utils/commands/reminder";
|
||||
|
||||
describe("Time splitter", () => {
|
||||
{
|
||||
const name = "";
|
||||
test(name, () => {
|
||||
expect(splitTime(name)).toStrictEqual({ option: OptionReminder.Nothing, time: "" });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "2m@p";
|
||||
test(name, () => {
|
||||
expect(splitTime(name)).toStrictEqual({ option: OptionReminder.DirectMessage, time: "2m" });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "41@";
|
||||
test(name, () => {
|
||||
expect(splitTime(name)).toStrictEqual({ option: OptionReminder.Mention, time: "41" });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "0P";
|
||||
test(name, () => {
|
||||
expect(splitTime(name)).toStrictEqual({ option: OptionReminder.DirectMessage, time: "0" });
|
||||
});
|
||||
}
|
||||
});
|
|
@ -1,151 +0,0 @@
|
|||
import {
|
||||
cleanCodeBlock,
|
||||
emojiPng,
|
||||
isImage,
|
||||
removeExtension,
|
||||
splitFilenameExtensions,
|
||||
} from "../../utils/misc";
|
||||
|
||||
describe("Filename splitter", () => {
|
||||
{
|
||||
const name = "test.js";
|
||||
test(name, () => {
|
||||
expect(splitFilenameExtensions(name)).toStrictEqual({ file: "test", ext: "js" });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = ".env";
|
||||
test(name, () => {
|
||||
expect(splitFilenameExtensions(name)).toStrictEqual({ file: ".env", ext: undefined });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = ".env.test";
|
||||
test(name, () => {
|
||||
expect(splitFilenameExtensions(name)).toStrictEqual({
|
||||
file: ".env",
|
||||
ext: "test",
|
||||
});
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "file.test.js";
|
||||
test(name, () => {
|
||||
expect(splitFilenameExtensions(name)).toStrictEqual({ file: "file.test", ext: "js" });
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Extension remover", () => {
|
||||
{
|
||||
const name = "test.js";
|
||||
test(name, () => {
|
||||
expect(removeExtension(name)).toBe("test");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = ".env";
|
||||
test(name, () => {
|
||||
expect(removeExtension(name)).toBe(".env");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = ".env.test";
|
||||
test(name, () => {
|
||||
expect(removeExtension(name)).toBe(".env");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "file.test.js";
|
||||
test(name, () => {
|
||||
expect(removeExtension(name)).toBe("file.test");
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Image checker", () => {
|
||||
{
|
||||
const name = "image.Png";
|
||||
test(name, () => {
|
||||
expect(isImage(name)).toBe(true);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.jpeg";
|
||||
test(name, () => {
|
||||
expect(isImage(name)).toBe(true);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.wav";
|
||||
test(name, () => {
|
||||
expect(isImage(name)).toBe(false);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.jpg";
|
||||
test(name, () => {
|
||||
expect(isImage(name)).toBe(true);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.webP";
|
||||
test(name, () => {
|
||||
expect(isImage(name)).toBe(true);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.GIF";
|
||||
test(name, () => {
|
||||
expect(isImage(name)).toBe(true);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Code block cleaner", () => {
|
||||
{
|
||||
const name = "salut";
|
||||
test(name, () => {
|
||||
expect(cleanCodeBlock(name)).toBe("`salut`");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "<@158260864623968257> ça va ?";
|
||||
test(name, () => {
|
||||
expect(cleanCodeBlock(name)).toBe("<@158260864623968257>` ça va ?`");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "t'as vu la vidéo ? https://youtu.be/dQw4w9WgXcQ";
|
||||
test(name, () => {
|
||||
expect(cleanCodeBlock(name)).toBe("`t'as vu la vidéo ? `https://youtu.be/dQw4w9WgXcQ");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "t'as vu la vidéo ? https://youtu.be/dQw4w9WgXcQ elle est cool en vrai tqt";
|
||||
test(name, () => {
|
||||
expect(cleanCodeBlock(name)).toBe(
|
||||
"`t'as vu la vidéo ? `https://youtu.be/dQw4w9WgXcQ` elle est cool en vrai tqt`",
|
||||
);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Emoji to link", () => {
|
||||
{
|
||||
const name = "☺️";
|
||||
test(name, () => {
|
||||
expect(emojiPng(name)).toBe(
|
||||
"https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/72x72/263a.png",
|
||||
);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "🍕";
|
||||
test(name, () => {
|
||||
expect(emojiPng(name)).toBe(
|
||||
"https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/72x72/1f355.png",
|
||||
);
|
||||
});
|
||||
}
|
||||
});
|
|
@ -1,26 +0,0 @@
|
|||
import { RegexC, RegExpFlags } from "../../utils/regex";
|
||||
|
||||
describe("Regex flags", () => {
|
||||
test("One parameter", () => {
|
||||
const regex = RegexC("", RegExpFlags.Global);
|
||||
expect(regex.global).toBeTruthy();
|
||||
});
|
||||
|
||||
test("All parameters", () => {
|
||||
const regex = RegexC(
|
||||
"",
|
||||
RegExpFlags.Global |
|
||||
RegExpFlags.MultiLine |
|
||||
RegExpFlags.Insensitive |
|
||||
RegExpFlags.Sticky |
|
||||
RegExpFlags.Unicode |
|
||||
RegExpFlags.SingleLine,
|
||||
);
|
||||
expect(regex.global).toBeTruthy();
|
||||
expect(regex.multiline).toBeTruthy();
|
||||
expect(regex.ignoreCase).toBeTruthy();
|
||||
expect(regex.sticky).toBeTruthy();
|
||||
expect(regex.unicode).toBeTruthy();
|
||||
expect(regex.dotAll).toBeTruthy();
|
||||
});
|
||||
});
|
|
@ -1,120 +0,0 @@
|
|||
import {
|
||||
nextTimeUnit,
|
||||
showDate,
|
||||
strToSeconds,
|
||||
timeDeltaToString,
|
||||
TimeSecond,
|
||||
} from "../../utils/time";
|
||||
|
||||
describe("Date with correct timezone", () => {
|
||||
const map = new Map([["u_time_at", "@"]]);
|
||||
const date = new Date(1727434767686);
|
||||
{
|
||||
const name = "fr";
|
||||
test(name, () => {
|
||||
expect(showDate(name, map, date)).toBe("27/09/2024 @ 12:59:27");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "en-US";
|
||||
test(name, () => {
|
||||
expect(showDate(name, map, date)).toBe("9/27/24, @ 1:59:27");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "unknown";
|
||||
// Depends on the system
|
||||
// The important is that the date is in the correct timezone (UTC)
|
||||
test(name, () => {
|
||||
expect(["27/09/2024 @ 10:59:27", "9/27/24, @ 10:59:27"]).toContain(showDate(name, map, date));
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "zh-CN";
|
||||
test(name, () => {
|
||||
expect(showDate(name, map, date)).toBe("2024/9/27 @ 18:59:27");
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("String time to seconds", () => {
|
||||
{
|
||||
const name = "10m30";
|
||||
test(name, () => {
|
||||
expect(strToSeconds(name)).toBe(630);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "12h30";
|
||||
test(name, () => {
|
||||
expect(strToSeconds(name)).toBe(45000);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "12s30";
|
||||
test(name, () => {
|
||||
expect(strToSeconds(name)).toBe(42);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "1w30h20";
|
||||
test(name, () => {
|
||||
expect(strToSeconds(name)).toBe(714000);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Next time unit", () => {
|
||||
{
|
||||
const name = TimeSecond.Minute;
|
||||
test(name.toString(), () => {
|
||||
expect(nextTimeUnit(name)).toBe(TimeSecond.Second);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = TimeSecond.Hour;
|
||||
test(name.toString(), () => {
|
||||
expect(nextTimeUnit(name)).toBe(TimeSecond.Minute);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = TimeSecond.Second;
|
||||
test(name.toString(), () => {
|
||||
expect(nextTimeUnit(name)).toBe(TimeSecond.Second);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = TimeSecond.Year;
|
||||
test(name.toString(), () => {
|
||||
expect(nextTimeUnit(name)).toBe(TimeSecond.Week);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Relative time", () => {
|
||||
// Thoses tests are based on time, we have 10s of acceptance.
|
||||
{
|
||||
const name = Date.now() + (10 * TimeSecond.Minute + 30) * 1000;
|
||||
test(name.toString(), () => {
|
||||
expect(timeDeltaToString(name)).toMatch(/10m 30s|10m 2\ds/);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = Date.now() + (12 * TimeSecond.Hour + 30 * TimeSecond.Minute) * 1000;
|
||||
test(name.toString(), () => {
|
||||
expect(timeDeltaToString(name)).toMatch(/12h 30m|12h 29m 5\ds/);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = Date.now() + (TimeSecond.Week + TimeSecond.Day + 6 * TimeSecond.Hour) * 1000;
|
||||
test(name.toString(), () => {
|
||||
expect(timeDeltaToString(name)).toMatch(/1w 1d 6h|1w 1d 5h 59m 5\ds/);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = Date.now();
|
||||
test(name.toString(), () => {
|
||||
expect(timeDeltaToString(name)).toMatch(/\ds/);
|
||||
});
|
||||
}
|
||||
});
|
36
tests/modules/string.test.ts
Normal file
36
tests/modules/string.test.ts
Normal file
|
@ -0,0 +1,36 @@
|
|||
import "../../src/modules/string";
|
||||
|
||||
import { describe, it } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
describe("Capitalize", () => {
|
||||
{
|
||||
const name = "test";
|
||||
it(name, () => {
|
||||
assert.strictEqual(name.capitalize(), "Test");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "MACHIN";
|
||||
it(name, () => {
|
||||
assert.strictEqual(name.capitalize(), "MACHIN");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "tRUC";
|
||||
it(name, () => {
|
||||
assert.strictEqual(name.capitalize(), "TRUC");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "Super";
|
||||
it(name, () => {
|
||||
assert.strictEqual(name.capitalize(), "Super");
|
||||
});
|
||||
}
|
||||
{
|
||||
it("Empty string", () => {
|
||||
assert.strictEqual("".capitalize(), "");
|
||||
});
|
||||
}
|
||||
});
|
30
tests/utils/commands/reminder.test.ts
Normal file
30
tests/utils/commands/reminder.test.ts
Normal file
|
@ -0,0 +1,30 @@
|
|||
import { OptionReminder, splitTime } from "../../../src/utils/commands/reminder";
|
||||
|
||||
import { describe, it } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
describe("Time splitter", () => {
|
||||
{
|
||||
it("Empty String", () => {
|
||||
assert.deepStrictEqual(splitTime(""), { option: OptionReminder.Nothing, time: "" });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "2m@p";
|
||||
it(name, () => {
|
||||
assert.deepStrictEqual(splitTime(name), { option: OptionReminder.DirectMessage, time: "2m" });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "41@";
|
||||
it(name, () => {
|
||||
assert.deepStrictEqual(splitTime(name), { option: OptionReminder.Mention, time: "41" });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "0P";
|
||||
it(name, () => {
|
||||
assert.deepStrictEqual(splitTime(name), { option: OptionReminder.DirectMessage, time: "0" });
|
||||
});
|
||||
}
|
||||
});
|
|
@ -1,5 +1,8 @@
|
|||
import { Attachment, Collection, EmbedBuilder } from "discord.js";
|
||||
import { handleAttachments } from "../../../utils/events/citation";
|
||||
import { handleAttachments } from "../../../src/utils/events/citation";
|
||||
|
||||
import { describe, it } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
/**
|
||||
* Generate a new random string
|
||||
|
@ -17,7 +20,7 @@ describe("Attachements Handler", () => {
|
|||
const max_field = Array.from({ length: max }, () => "[f](url)").join(", ");
|
||||
{
|
||||
const name = "One image";
|
||||
test(name, () => {
|
||||
it(name, () => {
|
||||
const embedExpected = new EmbedBuilder();
|
||||
embedExpected.setImage("http://url");
|
||||
|
||||
|
@ -28,12 +31,12 @@ describe("Attachements Handler", () => {
|
|||
new Collection([[newKey(), { name: "image.png", url: "http://url" } as Attachment]]),
|
||||
);
|
||||
|
||||
expect(embedTest).toStrictEqual(embedExpected);
|
||||
assert.deepStrictEqual(embedTest, embedExpected);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "Two images";
|
||||
test(name, () => {
|
||||
it(name, () => {
|
||||
const embedExpected = new EmbedBuilder();
|
||||
embedExpected.addFields({
|
||||
name: "yes_s",
|
||||
|
@ -50,12 +53,12 @@ describe("Attachements Handler", () => {
|
|||
]),
|
||||
);
|
||||
|
||||
expect(embedTest).toStrictEqual(embedExpected);
|
||||
assert.deepStrictEqual(embedTest, embedExpected);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "One link";
|
||||
test(name, () => {
|
||||
it(name, () => {
|
||||
const embedExpected = new EmbedBuilder();
|
||||
embedExpected.addFields({ name: "no_s", value: "[f](url)" });
|
||||
|
||||
|
@ -66,12 +69,12 @@ describe("Attachements Handler", () => {
|
|||
new Collection([[newKey(), { name: "f", url: "url" } as Attachment]]),
|
||||
);
|
||||
|
||||
expect(embedTest).toStrictEqual(embedExpected);
|
||||
assert.deepStrictEqual(embedTest, embedExpected);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "Two files";
|
||||
test(name, () => {
|
||||
it(name, () => {
|
||||
const embedExpected = new EmbedBuilder();
|
||||
embedExpected.addFields({ name: "yes_s", value: "[f](url), [f](url)" });
|
||||
|
||||
|
@ -85,12 +88,12 @@ describe("Attachements Handler", () => {
|
|||
]),
|
||||
);
|
||||
|
||||
expect(embedTest).toStrictEqual(embedExpected);
|
||||
assert.deepStrictEqual(embedTest, embedExpected);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "Two fields with multiples files each";
|
||||
test(name, () => {
|
||||
it(name, () => {
|
||||
const total = 150;
|
||||
|
||||
const embedExpected = new EmbedBuilder();
|
||||
|
@ -114,12 +117,12 @@ describe("Attachements Handler", () => {
|
|||
),
|
||||
);
|
||||
|
||||
expect(embedTest).toStrictEqual(embedExpected);
|
||||
assert.deepStrictEqual(embedTest, embedExpected);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "Two fields with one field with one element";
|
||||
test(name, () => {
|
||||
it(name, () => {
|
||||
const total = 103;
|
||||
|
||||
const embedExpected = new EmbedBuilder();
|
||||
|
@ -143,7 +146,7 @@ describe("Attachements Handler", () => {
|
|||
),
|
||||
);
|
||||
|
||||
expect(embedTest).toStrictEqual(embedExpected);
|
||||
assert.deepStrictEqual(embedTest, embedExpected);
|
||||
});
|
||||
}
|
||||
});
|
154
tests/utils/misc.test.ts
Normal file
154
tests/utils/misc.test.ts
Normal file
|
@ -0,0 +1,154 @@
|
|||
import {
|
||||
cleanCodeBlock,
|
||||
emojiPng,
|
||||
isImage,
|
||||
removeExtension,
|
||||
splitFilenameExtensions,
|
||||
} from "../../src/utils/misc";
|
||||
|
||||
import { describe, it } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
describe("Filename splitter", () => {
|
||||
{
|
||||
const name = "test.js";
|
||||
it(name, () => {
|
||||
assert.deepStrictEqual(splitFilenameExtensions(name), { file: "test", ext: "js" });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = ".env";
|
||||
it(name, () => {
|
||||
assert.deepStrictEqual(splitFilenameExtensions(name), { file: ".env", ext: undefined });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = ".env.test";
|
||||
it(name, () => {
|
||||
assert.deepStrictEqual(splitFilenameExtensions(name), { file: ".env", ext: "test" });
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "file.test.js";
|
||||
it(name, () => {
|
||||
assert.deepStrictEqual(splitFilenameExtensions(name), { file: "file.test", ext: "js" });
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Extension remover", () => {
|
||||
{
|
||||
const name = "test.js";
|
||||
it(name, () => {
|
||||
assert.strictEqual(removeExtension(name), "test");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = ".env";
|
||||
it(name, () => {
|
||||
assert.strictEqual(removeExtension(name), ".env");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = ".env.test";
|
||||
it(name, () => {
|
||||
assert.strictEqual(removeExtension(name), ".env");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "file.test.js";
|
||||
it(name, () => {
|
||||
assert.strictEqual(removeExtension(name), "file.test");
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Image checker", () => {
|
||||
{
|
||||
const name = "image.Png";
|
||||
it(name, () => {
|
||||
assert.strictEqual(isImage(name), true);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.jpeg";
|
||||
it(name, () => {
|
||||
assert.strictEqual(isImage(name), true);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.wav";
|
||||
it(name, () => {
|
||||
assert.strictEqual(isImage(name), false);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.jpg";
|
||||
it(name, () => {
|
||||
assert.strictEqual(isImage(name), true);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.webP";
|
||||
it(name, () => {
|
||||
assert.strictEqual(isImage(name), true);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "image.GIF";
|
||||
it(name, () => {
|
||||
assert.strictEqual(isImage(name), true);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Code block cleaner", () => {
|
||||
{
|
||||
const name = "salut";
|
||||
it(name, () => {
|
||||
assert.strictEqual(cleanCodeBlock(name), "`salut`");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "<@158260864623968257> ça va ?";
|
||||
it(name, () => {
|
||||
assert.strictEqual(cleanCodeBlock(name), "<@158260864623968257>` ça va ?`");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "t'as vu la vidéo ? https://youtu.be/dQw4w9WgXcQ";
|
||||
it(name, () => {
|
||||
assert.strictEqual(cleanCodeBlock(name), "`t'as vu la vidéo ? `https://youtu.be/dQw4w9WgXcQ");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "t'as vu la vidéo ? https://youtu.be/dQw4w9WgXcQ elle est cool en vrai tqt";
|
||||
it(name, () => {
|
||||
assert.strictEqual(
|
||||
cleanCodeBlock(name),
|
||||
"`t'as vu la vidéo ? `https://youtu.be/dQw4w9WgXcQ` elle est cool en vrai tqt`",
|
||||
);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Emoji to link", () => {
|
||||
{
|
||||
const name = "☺️";
|
||||
it(name, () => {
|
||||
assert.strictEqual(
|
||||
emojiPng(name),
|
||||
"https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/72x72/263a.png",
|
||||
);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "🍕";
|
||||
it(name, () => {
|
||||
assert.strictEqual(
|
||||
emojiPng(name),
|
||||
"https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/72x72/1f355.png",
|
||||
);
|
||||
});
|
||||
}
|
||||
});
|
29
tests/utils/regex.test.ts
Normal file
29
tests/utils/regex.test.ts
Normal file
|
@ -0,0 +1,29 @@
|
|||
import { RegexC, RegExpFlags } from "../../src/utils/regex";
|
||||
|
||||
import { describe, it } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
describe("Regex flags", () => {
|
||||
it("One parameter", () => {
|
||||
const regex = RegexC("", RegExpFlags.Global);
|
||||
assert.strictEqual(regex.global, true);
|
||||
});
|
||||
|
||||
it("All parameters", () => {
|
||||
const regex = RegexC(
|
||||
"",
|
||||
RegExpFlags.Global |
|
||||
RegExpFlags.MultiLine |
|
||||
RegExpFlags.Insensitive |
|
||||
RegExpFlags.Sticky |
|
||||
RegExpFlags.Unicode |
|
||||
RegExpFlags.SingleLine,
|
||||
);
|
||||
assert.strictEqual(regex.global, true);
|
||||
assert.strictEqual(regex.multiline, true);
|
||||
assert.strictEqual(regex.ignoreCase, true);
|
||||
assert.strictEqual(regex.sticky, true);
|
||||
assert.strictEqual(regex.unicode, true);
|
||||
assert.strictEqual(regex.dotAll, true);
|
||||
});
|
||||
});
|
125
tests/utils/time.test.ts
Normal file
125
tests/utils/time.test.ts
Normal file
|
@ -0,0 +1,125 @@
|
|||
import {
|
||||
nextTimeUnit,
|
||||
showDate,
|
||||
strToSeconds,
|
||||
timeDeltaToString,
|
||||
TimeSecond,
|
||||
} from "../../src/utils/time";
|
||||
|
||||
import { describe, it } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
describe("Date with correct timezone", () => {
|
||||
const map = new Map([["u_time_at", "@"]]);
|
||||
const date = new Date(1727434767686);
|
||||
{
|
||||
const name = "fr";
|
||||
it(name, () => {
|
||||
assert.strictEqual(showDate(name, map, date), "27/09/2024 @ 12:59:27");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "en-US";
|
||||
it(name, () => {
|
||||
assert.strictEqual(showDate(name, map, date), "9/27/24, @ 1:59:27");
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "unknown";
|
||||
// Depends on the system
|
||||
// The important is that the date is in the correct timezone (UTC)
|
||||
it(name, () => {
|
||||
assert.ok(
|
||||
["27/09/2024 @ 10:59:27", "9/27/24, @ 10:59:27"].includes(showDate(name, map, date)),
|
||||
);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "zh-CN";
|
||||
it(name, () => {
|
||||
assert.strictEqual(showDate(name, map, date), "2024/9/27 @ 18:59:27");
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("String time to seconds", () => {
|
||||
{
|
||||
const name = "10m30";
|
||||
it(name, () => {
|
||||
assert.strictEqual(strToSeconds(name), 630);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "12h30";
|
||||
it(name, () => {
|
||||
assert.strictEqual(strToSeconds(name), 45000);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "12s30";
|
||||
it(name, () => {
|
||||
assert.strictEqual(strToSeconds(name), 42);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = "1w30h20";
|
||||
it(name, () => {
|
||||
assert.strictEqual(strToSeconds(name), 714000);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Next time unit", () => {
|
||||
{
|
||||
const name = TimeSecond.Minute;
|
||||
it(name.toString(), () => {
|
||||
assert.strictEqual(nextTimeUnit(name), TimeSecond.Second);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = TimeSecond.Hour;
|
||||
it(name.toString(), () => {
|
||||
assert.strictEqual(nextTimeUnit(name), TimeSecond.Minute);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = TimeSecond.Second;
|
||||
it(name.toString(), () => {
|
||||
assert.strictEqual(nextTimeUnit(name), TimeSecond.Second);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = TimeSecond.Year;
|
||||
it(name.toString(), () => {
|
||||
assert.strictEqual(nextTimeUnit(name), TimeSecond.Week);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
describe("Relative time", () => {
|
||||
// Thoses its are based on time, we have 10s of acceptance.
|
||||
{
|
||||
const name = Date.now() + (10 * TimeSecond.Minute + 30) * 1000;
|
||||
it(name.toString(), () => {
|
||||
assert.match(timeDeltaToString(name), /10m 30s|10m 2\ds/);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = Date.now() + (12 * TimeSecond.Hour + 30 * TimeSecond.Minute) * 1000;
|
||||
it(name.toString(), () => {
|
||||
assert.match(timeDeltaToString(name), /12h 30m|12h 29m 5\ds/);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = Date.now() + (TimeSecond.Week + TimeSecond.Day + 6 * TimeSecond.Hour) * 1000;
|
||||
it(name.toString(), () => {
|
||||
assert.match(timeDeltaToString(name), /1w 1d 6h|1w 1d 5h 59m 5\ds/);
|
||||
});
|
||||
}
|
||||
{
|
||||
const name = Date.now();
|
||||
it(name.toString(), () => {
|
||||
assert.match(timeDeltaToString(name), /\ds/);
|
||||
});
|
||||
}
|
||||
});
|
|
@ -103,5 +103,5 @@
|
|||
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||
},
|
||||
"include": ["./**/*.ts", "./src/locales/*.json"],
|
||||
"exclude": ["./src/tests"]
|
||||
"exclude": ["tests"]
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue