Skip to content

Commit eb0cac6

Browse files
committed
add tests
1 parent 729d318 commit eb0cac6

File tree

5 files changed

+328
-3
lines changed

5 files changed

+328
-3
lines changed

tests/browser/browser-manager.test.ts renamed to src/tools/browser/browser-manager.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { BrowserManager } from '../../src/tools/browser/browser-manager';
2-
import { BrowserError, BrowserErrorCode } from '../../src/tools/browser/types';
1+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
2+
import { BrowserManager } from "./browser-manager";
3+
import { BrowserError, BrowserErrorCode } from "./types";
34

45
describe('BrowserManager', () => {
56
let browserManager: BrowserManager;
@@ -23,7 +24,6 @@ describe('BrowserManager', () => {
2324
it('should create a headless session when specified', async () => {
2425
const session = await browserManager.createSession({ headless: true });
2526
expect(session.id).toBeDefined();
26-
// Additional headless mode checks could be added here
2727
});
2828

2929
it('should apply custom timeout when specified', async () => {
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from "vitest";
2+
import { BrowserManager } from "./browser-manager.js";
3+
import { BrowserSession } from "./types.js";
4+
5+
describe("Element State Tests", () => {
6+
let browserManager: BrowserManager;
7+
let session: BrowserSession;
8+
const baseUrl = "https://the-internet.herokuapp.com";
9+
10+
beforeAll(async () => {
11+
browserManager = new BrowserManager();
12+
session = await browserManager.createSession({ headless: true });
13+
});
14+
15+
afterAll(async () => {
16+
await browserManager.closeAllSessions();
17+
});
18+
19+
describe("Checkbox Tests", () => {
20+
beforeEach(async () => {
21+
await session.page.goto(`${baseUrl}/checkboxes`);
22+
});
23+
24+
it("should verify initial checkbox states", async () => {
25+
const checkboxes = await session.page.$$('input[type="checkbox"]');
26+
expect(checkboxes).toHaveLength(2);
27+
28+
const initialStates = await Promise.all(
29+
checkboxes.map((cb) =>
30+
cb.evaluate((el) => (el as HTMLInputElement).checked)
31+
)
32+
);
33+
expect(initialStates[0]).toBe(false);
34+
expect(initialStates[1]).toBe(true);
35+
});
36+
37+
it("should toggle checkbox states", async () => {
38+
const checkboxes = await session.page.$$('input[type="checkbox"]');
39+
40+
// Toggle first checkbox
41+
await checkboxes[0].click();
42+
let newState = await checkboxes[0].evaluate(
43+
(el) => (el as HTMLInputElement).checked
44+
);
45+
expect(newState).toBe(true);
46+
47+
// Toggle second checkbox
48+
await checkboxes[1].click();
49+
newState = await checkboxes[1].evaluate(
50+
(el) => (el as HTMLInputElement).checked
51+
);
52+
expect(newState).toBe(false);
53+
});
54+
55+
it("should maintain checkbox states after page refresh", async () => {
56+
const checkboxes = await session.page.$$('input[type="checkbox"]');
57+
await checkboxes[0].click(); // Toggle first checkbox
58+
59+
await session.page.reload();
60+
61+
const newCheckboxes = await session.page.$$('input[type="checkbox"]');
62+
const states = await Promise.all(
63+
newCheckboxes.map((cb) =>
64+
cb.evaluate((el) => (el as HTMLInputElement).checked)
65+
)
66+
);
67+
68+
// After refresh, should return to default states
69+
expect(states[0]).toBe(false);
70+
expect(states[1]).toBe(true);
71+
});
72+
});
73+
74+
describe("Dynamic Controls Tests", () => {
75+
beforeEach(async () => {
76+
await session.page.goto(`${baseUrl}/dynamic_controls`);
77+
});
78+
79+
it("should handle enabled/disabled element states", async () => {
80+
const input = await session.page.$('input[type="text"]');
81+
const isInitiallyDisabled = await input?.evaluate(
82+
(el) => (el as HTMLInputElement).disabled
83+
);
84+
expect(isInitiallyDisabled).toBe(true);
85+
86+
await session.page.click('button:has-text("Enable")');
87+
await session.page.waitForSelector('input:not([disabled])');
88+
89+
const isEnabled = await input?.evaluate(
90+
(el) => !(el as HTMLInputElement).disabled
91+
);
92+
expect(isEnabled).toBe(true);
93+
});
94+
});
95+
});
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from "vitest";
2+
import { BrowserManager } from "./browser-manager.js";
3+
import { BrowserSession } from "./types.js";
4+
5+
describe("Form Interaction Tests", () => {
6+
let browserManager: BrowserManager;
7+
let session: BrowserSession;
8+
const baseUrl = "https://the-internet.herokuapp.com";
9+
10+
beforeAll(async () => {
11+
browserManager = new BrowserManager();
12+
session = await browserManager.createSession({ headless: true });
13+
});
14+
15+
afterAll(async () => {
16+
await browserManager.closeAllSessions();
17+
});
18+
19+
beforeEach(async () => {
20+
await session.page.goto(`${baseUrl}/login`);
21+
});
22+
23+
it("should handle login form with invalid credentials", async () => {
24+
await session.page.type("#username", "invalid_user");
25+
await session.page.type("#password", "invalid_pass");
26+
await session.page.click('button[type="submit"]');
27+
28+
const flashMessage = await session.page.waitForSelector("#flash");
29+
const messageText = await flashMessage?.evaluate((el) => el.textContent);
30+
expect(messageText).toContain("Your username is invalid!");
31+
});
32+
33+
it("should clear form fields between attempts", async () => {
34+
await session.page.type("#username", "test_user");
35+
await session.page.type("#password", "test_pass");
36+
37+
// Clear fields
38+
await session.page.$eval(
39+
"#username",
40+
(el) => ((el as HTMLInputElement).value = "")
41+
);
42+
await session.page.$eval(
43+
"#password",
44+
(el) => ((el as HTMLInputElement).value = "")
45+
);
46+
47+
// Verify fields are empty
48+
const username = await session.page.$eval(
49+
"#username",
50+
(el) => (el as HTMLInputElement).value
51+
);
52+
const password = await session.page.$eval(
53+
"#password",
54+
(el) => (el as HTMLInputElement).value
55+
);
56+
expect(username).toBe("");
57+
expect(password).toBe("");
58+
});
59+
60+
it("should maintain form state after page refresh", async () => {
61+
const testUsername = "persistence_test";
62+
await session.page.type("#username", testUsername);
63+
await session.page.reload();
64+
65+
// Form should be cleared after refresh
66+
const username = await session.page.$eval(
67+
"#username",
68+
(el) => (el as HTMLInputElement).value
69+
);
70+
expect(username).toBe("");
71+
});
72+
73+
describe("Content Extraction", () => {
74+
it("should extract form labels and placeholders", async () => {
75+
const usernameLabel = await session.page.$eval(
76+
'label[for="username"]',
77+
(el) => el.textContent
78+
);
79+
expect(usernameLabel).toBe("Username");
80+
81+
const passwordPlaceholder = await session.page.$eval(
82+
'#password',
83+
(el) => (el as HTMLInputElement).placeholder
84+
);
85+
expect(passwordPlaceholder).toBe("");
86+
});
87+
});
88+
});
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from "vitest";
2+
import { BrowserManager } from "./browser-manager.js";
3+
import { BrowserSession } from "./types.js";
4+
5+
describe("Browser Navigation Tests", () => {
6+
let browserManager: BrowserManager;
7+
let session: BrowserSession;
8+
const baseUrl = "https://the-internet.herokuapp.com";
9+
10+
beforeAll(async () => {
11+
browserManager = new BrowserManager();
12+
session = await browserManager.createSession({ headless: true });
13+
});
14+
15+
afterAll(async () => {
16+
await browserManager.closeAllSessions();
17+
});
18+
19+
it("should navigate to main page and verify content", async () => {
20+
await session.page.goto(baseUrl);
21+
const title = await session.page.title();
22+
expect(title).toBe("The Internet");
23+
24+
const headerText = await session.page.$eval(
25+
"h1.heading",
26+
(el) => el.textContent
27+
);
28+
expect(headerText).toBe("Welcome to the-internet");
29+
});
30+
31+
it("should navigate to login page and verify title", async () => {
32+
await session.page.goto(`${baseUrl}/login`);
33+
const title = await session.page.title();
34+
expect(title).toBe("The Internet");
35+
36+
const headerText = await session.page.$eval("h2", (el) => el.textContent);
37+
expect(headerText).toBe("Login Page");
38+
});
39+
40+
it("should handle 404 pages appropriately", async () => {
41+
await session.page.goto(`${baseUrl}/nonexistent`);
42+
const title = await session.page.title();
43+
expect(title).toBe("The Internet");
44+
45+
const bodyText = await session.page.$eval("body", (el) => el.textContent);
46+
expect(bodyText).toContain("Not Found");
47+
});
48+
49+
it("should handle navigation timeouts", async () => {
50+
await expect(
51+
session.page.goto(`${baseUrl}/slow`, { timeout: 1 })
52+
).rejects.toThrow();
53+
});
54+
55+
it("should wait for network idle", async () => {
56+
await session.page.goto(baseUrl, {
57+
waitUntil: "networkidle0",
58+
});
59+
expect(session.page.url()).toBe(`${baseUrl}/`);
60+
});
61+
});
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from "vitest";
2+
import { BrowserManager } from "./browser-manager.js";
3+
import { BrowserSession } from "./types.js";
4+
5+
describe("Wait Behavior Tests", () => {
6+
let browserManager: BrowserManager;
7+
let session: BrowserSession;
8+
const baseUrl = "https://the-internet.herokuapp.com";
9+
10+
beforeAll(async () => {
11+
browserManager = new BrowserManager();
12+
session = await browserManager.createSession({ headless: true });
13+
});
14+
15+
afterAll(async () => {
16+
await browserManager.closeAllSessions();
17+
});
18+
19+
describe("Dynamic Loading Tests", () => {
20+
beforeEach(async () => {
21+
await session.page.goto(`${baseUrl}/dynamic_loading/2`);
22+
});
23+
24+
it("should handle dynamic loading with explicit waits", async () => {
25+
await session.page.click("button");
26+
27+
// Wait for loading element to appear and then disappear
28+
await session.page.waitForSelector("#loading");
29+
await session.page.waitForSelector("#loading", { hidden: true });
30+
31+
const finishElement = await session.page.waitForSelector("#finish");
32+
const finishText = await finishElement?.evaluate((el) => el.textContent);
33+
expect(finishText).toBe("Hello World!");
34+
});
35+
36+
it("should timeout on excessive wait times", async () => {
37+
await session.page.click("button");
38+
39+
// Attempt to find a non-existent element with short timeout
40+
try {
41+
await session.page.waitForSelector("#nonexistent", { timeout: 1000 });
42+
expect(true).toBe(false); // Should not reach here
43+
} catch (error: any) {
44+
expect(error.message).toContain("timeout");
45+
}
46+
});
47+
});
48+
49+
describe("Dynamic Controls Tests", () => {
50+
beforeEach(async () => {
51+
await session.page.goto(`${baseUrl}/dynamic_controls`);
52+
});
53+
54+
it("should wait for element state changes", async () => {
55+
// Click remove button
56+
await session.page.click('button:has-text("Remove")');
57+
58+
// Wait for checkbox to be removed
59+
await session.page.waitForSelector("#checkbox", { hidden: true });
60+
61+
// Verify gone message
62+
const message = await session.page.waitForSelector("#message");
63+
const messageText = await message?.evaluate((el) => el.textContent);
64+
expect(messageText).toContain("It's gone!");
65+
});
66+
67+
it("should handle multiple sequential dynamic changes", async () => {
68+
// Remove checkbox
69+
await session.page.click('button:has-text("Remove")');
70+
await session.page.waitForSelector("#checkbox", { hidden: true });
71+
72+
// Add checkbox back
73+
await session.page.click('button:has-text("Add")');
74+
await session.page.waitForSelector("#checkbox");
75+
76+
// Verify checkbox is present
77+
const checkbox = await session.page.$("#checkbox");
78+
expect(checkbox).toBeTruthy();
79+
});
80+
});
81+
});

0 commit comments

Comments
 (0)