Refactored frontend directory
Some checks failed
Chore App Build, Test, and Push Docker Images / build-and-push (push) Failing after 2m46s
Some checks failed
Chore App Build, Test, and Push Docker Images / build-and-push (push) Failing after 2m46s
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# vue-app
|
||||
# frontend
|
||||
|
||||
This template should help get you started developing with Vue 3 in Vite.
|
||||
|
||||
@@ -9,7 +9,7 @@ This template should help get you started developing with Vue 3 in Vite.
|
||||
## Recommended Browser Setup
|
||||
|
||||
- Chromium-based browsers (Chrome, Edge, Brave, etc.):
|
||||
- [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)
|
||||
- [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)
|
||||
- [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters)
|
||||
- Firefox:
|
||||
- [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/)
|
||||
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 156 KiB |
@@ -2,20 +2,20 @@
|
||||
"cookies": [
|
||||
{
|
||||
"name": "refresh_token",
|
||||
"value": "yQZhoeeYUidDfolHE467zNEWguWXzMIinFT1LNLU5yM",
|
||||
"value": "oh4sQB_Q1Se4xydZHTIolU6FhvlKPIlDPsxfd_qe4wQ",
|
||||
"domain": "localhost",
|
||||
"path": "/api/auth",
|
||||
"expires": 1784509278.633774,
|
||||
"expires": 1784867824.852037,
|
||||
"httpOnly": true,
|
||||
"secure": true,
|
||||
"sameSite": "Strict"
|
||||
},
|
||||
{
|
||||
"name": "access_token",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1jY0B0ZXN0LmNvbSIsInVzZXJfaWQiOiI4ZmZkYTMyNC01MDE1LTRiYjktODY3Yi1jZjFlNTU1NjBjMzciLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzY3MzQxNzh9.YvFGLV1bdoRpRb8z5YtO19dpD7vkC0p5XMhGJgSJol8",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1jY0B0ZXN0LmNvbSIsInVzZXJfaWQiOiI4NGY1Y2I3NS05NWU1LTRjMTItOTExOS02MzdkYjJlMWY1MGYiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzcwOTI3MjR9.7-d4EvJEYtYSi_5ZFiU7tuxgc4ilVMBxhwzgAQZNTvY",
|
||||
"domain": "localhost",
|
||||
"path": "/",
|
||||
"expires": 1776734178.633726,
|
||||
"expires": 1777092724.851439,
|
||||
"httpOnly": true,
|
||||
"secure": true,
|
||||
"sameSite": "Lax"
|
||||
@@ -27,11 +27,11 @@
|
||||
"localStorage": [
|
||||
{
|
||||
"name": "authSyncEvent",
|
||||
"value": "{\"type\":\"logout\",\"at\":1776733278500}"
|
||||
"value": "{\"type\":\"logout\",\"at\":1777091824594}"
|
||||
},
|
||||
{
|
||||
"name": "parentAuth",
|
||||
"value": "{\"expiresAt\":1776906078798}"
|
||||
"value": "{\"expiresAt\":1777264625262}"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -2,20 +2,20 @@
|
||||
"cookies": [
|
||||
{
|
||||
"name": "refresh_token",
|
||||
"value": "j90QCKu8d9QvNG-k-m31G5PoxU0yBuz-wyx8NPYCOG8",
|
||||
"value": "lIhurtvmo0oGcimN_8v59h9y3CrglEAloQO1QFw8RsQ",
|
||||
"domain": "localhost",
|
||||
"path": "/api/auth",
|
||||
"expires": 1784509278.541961,
|
||||
"expires": 1784867824.995155,
|
||||
"httpOnly": true,
|
||||
"secure": true,
|
||||
"sameSite": "Strict"
|
||||
},
|
||||
{
|
||||
"name": "access_token",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1kZWxldGVAdGVzdC5jb20iLCJ1c2VyX2lkIjoiNzA3ZGYwYmUtOWQxMy00MGVlLWI3M2QtYzYwZmFmNDg2NmU2IiwidG9rZW5fdmVyc2lvbiI6MCwiZXhwIjoxNzc2NzM0MTc4fQ.cEKtxo4zVTd7kBZzfjjI_uxqez32gUxmZYuUa8-RYdc",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZS1kZWxldGVAdGVzdC5jb20iLCJ1c2VyX2lkIjoiOWYzYTljNWMtM2IwMy00YTZlLTliNmUtYjE0MTQzZWNhMzNkIiwidG9rZW5fdmVyc2lvbiI6MCwiZXhwIjoxNzc3MDkyNzI0fQ.UB5MCIZ2PHbn3UyohNzmFbOCb3TR-KHxJPWB9qkWwCQ",
|
||||
"domain": "localhost",
|
||||
"path": "/",
|
||||
"expires": 1776734178.541918,
|
||||
"expires": 1777092724.99406,
|
||||
"httpOnly": true,
|
||||
"secure": true,
|
||||
"sameSite": "Lax"
|
||||
@@ -27,11 +27,11 @@
|
||||
"localStorage": [
|
||||
{
|
||||
"name": "authSyncEvent",
|
||||
"value": "{\"type\":\"logout\",\"at\":1776733278395}"
|
||||
"value": "{\"type\":\"logout\",\"at\":1777091824687}"
|
||||
},
|
||||
{
|
||||
"name": "parentAuth",
|
||||
"value": "{\"expiresAt\":1776906078675}"
|
||||
"value": "{\"expiresAt\":1777264625511}"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -2,20 +2,20 @@
|
||||
"cookies": [
|
||||
{
|
||||
"name": "refresh_token",
|
||||
"value": "RETiHvb_RUs2-0xb-klx8BwvSwr2TMtz1D-NmB5825Y",
|
||||
"value": "uMExObHukEdFnlszorcDq2XlbRW0AeIV71x_vSovEF4",
|
||||
"domain": "localhost",
|
||||
"path": "/api/auth",
|
||||
"expires": 1784509276.929905,
|
||||
"expires": 1784867821.107956,
|
||||
"httpOnly": true,
|
||||
"secure": true,
|
||||
"sameSite": "Strict"
|
||||
},
|
||||
{
|
||||
"name": "access_token",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZUB0ZXN0LmNvbSIsInVzZXJfaWQiOiJhNjZmYjdjNy04ZDI5LTRkNjAtYmVjNi0zMmEzODg1MGI1OGIiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzY3MzQxNzZ9.WSka-ZbN1ZKbD_Q4UpoP9qfN1i73G51nrx88F2TbbOE",
|
||||
"value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImUyZUB0ZXN0LmNvbSIsInVzZXJfaWQiOiI2ZWE5YWZmZC1jMGExLTRkMzUtOGJmYS1mZDBkOWY5NzFmOWQiLCJ0b2tlbl92ZXJzaW9uIjowLCJleHAiOjE3NzcwOTI3MjF9.rb64zKqS6uXqkgX_4kke37Rc6om68elt4Qa24Fy9NPo",
|
||||
"domain": "localhost",
|
||||
"path": "/",
|
||||
"expires": 1776734176.929863,
|
||||
"expires": 1777092721.107403,
|
||||
"httpOnly": true,
|
||||
"secure": true,
|
||||
"sameSite": "Lax"
|
||||
@@ -27,11 +27,11 @@
|
||||
"localStorage": [
|
||||
{
|
||||
"name": "authSyncEvent",
|
||||
"value": "{\"type\":\"logout\",\"at\":1776733276784}"
|
||||
"value": "{\"type\":\"logout\",\"at\":1777091820880}"
|
||||
},
|
||||
{
|
||||
"name": "parentAuth",
|
||||
"value": "{\"expiresAt\":1776906077058}"
|
||||
"value": "{\"expiresAt\":1777264621275}"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 409 KiB After Width: | Height: | Size: 409 KiB |
@@ -98,8 +98,9 @@ test.describe('Digest Action Token — Approve Chore', () => {
|
||||
test('Approve-chore action is performed: points awarded and confirmation removed', async ({
|
||||
request,
|
||||
}) => {
|
||||
// Wait for action to complete
|
||||
await new Promise((r) => setTimeout(r, 300))
|
||||
// Execute the action via authenticated POST (GET only redirects, POST consumes the token)
|
||||
const execRes = await request.post(`/api/digest-action/${approveToken}`)
|
||||
expect(execRes.status()).toBe(200)
|
||||
|
||||
const childRes = await request.get(`/api/child/list`)
|
||||
const children = (await childRes.json()).children ?? []
|
||||
@@ -93,7 +93,9 @@ test.describe('Digest Action Token — Approve Reward', () => {
|
||||
|
||||
// 7.6 Approve-reward action: reward triggered, child points deducted
|
||||
test('Approve-reward action: reward triggered and child points deducted', async ({ request }) => {
|
||||
await new Promise((r) => setTimeout(r, 300))
|
||||
// Execute the action via authenticated POST (GET only redirects, POST consumes the token)
|
||||
const execRes = await request.post(`/api/digest-action/${approveToken}`)
|
||||
expect(execRes.status()).toBe(200)
|
||||
|
||||
const childRes = await request.get('/api/child/list')
|
||||
const children = (await childRes.json()).children ?? []
|
||||
@@ -87,7 +87,9 @@ test.describe('Digest Action Token — Deny Chore', () => {
|
||||
test('Deny-chore action is performed: confirmation removed, points unchanged', async ({
|
||||
request,
|
||||
}) => {
|
||||
await new Promise((r) => setTimeout(r, 300))
|
||||
// Execute the action via authenticated POST (GET only redirects, POST consumes the token)
|
||||
const execRes = await request.post(`/api/digest-action/${denyToken}`)
|
||||
expect(execRes.status()).toBe(200)
|
||||
|
||||
const childRes = await request.get(`/api/child/list`)
|
||||
const children = (await childRes.json()).children ?? []
|
||||
@@ -92,7 +92,9 @@ test.describe('Digest Action Token — Deny Reward', () => {
|
||||
|
||||
// 7.8 Deny-reward action: pending request removed, points unchanged
|
||||
test('Deny-reward action: pending request removed and points unchanged', async ({ request }) => {
|
||||
await new Promise((r) => setTimeout(r, 300))
|
||||
// Execute the action via authenticated POST (GET only redirects, POST consumes the token)
|
||||
const execRes = await request.post(`/api/digest-action/${denyToken}`)
|
||||
expect(execRes.status()).toBe(200)
|
||||
|
||||
const childRes = await request.get('/api/child/list')
|
||||
const children = (await childRes.json()).children ?? []
|
||||
@@ -94,11 +94,11 @@ test.describe('Digest Action Token — Error Paths', () => {
|
||||
|
||||
const unauthCtx = await getUnauthContext(playwright)
|
||||
|
||||
// First use — should succeed (302)
|
||||
const first = await unauthCtx.get(`/api/digest-action/${token}`, { maxRedirects: 0 })
|
||||
expect(first.status()).toBe(302)
|
||||
// First use — authenticated POST executes and consumes the token
|
||||
const first = await request.post(`/api/digest-action/${token}`)
|
||||
expect(first.status()).toBe(200)
|
||||
|
||||
// Second use — token is consumed
|
||||
// Second use — token is consumed, unauthenticated GET should return 400
|
||||
const second = await unauthCtx.get(`/api/digest-action/${token}`, { maxRedirects: 0 })
|
||||
expect(second.status()).toBe(400)
|
||||
await unauthCtx.dispose()
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user