Skip to content

Commit 96d929c

Browse files
authored
Merge pull request #161 from simonredfern/develop
fixing regression VITE_OBP_OIDC_CLIENT_ID VITE_OBP_OIDC_CLIENT_SECRET
2 parents 9af4ec4 + b9a0493 commit 96d929c

16 files changed

Lines changed: 171 additions & 58 deletions

ai_env.example

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ VITE_CHATBOT_ENABLED=false
1515
VITE_CHATBOT_URL=http://localhost:5000 # Opey chatbot service URL (only needed if chatbot is enabled)
1616

1717
### OAuth2/OIDC Configuration ###
18-
VITE_OBP_OAUTH2_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779 # OAuth2 client ID (UUID - must match OIDC server registration)
19-
VITE_OBP_OAUTH2_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM # OAuth2 client secret (keep this secure!)
18+
VITE_OBP_OIDC_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779 # OAuth2 client ID (UUID - must match OIDC server registration)
19+
VITE_OBP_OIDC_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM # OAuth2 client secret (keep this secure!)
2020
VITE_OBP_OAUTH2_REDIRECT_URL=http://localhost:5173/api/oauth2/callback # OAuth2 callback URL (must exactly match OIDC client registration)
2121
VITE_OBP_OAUTH2_WELL_KNOWN_URL=http://localhost:9000/obp-oidc/.well-known/openid-configuration # OIDC discovery endpoint URL
2222
VITE_OBP_OAUTH2_TOKEN_REFRESH_THRESHOLD=300 # Seconds before token expiry to trigger refresh (default: 300)

docs/playwright-friendly-html.md

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# Building Playwright-Friendly Web Pages
2+
3+
Tips for writing HTML that is easy to test and resilient to CSS/styling changes.
4+
5+
## Use `data-testid` attributes
6+
7+
The single most impactful thing you can do. Test IDs survive class renames, component refactors, and redesigns.
8+
9+
```html
10+
<!-- Good: stable test anchor -->
11+
<button data-testid="submit-registration">Register</button>
12+
13+
<!-- Fragile: breaks if class or text changes -->
14+
<button class="btn-primary text-sm rounded-lg">Register</button>
15+
```
16+
17+
```ts
18+
// In Playwright
19+
page.getByTestId('submit-registration')
20+
```
21+
22+
Playwright has built-in support via `getByTestId()`. You can configure the attribute name in `playwright.config.ts` if you prefer something like `data-test` or `data-cy`.
23+
24+
## Use semantic HTML and ARIA attributes
25+
26+
Semantic elements and ARIA roles give tests meaningful anchors that also improve accessibility.
27+
28+
```html
29+
<form aria-label="registration">
30+
<input name="username" aria-label="Username" />
31+
<button type="submit" aria-label="submit">Register</button>
32+
</form>
33+
```
34+
35+
```ts
36+
page.getByRole('form', { name: 'registration' })
37+
page.getByRole('textbox', { name: 'Username' })
38+
page.getByRole('button', { name: 'submit' })
39+
```
40+
41+
These selectors are independent of CSS classes, tag nesting, and visual layout.
42+
43+
## Use `name` attributes on form inputs
44+
45+
The `name` attribute is stable, functional (needed for form submission), and unlikely to change for cosmetic reasons.
46+
47+
```html
48+
<input name="first_name" />
49+
<input name="email" />
50+
```
51+
52+
```ts
53+
page.locator('input[name="first_name"]')
54+
page.locator('input[name="email"]')
55+
```
56+
57+
## Avoid selectors tied to styling
58+
59+
| Fragile | Why | Better alternative |
60+
|---|---|---|
61+
| `.btn-primary` | Styling class, changes with redesigns | `data-testid="submit-btn"` |
62+
| `.flex.items-center.space-x-3` | Layout utility classes | `data-testid="provider-row"` |
63+
| `div > div > button` | Structural coupling, breaks with refactors | `button[data-testid="..."]` |
64+
| `:nth-child(2)` | Position-dependent, breaks if order changes | `data-testid` on each item |
65+
66+
## Give distinct identities to repeated items
67+
68+
When you have lists of similar elements, give each one a unique test ID.
69+
70+
```html
71+
<!-- Good: each document row is identifiable -->
72+
<div data-testid="legal-doc-terms-of-service">
73+
<span>Terms of Service</span>
74+
<button data-testid="accept-terms-of-service">Read & Accept</button>
75+
</div>
76+
<div data-testid="legal-doc-privacy-policy">
77+
<span>Privacy Policy</span>
78+
<button data-testid="accept-privacy-policy">Read & Accept</button>
79+
</div>
80+
```
81+
82+
```ts
83+
// Direct, no ambiguity
84+
page.getByTestId('accept-privacy-policy').click()
85+
```
86+
87+
Without this, tests resort to fragile text matching or positional selectors to distinguish items.
88+
89+
## Mark key states with data attributes
90+
91+
Expose UI state in the DOM so tests can assert on it directly.
92+
93+
```html
94+
<div data-testid="role-checker" data-state="collapsed">...</div>
95+
<div data-testid="role-checker" data-state="expanded">...</div>
96+
```
97+
98+
```ts
99+
await expect(page.getByTestId('role-checker')).toHaveAttribute('data-state', 'expanded')
100+
```
101+
102+
This is more reliable than checking for CSS classes like `.expanded` which may be renamed.
103+
104+
## Summary
105+
106+
| Principle | Effect |
107+
|---|---|
108+
| Add `data-testid` to interactive and assertable elements | Tests don't break on styling changes |
109+
| Use semantic HTML + ARIA | Tests read like user intent, not DOM spelunking |
110+
| Use `name` on form fields | Stable, functional anchors |
111+
| Avoid class-based and structural selectors | Decouples tests from CSS and layout |
112+
| Give unique IDs to repeated items | Eliminates ambiguous selectors |
113+
| Expose state via data attributes | Clean assertions without class sniffing |

