mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
fix: update tool count to 51, refresh hero copy and login page
- Update stale tool counts (48/49/50) to 51 across all apps, docs, and tests - Add Meme Generator to landing page bento grid (was missing) - Add 12 SEO-friendly rotating phrases to hero typing cursor - Change landing hero subtitle to "Every image tool you need." - Replace outdated login page copy with branded hero + rotating phrases
This commit is contained in:
@@ -25,7 +25,7 @@ function getCountText(): string {
|
||||
describe("BentoGrid", () => {
|
||||
it("renders the section heading", () => {
|
||||
render(<BentoGrid />);
|
||||
expect(screen.getByText("50 tools. Zero cloud dependency.")).toBeDefined();
|
||||
expect(screen.getByText("51 tools. Zero cloud dependency.")).toBeDefined();
|
||||
});
|
||||
|
||||
it("renders the search input", () => {
|
||||
@@ -36,12 +36,12 @@ describe("BentoGrid", () => {
|
||||
it("shows all tools by default", () => {
|
||||
render(<BentoGrid />);
|
||||
const text = getCountText();
|
||||
expect(text).toMatch(/Showing 50 of 50 tools/);
|
||||
expect(text).toMatch(/Showing 51 of 51 tools/);
|
||||
});
|
||||
|
||||
it("renders category filter pills including All", () => {
|
||||
render(<BentoGrid />);
|
||||
expect(screen.getByText((_, el) => el?.textContent === "All (50)")).toBeDefined();
|
||||
expect(screen.getByText((_, el) => el?.textContent === "All (51)")).toBeDefined();
|
||||
expect(screen.getByText(/Essentials/)).toBeDefined();
|
||||
expect(screen.getByText(/AI Tools/)).toBeDefined();
|
||||
expect(screen.getByText(/Optimization/)).toBeDefined();
|
||||
@@ -53,7 +53,7 @@ describe("BentoGrid", () => {
|
||||
fireEvent.change(input, { target: { value: "resize" } });
|
||||
expect(screen.getByText("Resize")).toBeDefined();
|
||||
const text = getCountText();
|
||||
expect(text).toMatch(/Showing \d+ of 50 tools/);
|
||||
expect(text).toMatch(/Showing \d+ of 51 tools/);
|
||||
expect(screen.queryByText("OCR / Text Extraction")).toBeNull();
|
||||
});
|
||||
|
||||
@@ -62,7 +62,7 @@ describe("BentoGrid", () => {
|
||||
const aiButton = screen.getByText(/AI Tools/);
|
||||
fireEvent.click(aiButton);
|
||||
const text = getCountText();
|
||||
expect(text).toMatch(/Showing 15 of 50 tools/);
|
||||
expect(text).toMatch(/Showing 15 of 51 tools/);
|
||||
expect(screen.getByText("Remove Background")).toBeDefined();
|
||||
expect(screen.queryByText("Resize")).toBeNull();
|
||||
});
|
||||
@@ -73,7 +73,7 @@ describe("BentoGrid", () => {
|
||||
fireEvent.change(input, { target: { value: "xyznonexistent" } });
|
||||
expect(screen.getByText("No tools found. Try a different search.")).toBeDefined();
|
||||
const text = getCountText();
|
||||
expect(text).toMatch(/Showing 0 of 50 tools/);
|
||||
expect(text).toMatch(/Showing 0 of 51 tools/);
|
||||
});
|
||||
|
||||
it("combines search and category filter", () => {
|
||||
@@ -89,9 +89,9 @@ describe("BentoGrid", () => {
|
||||
it("clicking All resets category filter", () => {
|
||||
render(<BentoGrid />);
|
||||
fireEvent.click(screen.getByText(/AI Tools/));
|
||||
expect(getCountText()).toMatch(/Showing 15 of 50 tools/);
|
||||
fireEvent.click(screen.getByText((_, el) => el?.textContent === "All (50)"));
|
||||
expect(getCountText()).toMatch(/Showing 50 of 50 tools/);
|
||||
expect(getCountText()).toMatch(/Showing 15 of 51 tools/);
|
||||
fireEvent.click(screen.getByText((_, el) => el?.textContent === "All (51)"));
|
||||
expect(getCountText()).toMatch(/Showing 51 of 51 tools/);
|
||||
});
|
||||
|
||||
it("renders each tool with name and description", () => {
|
||||
|
||||
@@ -41,9 +41,7 @@ describe("Hero", () => {
|
||||
|
||||
it("renders the subheadline", () => {
|
||||
render(<Hero />);
|
||||
expect(
|
||||
screen.getByText("The open-source, self-hosted image processing platform."),
|
||||
).toBeDefined();
|
||||
expect(screen.getByText("Every image tool you need.")).toBeDefined();
|
||||
});
|
||||
|
||||
it("renders the CTA button linking to GitHub", () => {
|
||||
@@ -159,7 +157,7 @@ describe("Pricing", () => {
|
||||
|
||||
it("renders free plan features", () => {
|
||||
render(<Pricing />);
|
||||
expect(screen.getByText("All 48 image processing tools")).toBeDefined();
|
||||
expect(screen.getByText("All 51 image processing tools")).toBeDefined();
|
||||
expect(screen.getByText("Unlimited usage, no hidden caps")).toBeDefined();
|
||||
expect(screen.getByText("15 local AI models included")).toBeDefined();
|
||||
expect(screen.getByText("AGPL-3.0 licensed")).toBeDefined();
|
||||
|
||||
Reference in New Issue
Block a user