fix: move empty text logic to state, fix tests

This commit is contained in:
2026-02-08 21:33:15 +05:00
parent 59745eac4f
commit a146fee41c
4 changed files with 23 additions and 88 deletions
+1 -4
View File
@@ -10,10 +10,7 @@
let text: string = $state(""); let text: string = $state("");
function addText() { function addText() {
let trimmed = text.trim(); textsState.addText(text);
if (trimmed.length !== 0) {
textsState.addText(trimmed);
}
text = ""; text = "";
} }
+1
View File
@@ -14,6 +14,7 @@ function createState() {
return texts; return texts;
}, },
addText(text: string) { addText(text: string) {
if (text.trim().length === 0) return;
texts.push({ text, id: nextId }); texts.push({ text, id: nextId });
nextId++; nextId++;
}, },
@@ -1,14 +1,18 @@
import TextManager from "$components/text/TextManager.svelte"; import TextManager from "$components/text/TextManager.svelte";
import { textsState } from "$states/texts.svelte"; import { textsState } from "$states/texts.svelte";
import { render } from "@testing-library/svelte"; import { render, screen } from "@testing-library/svelte";
import { beforeEach, describe, it } from "vitest"; import { beforeEach, describe, expect, it } from "vitest";
describe("TextManager.svelte", () => { describe("TextManager.svelte", () => {
beforeEach(() => { beforeEach(() => {
textsState.texts.length = 0; while (textsState.texts.length > 0) {
textsState.texts.pop();
}
}); });
it("should render without crashing", () => { it("should render without crashing", () => {
render(TextManager); render(TextManager);
const cardTitle = screen.getByText("Тексты панелей");
expect(cardTitle).toBeInTheDocument();
}); });
}); });
+14 -81
View File
@@ -3,23 +3,16 @@ import { describe, expect, it } from "vitest";
describe("texts.svelte", () => { describe("texts.svelte", () => {
describe("initial state", () => { describe("initial state", () => {
it("should have default texts", () => { it("should have default texts with unique IDs", () => {
expect(textsState.texts).toBeDefined();
expect(Array.isArray(textsState.texts)).toBe(true);
expect(textsState.texts.length).toBeGreaterThan(0);
});
it("should have correct default texts", () => {
const defaultTexts = ["About me", "Links", "Projects"]; const defaultTexts = ["About me", "Links", "Projects"];
expect(textsState.texts).toHaveLength(defaultTexts.length); expect(textsState.texts).toHaveLength(defaultTexts.length);
expect(Array.isArray(textsState.texts)).toBe(true);
textsState.texts.forEach((textItem, index) => { textsState.texts.forEach((textItem, index) => {
expect(textItem.text).toBe(defaultTexts[index]); expect(textItem.text).toBe(defaultTexts[index]);
expect(textItem.id).toBe(index); expect(textItem.id).toBe(index);
}); });
});
it("should have unique IDs for all texts", () => {
const ids = textsState.texts.map((item) => item.id); const ids = textsState.texts.map((item) => item.id);
const uniqueIds = new Set(ids); const uniqueIds = new Set(ids);
expect(ids.length).toBe(uniqueIds.size); expect(ids.length).toBe(uniqueIds.size);
@@ -27,39 +20,18 @@ describe("texts.svelte", () => {
}); });
describe("addText", () => { describe("addText", () => {
it("should add new text", () => { it("should add new text with unique ID and increment counter", () => {
const initialLength = textsState.texts.length; const initialLength = textsState.texts.length;
const initialIds = textsState.texts.map((item) => item.id);
const maxId = Math.max(...initialIds);
const newText = "Test text"; const newText = "Test text";
textsState.addText(newText); textsState.addText(newText);
expect(textsState.texts).toHaveLength(initialLength + 1); expect(textsState.texts).toHaveLength(initialLength + 1);
expect(textsState.texts[initialLength].text).toBe(newText); expect(textsState.texts[initialLength].text).toBe(newText);
}); expect(textsState.texts[initialLength].id).toBe(maxId + 1);
expect(initialIds).not.toContain(textsState.texts[initialLength].id);
it("should assign unique ID to new text", () => {
const initialIds = textsState.texts.map((item) => item.id);
const maxId = Math.max(...initialIds);
textsState.addText("New text");
const newText = textsState.texts[textsState.texts.length - 1];
expect(newText.id).toBe(maxId + 1);
expect(initialIds).not.toContain(newText.id);
});
it("should increment ID counter", () => {
const initialLength = textsState.texts.length;
const firstNewId = textsState.texts[initialLength - 1].id;
textsState.addText("First");
textsState.addText("Second");
const firstNew = textsState.texts[initialLength];
const secondNew = textsState.texts[initialLength + 1];
expect(firstNew.id).toBe(firstNewId + 1);
expect(secondNew.id).toBe(firstNewId + 2);
}); });
it("should preserve existing texts when adding new", () => { it("should preserve existing texts when adding new", () => {
@@ -73,34 +45,26 @@ describe("texts.svelte", () => {
}); });
}); });
it("should add text with empty string", () => { it("should not add text with empty string", () => {
const initialLength = textsState.texts.length; const initialLength = textsState.texts.length;
textsState.addText(""); textsState.addText("");
expect(textsState.texts).toHaveLength(initialLength + 1); expect(textsState.texts).toHaveLength(initialLength);
expect(textsState.texts[initialLength].text).toBe("");
});
it("should add text with special characters", () => {
const specialText = "Test @#$%^&*()_+-={}[]|\\:\";'<>?,./`~";
textsState.addText(specialText);
const addedText = textsState.texts[textsState.texts.length - 1];
expect(addedText.text).toBe(specialText);
}); });
}); });
describe("removeText", () => { describe("removeText", () => {
it("should remove text by ID", () => { it("should remove text by ID and preserve other texts", () => {
const initialLength = textsState.texts.length; const initialLength = textsState.texts.length;
const idToRemove = textsState.texts[0].id; const idToRemove = textsState.texts[1].id;
const otherTexts = textsState.texts.filter((item) => item.id !== idToRemove);
textsState.removeText(idToRemove); textsState.removeText(idToRemove);
expect(textsState.texts).toHaveLength(initialLength - 1); expect(textsState.texts).toHaveLength(initialLength - 1);
expect(textsState.texts.find((item) => item.id === idToRemove)).toBeUndefined(); expect(textsState.texts.find((item) => item.id === idToRemove)).toBeUndefined();
expect(textsState.texts).toStrictEqual(otherTexts);
}); });
it("should not remove text with non-existent ID", () => { it("should not remove text with non-existent ID", () => {
@@ -113,39 +77,10 @@ describe("texts.svelte", () => {
expect(textsState.texts).toHaveLength(initialLength); expect(textsState.texts).toHaveLength(initialLength);
expect(textsState.texts).toStrictEqual(initialTexts); expect(textsState.texts).toStrictEqual(initialTexts);
}); });
it("should preserve other texts when removing one", () => {
const idToRemove = textsState.texts[1].id;
const otherTexts = textsState.texts.filter((item) => item.id !== idToRemove);
textsState.removeText(idToRemove);
expect(textsState.texts).toStrictEqual(otherTexts);
});
it("should handle removing last text", () => {
const lastId = textsState.texts[textsState.texts.length - 1].id;
const initialLength = textsState.texts.length;
textsState.removeText(lastId);
expect(textsState.texts).toHaveLength(initialLength - 1);
expect(textsState.texts.find((item) => item.id === lastId)).toBeUndefined();
});
it("should handle removing first text", () => {
const firstId = textsState.texts[0].id;
const initialLength = textsState.texts.length;
textsState.removeText(firstId);
expect(textsState.texts).toHaveLength(initialLength - 1);
expect(textsState.texts.find((item) => item.id === firstId)).toBeUndefined();
});
}); });
describe("texts getter", () => { describe("texts getter", () => {
it("should return array of TextItem", () => { it("should return array of TextItem with correct structure", () => {
expect(Array.isArray(textsState.texts)).toBe(true); expect(Array.isArray(textsState.texts)).toBe(true);
textsState.texts.forEach((item) => { textsState.texts.forEach((item) => {
expect(item).toHaveProperty("text"); expect(item).toHaveProperty("text");
@@ -183,7 +118,6 @@ describe("texts.svelte", () => {
const initialLength = textsState.texts.length; const initialLength = textsState.texts.length;
const addedIds: number[] = []; const addedIds: number[] = [];
// Add multiple texts
for (let i = 0; i < 5; i++) { for (let i = 0; i < 5; i++) {
textsState.addText(`Text ${i}`); textsState.addText(`Text ${i}`);
addedIds.push(textsState.texts[textsState.texts.length - 1].id); addedIds.push(textsState.texts[textsState.texts.length - 1].id);
@@ -191,7 +125,6 @@ describe("texts.svelte", () => {
expect(textsState.texts).toHaveLength(initialLength + 5); expect(textsState.texts).toHaveLength(initialLength + 5);
// Remove some of them
textsState.removeText(addedIds[0]); textsState.removeText(addedIds[0]);
textsState.removeText(addedIds[2]); textsState.removeText(addedIds[2]);
textsState.removeText(addedIds[4]); textsState.removeText(addedIds[4]);