Add E2E testing infrastructure with WebdriverIO + Appium
Set up E2E test framework for Android using WebdriverIO, Appium, and UiAutomator2. Add testID props to key components (AuthButton, BaseButton, ChatBubble, CustomTextInput, ProposedEventCard) and apply testIDs to login screen, chat screen, tab bar, and settings. Include initial tests for app launch detection and login flow validation. Update CLAUDE.md with E2E docs.
This commit is contained in:
49
apps/client/e2e/tests/01-app-launch.test.ts
Normal file
49
apps/client/e2e/tests/01-app-launch.test.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
import { initDriver, getDriver } from "../helpers/driver";
|
||||
import { TestIDs } from "../helpers/selectors";
|
||||
import { waitForTestId } from "../helpers/utils";
|
||||
|
||||
describe("App Launch", () => {
|
||||
beforeAll(async () => {
|
||||
await initDriver();
|
||||
const driver = getDriver();
|
||||
|
||||
// Dismiss Expo Go banner by tapping near the top of the screen
|
||||
await driver.pause(3000);
|
||||
const { width } = await driver.getWindowSize();
|
||||
await driver.touchAction({ action: "tap", x: Math.round(width / 2), y: 100 });
|
||||
await driver.pause(500);
|
||||
});
|
||||
|
||||
it("should launch the app and show login or chat screen", async () => {
|
||||
const driver = getDriver();
|
||||
|
||||
// Wait for either the login screen or the chat screen to appear
|
||||
// Try login first with a long timeout (app needs to fully load)
|
||||
try {
|
||||
await waitForTestId(driver, TestIDs.LOGIN_TITLE, 30_000);
|
||||
// On login screen — verify elements
|
||||
const identifierInput = await waitForTestId(
|
||||
driver,
|
||||
TestIDs.LOGIN_IDENTIFIER_INPUT,
|
||||
);
|
||||
expect(await identifierInput.isDisplayed()).toBe(true);
|
||||
|
||||
const passwordInput = await waitForTestId(
|
||||
driver,
|
||||
TestIDs.LOGIN_PASSWORD_INPUT,
|
||||
);
|
||||
expect(await passwordInput.isDisplayed()).toBe(true);
|
||||
|
||||
const loginButton = await waitForTestId(driver, TestIDs.LOGIN_BUTTON);
|
||||
expect(await loginButton.isDisplayed()).toBe(true);
|
||||
} catch {
|
||||
// Not on login — should be on chat screen (auto-login)
|
||||
const chatInput = await waitForTestId(
|
||||
driver,
|
||||
TestIDs.CHAT_MESSAGE_INPUT,
|
||||
30_000,
|
||||
);
|
||||
expect(await chatInput.isDisplayed()).toBe(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
73
apps/client/e2e/tests/02-login.test.ts
Normal file
73
apps/client/e2e/tests/02-login.test.ts
Normal file
@@ -0,0 +1,73 @@
|
||||
import { initDriver, getDriver, quitDriver } from "../helpers/driver";
|
||||
import { TestIDs } from "../helpers/selectors";
|
||||
import {
|
||||
waitForTestId,
|
||||
ensureOnLoginScreen,
|
||||
performLogin,
|
||||
} from "../helpers/utils";
|
||||
|
||||
describe("Login", () => {
|
||||
beforeAll(async () => {
|
||||
await initDriver();
|
||||
const driver = getDriver();
|
||||
|
||||
// Dismiss Expo Go banner by tapping near the top of the screen
|
||||
await driver.pause(3000);
|
||||
const { width } = await driver.getWindowSize();
|
||||
await driver.touchAction({ action: "tap", x: Math.round(width / 2), y: 100 });
|
||||
await driver.pause(500);
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
const driver = getDriver();
|
||||
await ensureOnLoginScreen(driver);
|
||||
});
|
||||
|
||||
it("should show error when fields are empty", async () => {
|
||||
const driver = getDriver();
|
||||
|
||||
// Tap login without entering credentials
|
||||
const loginButton = await waitForTestId(driver, TestIDs.LOGIN_BUTTON);
|
||||
await loginButton.click();
|
||||
|
||||
// Error message should appear
|
||||
const errorText = await waitForTestId(driver, TestIDs.LOGIN_ERROR_TEXT);
|
||||
const text = await errorText.getText();
|
||||
expect(text).toContain("Bitte alle Felder");
|
||||
});
|
||||
|
||||
it("should show error for invalid credentials", async () => {
|
||||
const driver = getDriver();
|
||||
|
||||
await performLogin(driver, "invalid_user", "wrong_password");
|
||||
|
||||
// Wait for error message
|
||||
const errorText = await waitForTestId(
|
||||
driver,
|
||||
TestIDs.LOGIN_ERROR_TEXT,
|
||||
30_000,
|
||||
);
|
||||
const text = await errorText.getText();
|
||||
expect(text).toContain("Anmeldung fehlgeschlagen");
|
||||
});
|
||||
|
||||
it("should login successfully with valid credentials", async () => {
|
||||
const driver = getDriver();
|
||||
const testUser = process.env.TEST_USER || "test";
|
||||
const testPassword = process.env.TEST_PASSWORD || "test";
|
||||
|
||||
await performLogin(driver, testUser, testPassword);
|
||||
|
||||
// Chat screen should appear after successful login
|
||||
const chatInput = await waitForTestId(
|
||||
driver,
|
||||
TestIDs.CHAT_MESSAGE_INPUT,
|
||||
30_000,
|
||||
);
|
||||
expect(await chatInput.isDisplayed()).toBe(true);
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await quitDriver();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user