Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
590b047
Added Database checks to the onboarding flow
O-Bots Feb 22, 2026
d0debad
Added compatibility page setup
O-Bots Feb 25, 2026
543d5e5
Finished up the onboarding flow suite
O-Bots Mar 4, 2026
4293606
.
O-Bots Mar 4, 2026
03d957a
Fix: Merge conflict
O-Bots Mar 11, 2026
5283bec
.
O-Bots Mar 13, 2026
f4b1014
Fix: Added fix for None discriptive error issue #36
O-Bots Mar 15, 2026
d3bd1cb
Linting and Prettier
O-Bots Mar 15, 2026
45fc0e8
Minor cleaning
MartinBraquet Mar 15, 2026
dbca768
Organizing helper func
O-Bots Mar 16, 2026
53c048a
Added Google account to the Onboarding flow
O-Bots Mar 17, 2026
bd27bf0
Added account cleanup for google accounts
O-Bots Mar 18, 2026
b7057e2
Started work on Sign-in tests
O-Bots Mar 25, 2026
b6e0c22
Linting and Prettier
O-Bots Mar 25, 2026
992db24
Added checks to the deleteUser func to check if the accout exists
O-Bots Mar 26, 2026
064bbfb
Linting and Prettier
O-Bots Mar 26, 2026
de476bd
Added POM's for social and organisation page
O-Bots Mar 31, 2026
6b1dec0
Formatting update, fixed homePage locator for signin
O-Bots Apr 2, 2026
a750776
.
O-Bots Apr 2, 2026
e21de93
.
O-Bots Apr 2, 2026
851992b
.
O-Bots Apr 2, 2026
c4fc76d
Coderabbitai fix's
O-Bots Apr 2, 2026
615f64d
Fix
MartinBraquet Apr 3, 2026
dcd7e06
Improve test utilities and stabilize onboarding flow tests
MartinBraquet Apr 3, 2026
bdec007
Changes requested
O-Bots Apr 3, 2026
213757c
Seperated deletion tests from onboarding
O-Bots Apr 3, 2026
ada66a2
.
O-Bots Apr 4, 2026
4d2db53
Changed POM/Fixture structure to use an app class to instantiate the …
O-Bots Apr 4, 2026
9fbff67
Apply suggestion from @MartinBraquet
MartinBraquet Apr 4, 2026
ebba02c
Apply suggestion from @MartinBraquet
MartinBraquet Apr 4, 2026
071c046
Delete .vscode/settings.json
MartinBraquet Apr 4, 2026
4a452bd
Apply suggestion from @MartinBraquet
MartinBraquet Apr 4, 2026
b0b0c9a
Apply suggestions from code review
MartinBraquet Apr 4, 2026
8c78112
Apply suggestion from @MartinBraquet
MartinBraquet Apr 4, 2026
b339311
Apply suggestion from @MartinBraquet
MartinBraquet Apr 4, 2026
d432f2c
Linting and Prettier
O-Bots Apr 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ reviews:
enabled: true
# Skip auto-review if PR title contains these keywords
ignore_title_keywords:
- "WIP"
- 'WIP'
# Don't auto-review draft PRs
drafts: false
# Only auto-review PRs targeting these branches
Expand Down Expand Up @@ -57,17 +57,17 @@ reviews:

# Exclude these paths from reviews (build artifacts and dependencies)
path_filters:
- "!**/node_modules/**" # npm dependencies
- "!**/android/**" # Native Android build files
- "!**/ios/**" # Native iOS build files
- "!**/.expo/**" # Expo build cache
- "!**/.expo-shared/**" # Expo shared config
- "!**/dist/**" # Build output
- '!**/node_modules/**' # npm dependencies
- '!**/android/**' # Native Android build files
- '!**/ios/**' # Native iOS build files
- '!**/.expo/**' # Expo build cache
- '!**/.expo-shared/**' # Expo shared config
- '!**/dist/**' # Build output

# Custom review instructions for specific file patterns
path_instructions:
# TypeScript/JavaScript files - main app code
- path: "**/*.{ts,tsx,js,jsx}"
- path: '**/*.{ts,tsx,js,jsx}'
instructions: |
General practices:
- Summarize the changes clearly.
Expand All @@ -78,7 +78,7 @@ reviews:
- Flag any hardcoded strings; they should be in the constants file.
- Check for edge cases like null values or empty arrays.
- Suggest performance optimizations where appropriate.

