feat: add clear for texts state, update tests

This commit is contained in:
2026-02-09 09:34:01 +05:00
parent a146fee41c
commit ede31942d0
2 changed files with 56 additions and 82 deletions
+5 -1
View File
@@ -5,7 +5,7 @@ export interface TextItem {
const defaultTexts: Array<TextItem> = ["About me", "Links", "Projects"].map((text, idx) => ({ text, id: idx })); const defaultTexts: Array<TextItem> = ["About me", "Links", "Projects"].map((text, idx) => ({ text, id: idx }));
function createState() { export function createState() {
let texts: Array<TextItem> = $state(defaultTexts); let texts: Array<TextItem> = $state(defaultTexts);
let nextId = $state(defaultTexts.length); let nextId = $state(defaultTexts.length);
@@ -21,6 +21,10 @@ function createState() {
removeText(id: number) { removeText(id: number) {
texts = texts.filter((textItem) => textItem.id !== id); texts = texts.filter((textItem) => textItem.id !== id);
}, },
clear() {
texts = [];
nextId = 0;
},
}; };
} }
+51 -81
View File
@@ -1,135 +1,105 @@
import { textsState } from "$states/texts.svelte"; import { createState } from "$states/texts.svelte";
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
describe("texts.svelte", () => { describe("texts.svelte", () => {
describe("initial state", () => {
it("should have default texts with unique IDs", () => {
const defaultTexts = ["About me", "Links", "Projects"];
expect(textsState.texts).toHaveLength(defaultTexts.length);
expect(Array.isArray(textsState.texts)).toBe(true);
textsState.texts.forEach((textItem, index) => {
expect(textItem.text).toBe(defaultTexts[index]);
expect(textItem.id).toBe(index);
});
const ids = textsState.texts.map((item) => item.id);
const uniqueIds = new Set(ids);
expect(ids.length).toBe(uniqueIds.size);
});
});
describe("addText", () => { describe("addText", () => {
it("should add new text with unique ID and increment counter", () => { it("should add new text with unique ID and increment counter", () => {
const initialLength = textsState.texts.length; const state = createState();
const initialIds = textsState.texts.map((item) => item.id); const initialLength = state.texts.length;
const initialIds = state.texts.map((item) => item.id);
const maxId = Math.max(...initialIds); const maxId = Math.max(...initialIds);
const newText = "Test text"; const newText = "Test text";
textsState.addText(newText); state.addText(newText);
expect(textsState.texts).toHaveLength(initialLength + 1); expect(state.texts).toHaveLength(initialLength + 1);
expect(textsState.texts[initialLength].text).toBe(newText); expect(state.texts[initialLength].text).toBe(newText);
expect(textsState.texts[initialLength].id).toBe(maxId + 1); expect(state.texts[initialLength].id).toBe(maxId + 1);
expect(initialIds).not.toContain(textsState.texts[initialLength].id); expect(initialIds).not.toContain(state.texts[initialLength].id);
});
it("should preserve existing texts when adding new", () => {
const initialTexts = [...textsState.texts];
const newText = "New text";
textsState.addText(newText);
initialTexts.forEach((initialText, index) => {
expect(textsState.texts[index]).toStrictEqual(initialText);
});
}); });
it("should not add text with empty string", () => { it("should not add text with empty string", () => {
const initialLength = textsState.texts.length; const state = createState();
const initialLength = state.texts.length;
textsState.addText(""); state.addText("");
expect(textsState.texts).toHaveLength(initialLength); expect(state.texts).toHaveLength(initialLength);
}); });
}); });
describe("removeText", () => { describe("removeText", () => {
it("should remove text by ID and preserve other texts", () => { it("should remove text by ID and preserve other texts", () => {
const initialLength = textsState.texts.length; const state = createState();
const idToRemove = textsState.texts[1].id; const initialLength = state.texts.length;
const otherTexts = textsState.texts.filter((item) => item.id !== idToRemove); const idToRemove = state.texts[1].id;
const otherTexts = state.texts.filter((item) => item.id !== idToRemove);
textsState.removeText(idToRemove); state.removeText(idToRemove);
expect(textsState.texts).toHaveLength(initialLength - 1); expect(state.texts).toHaveLength(initialLength - 1);
expect(textsState.texts.find((item) => item.id === idToRemove)).toBeUndefined(); expect(state.texts.find((item) => item.id === idToRemove)).toBeUndefined();
expect(textsState.texts).toStrictEqual(otherTexts); expect(state.texts).toStrictEqual(otherTexts);
}); });
it("should not remove text with non-existent ID", () => { it("should not remove text with non-existent ID", () => {
const initialLength = textsState.texts.length; const state = createState();
const initialTexts = [...textsState.texts]; const initialLength = state.texts.length;
const initialTexts = [...state.texts];
const nonExistentId = 999999; const nonExistentId = 999999;
textsState.removeText(nonExistentId); state.removeText(nonExistentId);
expect(textsState.texts).toHaveLength(initialLength); expect(state.texts).toHaveLength(initialLength);
expect(textsState.texts).toStrictEqual(initialTexts); expect(state.texts).toStrictEqual(initialTexts);
}); });
}); });
describe("texts getter", () => { describe("clear", () => {
it("should return array of TextItem with correct structure", () => { it("should clear all texts", () => {
expect(Array.isArray(textsState.texts)).toBe(true); const state = createState();
textsState.texts.forEach((item) => { state.addText("Test 1");
expect(item).toHaveProperty("text"); state.addText("Test 2");
expect(item).toHaveProperty("id"); expect(state.texts.length).toBeGreaterThanOrEqual(2);
expect(typeof item.text).toBe("string");
expect(typeof item.id).toBe("number");
});
});
it("should return reactive texts", () => { state.clear();
const initialLength = textsState.texts.length; expect(state.texts).toHaveLength(0);
textsState.addText("Test");
expect(textsState.texts).toHaveLength(initialLength + 1);
}); });
}); });
describe("integration", () => { describe("integration", () => {
it("should maintain ID uniqueness after multiple operations", () => { it("should maintain ID uniqueness after multiple operations", () => {
const initialIds = new Set(textsState.texts.map((item) => item.id)); const state = createState();
const initialIds = new Set(state.texts.map((item) => item.id));
textsState.addText("First"); state.addText("First");
textsState.addText("Second"); state.addText("Second");
textsState.removeText(textsState.texts[0].id); state.removeText(state.texts[0].id);
textsState.addText("Third"); state.addText("Third");
const finalIds = textsState.texts.map((item) => item.id); const finalIds = state.texts.map((item) => item.id);
const uniqueIds = new Set(finalIds); const uniqueIds = new Set(finalIds);
expect(finalIds.length).toBe(uniqueIds.size); expect(finalIds.length).toBe(uniqueIds.size);
}); });
it("should handle adding and removing multiple texts", () => { it("should handle adding and removing multiple texts", () => {
const initialLength = textsState.texts.length; const state = createState();
const initialLength = state.texts.length;
const addedIds: number[] = []; const addedIds: number[] = [];
for (let i = 0; i < 5; i++) { for (let i = 0; i < 5; i++) {
textsState.addText(`Text ${i}`); state.addText(`Text ${i}`);
addedIds.push(textsState.texts[textsState.texts.length - 1].id); addedIds.push(state.texts[state.texts.length - 1].id);
} }
expect(textsState.texts).toHaveLength(initialLength + 5); expect(state.texts).toHaveLength(initialLength + 5);
textsState.removeText(addedIds[0]); state.removeText(addedIds[0]);
textsState.removeText(addedIds[2]); state.removeText(addedIds[2]);
textsState.removeText(addedIds[4]); state.removeText(addedIds[4]);
expect(textsState.texts).toHaveLength(initialLength + 2); expect(state.texts).toHaveLength(initialLength + 2);
}); });
}); });
}); });