server/services/OAuth2ProviderFactory.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,10 @@ export class OAuth2ProviderFactory {
7272
process.env.VITE_OAUTH2_REDIRECT_URL || 'http://localhost:5173/api/oauth2/callback'
7373

7474
// OBP-OIDC Strategy
75-
if (process.env.VITE_OBP_OAUTH2_CLIENT_ID) {
75+
if (process.env.VITE_OBP_OIDC_CLIENT_ID) {
7676
this.strategies.set('obp-oidc', {
77-
clientId: process.env.VITE_OBP_OAUTH2_CLIENT_ID,
78-
clientSecret: process.env.VITE_OBP_OAUTH2_CLIENT_SECRET || '',
77+
clientId: process.env.VITE_OBP_OIDC_CLIENT_ID,
78+
clientSecret: process.env.VITE_OBP_OIDC_CLIENT_SECRET || '',
7979
redirectUri: sharedRedirectUri,
8080
scopes: ['openid', 'profile', 'email']
8181
})
@@ -133,7 +133,7 @@ export class OAuth2ProviderFactory {
133133
console.warn('OAuth2ProviderFactory: WARNING - No provider strategies configured!')
134134
console.warn('OAuth2ProviderFactory: Set environment variables for at least one provider')
135135
console.warn(
136-
'OAuth2ProviderFactory: Example: VITE_OBP_OAUTH2_CLIENT_ID, VITE_OBP_OAUTH2_CLIENT_SECRET'
136+
'OAuth2ProviderFactory: Example: VITE_OBP_OIDC_CLIENT_ID, VITE_OBP_OIDC_CLIENT_SECRET'
137137
)
138138
}
139139
}
File renamed without changes.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ UPDATED:
103103
Environment Variables (per provider):
104104

105105
# OBP-OIDC
106-
VITE_OBP_OAUTH2_CLIENT_ID=your-client-id
107-
VITE_OBP_OAUTH2_CLIENT_SECRET=your-secret
106+
VITE_OBP_OIDC_CLIENT_ID=your-client-id
107+
VITE_OBP_OIDC_CLIENT_SECRET=your-secret
108108
VITE_OBP_OAUTH2_REDIRECT_URL=http://localhost:5173/api/oauth2/callback
109109

110110
# Keycloak
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
1111
┌─────────────────────────────────────────┐
1212
│ Load Environment Variables │
13-
│ - VITE_OBP_OAUTH2_CLIENT_ID
13+
│ - VITE_OBP_OIDC_CLIENT_ID
1414
│ - VITE_KEYCLOAK_CLIENT_ID │
1515
│ - VITE_GOOGLE_CLIENT_ID (optional) │
1616
└─────────────────────────────────────────┘

MULTI-OIDC-IMPLEMENTATION-STATUS.md renamed to temp_docs/MULTI-OIDC-IMPLEMENTATION-STATUS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,8 @@ This document tracks the implementation status of multiple OIDC provider support
188188

189189
```bash
190190
# OBP-OIDC Provider (Required for OBP-OIDC)
191-
VITE_OBP_OAUTH2_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
192-
VITE_OBP_OAUTH2_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
191+
VITE_OBP_OIDC_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
192+
VITE_OBP_OIDC_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
193193
VITE_OBP_OAUTH2_REDIRECT_URL=http://localhost:5173/api/oauth2/callback
194194

195195
# Keycloak Provider (Optional)

MULTI-OIDC-PROVIDER-IMPLEMENTATION.md renamed to temp_docs/MULTI-OIDC-PROVIDER-IMPLEMENTATION.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ export class OAuth2Service {
6464
private wellKnownUrl: string = ''
6565

6666
constructor() {
67-
this.clientId = process.env.VITE_OBP_OAUTH2_CLIENT_ID || ''
68-
this.clientSecret = process.env.VITE_OBP_OAUTH2_CLIENT_SECRET || ''
67+
this.clientId = process.env.VITE_OBP_OIDC_CLIENT_ID || ''
68+
this.clientSecret = process.env.VITE_OBP_OIDC_CLIENT_SECRET || ''
6969
this.redirectUri = process.env.VITE_OBP_OAUTH2_REDIRECT_URL || ''
7070
this.client = new OAuth2Client(this.clientId, this.clientSecret, this.redirectUri)
7171
}
@@ -83,8 +83,8 @@ export class OAuth2Service {
8383

8484
```bash
8585
VITE_OBP_OAUTH2_WELL_KNOWN_URL=http://127.0.0.1:9000/obp-oidc/.well-known/openid-configuration
86-
VITE_OBP_OAUTH2_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
87-
VITE_OBP_OAUTH2_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
86+
VITE_OBP_OIDC_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
87+
VITE_OBP_OIDC_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
8888
VITE_OBP_OAUTH2_REDIRECT_URL=http://localhost:5173/api/oauth2/callback
8989
```
9090

@@ -727,10 +727,10 @@ export class OAuth2ProviderFactory {
727727
console.log('OAuth2ProviderFactory: Loading provider strategies...')
728728

729729
// OBP-OIDC Strategy
730-
if (process.env.VITE_OBP_OAUTH2_CLIENT_ID) {
730+
if (process.env.VITE_OBP_OIDC_CLIENT_ID) {
731731
this.strategies.set('obp-oidc', {
732-
clientId: process.env.VITE_OBP_OAUTH2_CLIENT_ID,
733-
clientSecret: process.env.VITE_OBP_OAUTH2_CLIENT_SECRET || '',
732+
clientId: process.env.VITE_OBP_OIDC_CLIENT_ID,
733+
clientSecret: process.env.VITE_OBP_OIDC_CLIENT_SECRET || '',
734734
redirectUri:
735735
process.env.VITE_OBP_OAUTH2_REDIRECT_URL || 'http://localhost:5173/api/oauth2/callback',
736736
scopes: ['openid', 'profile', 'email']
@@ -1658,8 +1658,8 @@ VITE_OBP_API_VERSION=v5.1.0
16581658
# ============================================
16591659

16601660
# OBP-OIDC Provider
1661-
VITE_OBP_OAUTH2_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
1662-
VITE_OBP_OAUTH2_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
1661+
VITE_OBP_OIDC_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
1662+
VITE_OBP_OIDC_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
16631663
VITE_OBP_OAUTH2_REDIRECT_URL=http://localhost:5173/api/oauth2/callback
16641664

16651665
# Keycloak Provider (Optional)
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ This document provides a high-level summary of implementing multiple OIDC provid
1212

1313
```bash
1414
VITE_OBP_OAUTH2_WELL_KNOWN_URL=http://localhost:9000/obp-oidc/.well-known/openid-configuration
15-
VITE_OBP_OAUTH2_CLIENT_ID=<client-id>
16-
VITE_OBP_OAUTH2_CLIENT_SECRET=<client-secret>
15+
VITE_OBP_OIDC_CLIENT_ID=<client-id>
16+
VITE_OBP_OIDC_CLIENT_SECRET=<client-secret>
1717
```
1818

1919
**Limitations:**
@@ -86,8 +86,8 @@ GET /obp/v5.1.0/well-known
8686
**Strategy Pattern:**
8787
```typescript
8888
strategies.set('obp-oidc', {
89-
clientId: process.env.VITE_OBP_OAUTH2_CLIENT_ID,
90-
clientSecret: process.env.VITE_OBP_OAUTH2_CLIENT_SECRET,
89+
clientId: process.env.VITE_OBP_OIDC_CLIENT_ID,
90+
clientSecret: process.env.VITE_OBP_OIDC_CLIENT_SECRET,
9191
redirectUri: process.env.VITE_OBP_OAUTH2_REDIRECT_URL
9292
})
9393

@@ -223,8 +223,8 @@ GET /api/oauth2/callback?code=xxx&state=yyy
223223
224224
```bash
225225
# OBP-OIDC Provider
226-
VITE_OBP_OAUTH2_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
227-
VITE_OBP_OAUTH2_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
226+
VITE_OBP_OIDC_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
227+
VITE_OBP_OIDC_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
228228
VITE_OBP_OAUTH2_REDIRECT_URL=http://localhost:5173/api/oauth2/callback
229229

230230
# Keycloak Provider
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ Set up your `.env` file with provider credentials:
6262
VITE_OBP_API_HOST=localhost:8080
6363

6464
# OBP-OIDC Provider
65-
VITE_OBP_OAUTH2_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
66-
VITE_OBP_OAUTH2_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
65+
VITE_OBP_OIDC_CLIENT_ID=48ac28e9-9ee3-47fd-8448-69a62764b779
66+
VITE_OBP_OIDC_CLIENT_SECRET=fOTQF7jfg8C74u7ZhSjVQpoBYvD0KpWfM5UsEZBSFFM
6767
VITE_OBP_OAUTH2_REDIRECT_URL=http://localhost:5173/api/oauth2/callback
6868

6969
# Keycloak Provider (optional)

0 commit comments

Comments
 (0)