Mobile best practices:
- Proper use of hooks (useRouter, useFonts, useAssets)
- Accessibility: touch targets min 44x44, screen reader support
Expand All @@ -105,7 +105,7 @@ reviews:
const message = t('key', 'english string')
```

- path: "tests/e2e/**/*.ts"
- path: 'tests/e2e/**/*.ts'
instructions: |
Playwright E2E test guidelines for this repo:
- Page objects live in `tests/e2e/web/pages/`. Each class wraps one page/route, holds only `private readonly` Locators, and exposes action methods.
Expand Down
2 changes: 1 addition & 1 deletion backend/api/tests/unit/get-profiles.unit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ describe('loadProfiles', () => {
})

describe('when an error occurs', () => {
it('throw if there is no compatability', async () => {
it('throw if there is no compatibility', async () => {
const props = {
orderBy: 'compatibility_score',
}
Expand Down
1 change: 0 additions & 1 deletion docs/TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,6 @@ jest.mock('path/to/module')
* This creates an object containing all named exports from ./path/to/module
*/
import * as mockModule from 'path/to/module'

;(mockModule.module as jest.Mock).mockResolvedValue(mockReturnValue)
```

Expand Down
1 change: 1 addition & 0 deletions tests/e2e/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"compilerOptions": {
"rootDir": "../../",
"module": "commonjs",
"jsx": "react-jsx",
"moduleResolution": "node",
Expand Down
1 change: 0 additions & 1 deletion tests/e2e/utils/firebaseUtils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import axios from 'axios'

import {config} from '../web/SPEC_CONFIG'

export async function firebaseLoginEmailPassword(
Expand Down
60 changes: 5 additions & 55 deletions tests/e2e/web/fixtures/base.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,11 @@
import {test as base} from '@playwright/test'

import {AuthPage} from '../pages/AuthPage'
import {ComatibilityPage} from '../pages/compatibilityPage'
import {HomePage} from '../pages/homePage'
import {OnboardingPage} from '../pages/onboardingPage'
import {OrganizationPage} from '../pages/organizationPage'
import {ProfilePage} from '../pages/profilePage'
import {SettingsPage} from '../pages/settingsPage'
import {SignUpPage} from '../pages/signUpPage'
import {SocialPage} from '../pages/socialPage'
import {testAccounts, UserAccountInformation} from '../utils/accountInformation'
import {deleteUser} from '../utils/deleteUser'
import {getAuthAccountInfo} from '../utils/networkUtils'
import {App} from '../pages/app'

export const test = base.extend<{
homePage: HomePage
onboardingPage: OnboardingPage
signUpPage: SignUpPage
profilePage: ProfilePage
authPage: AuthPage
settingsPage: SettingsPage
socialPage: SocialPage
organizationPage: OrganizationPage
compatabilityPage: ComatibilityPage
cleanUpUsers: void
app: App
onboardingAccount: UserAccountInformation
fakerAccount: UserAccountInformation
specAccount: UserAccountInformation
Expand Down Expand Up @@ -62,41 +44,9 @@ export const test = base.extend<{
console.log('Cleaning up spec account...')
await deleteUser('Email/Password', account)
},
onboardingPage: async ({page}, use) => {
const onboardingPage = new OnboardingPage(page)
await use(onboardingPage)
},
homePage: async ({page}, use) => {
const homePage = new HomePage(page)
await use(homePage)
},
signUpPage: async ({page}, use) => {
const signUpPage = new SignUpPage(page)
await use(signUpPage)
},
authPage: async ({page}, use) => {
const authPage = new AuthPage(page)
await use(authPage)
},
profilePage: async ({page}, use) => {
const profilePage = new ProfilePage(page)
await use(profilePage)
},
compatabilityPage: async ({page}, use) => {
const compatibilityPage = new ComatibilityPage(page)
await use(compatibilityPage)
},
settingsPage: async ({page}, use) => {
const settingsPage = new SettingsPage(page)
await use(settingsPage)
},
socialPage: async ({page}, use) => {
const socialPage = new SocialPage(page)
await use(socialPage)
},
organizationPage: async ({page}, use) => {
const organizationPage = new OrganizationPage(page)
await use(organizationPage)
app: async ({page}, use) => {
const appPage = new App(page)
await use(appPage)
},
})

Expand Down
40 changes: 5 additions & 35 deletions tests/e2e/web/fixtures/signInFixture.ts
Original file line number Diff line number Diff line change
@@ -1,47 +1,17 @@
import {test as base} from '@playwright/test'
import {AuthPage} from '../pages/AuthPage'
import {HomePage} from '../pages/homePage'
import {App} from '../pages/app'
import {testAccounts, UserAccountInformation} from '../utils/accountInformation'
import { OnboardingPage } from '../pages/onboardingPage'
import { SignUpPage } from '../pages/signUpPage'
import { ProfilePage } from '../pages/profilePage'
import { SettingsPage } from '../pages/settingsPage'

export const test = base.extend<{
homePage: HomePage
onboardingPage: OnboardingPage
signUpPage: SignUpPage
profilePage: ProfilePage
settingsPage: SettingsPage
authPage: AuthPage
app: App
dev_one_account: UserAccountInformation
fakerAccount: UserAccountInformation
googleAccountOne: UserAccountInformation
googleAccountTwo: UserAccountInformation
}>({
homePage: async ({page}, use) => {
const homePage = new HomePage(page)
await use(homePage)
},
onboardingPage: async ({page}, use) => {
const onboardingPage = new OnboardingPage(page)
await use(onboardingPage)
},
signUpPage: async ({page}, use) => {
const signUpPage = new SignUpPage(page)
await use(signUpPage)
},
profilePage: async ({page}, use) => {
const profilePage = new ProfilePage(page)
await use(profilePage)
},
settingsPage: async ({page}, use) => {
const settingsPage = new SettingsPage(page)
await use(settingsPage)
},
authPage: async ({page}, use) => {
const authPage = new AuthPage(page)
await use(authPage)
app: async ({page}, use) => {
const appPage = new App(page)
await use(appPage)
},
dev_one_account: async ({}, use) => {
const account = testAccounts.dev_one_account()
Expand Down
75 changes: 75 additions & 0 deletions tests/e2e/web/pages/app.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import {Page} from '@playwright/test'
import {UserAccountInformation} from '../utils/accountInformation'
import {AuthPage} from './authPage'
import {ComatibilityPage} from './compatibilityPage'
import {HomePage} from './homePage'
import {OnboardingPage} from './onboardingPage'
import {OrganizationPage} from './organizationPage'
import {ProfilePage} from './profilePage'
import {SettingsPage} from './settingsPage'
import {SignUpPage} from './signUpPage'
import {SocialPage} from './socialPage'

export class App {
readonly auth: AuthPage
readonly compatibility: ComatibilityPage
readonly home: HomePage
readonly onboarding: OnboardingPage
readonly organization: OrganizationPage
readonly profile: ProfilePage
readonly settings: SettingsPage
readonly signUp: SignUpPage
readonly social: SocialPage

constructor(public readonly page: Page) {
this.auth = new AuthPage(page)
this.compatibility = new ComatibilityPage(page)
this.home = new HomePage(page)
this.onboarding = new OnboardingPage(page)
this.organization = new OrganizationPage(page)
this.profile = new ProfilePage(page)
this.settings = new SettingsPage(page)
this.signUp = new SignUpPage(page)
this.social = new SocialPage(page)
}

async deleteProfileFromSettings() {
await this.home.clickSettingsLink()
await this.settings.clickDeleteAccountButton()
await this.settings.fillDeleteAccountSurvey('Delete me')
await this.settings.clickDeleteAccountButton()
await this.home.verifyHomePageLinks()
}

async skipOnboardingHeadToProfile(account: UserAccountInformation) {
await this.onboarding.clickSkipOnboardingButton()
await this.signUp.fillDisplayName(account.display_name)
await this.signUp.fillUsername(account.username)
await this.signUp.clickNextButton()
await this.signUp.clickNextButton()
await this.profile.clickCloseButton()
await this.onboarding.clickRefineProfileButton()
}

async registerWithEmail(account: UserAccountInformation) {
await this.home.goToRegisterPage()
await this.auth.fillEmailField(account.email)
await this.auth.fillPasswordField(account.password)
await this.auth.clickSignUpWithEmailButton()
}

async signinWithEmail(accountOrEmail: UserAccountInformation | string, password?: string) {
const email = typeof accountOrEmail === 'string' ? accountOrEmail : accountOrEmail.email

const resolvedPassword = typeof accountOrEmail === 'string' ? password : accountOrEmail.password

if (!email || !resolvedPassword) {
throw new Error('Provide either an `account` or `email` and `password`.')
}

await this.home.goToSigninPage()
await this.auth.fillEmailField(email)
await this.auth.fillPasswordField(resolvedPassword)
await this.auth.clickSignInWithEmailButton()
}
}
File renamed without changes.
Loading
Loading