Make it work.
Some checks failed
CI / build (20.x) (push) Has been cancelled
CI / build (22.x) (push) Has been cancelled

This commit is contained in:
2025-07-20 04:26:50 -05:00
parent 5ab210f2bf
commit 73109c42a0
6 changed files with 500 additions and 146 deletions

View File

@ -26,6 +26,29 @@ suite('useraccesstokens plugin', () => {
let tempDir
let tokenManager
// Realistic user objects that match what OAuth2/Passport provide
const testUser1 = {
displayName: 'John Doe',
email: 'john@example.com',
provider: 'github',
id: '12345'
}
const testUser2 = {
displayName: 'Jane Smith',
email: 'jane@example.com',
provider: 'google',
id: '67890'
}
// Same user object but different reference (tests object equality)
const testUser1Copy = {
displayName: 'John Doe',
email: 'john@example.com',
provider: 'github',
id: '12345'
}
// Setup before each test
const setup = async () => {
tempDir = path.join(__dirname, 'temp-' + Date.now())
@ -58,18 +81,18 @@ suite('useraccesstokens plugin', () => {
test('can create and validate tokens', async () => {
await setup()
try {
const result = await tokenManager.createToken('testuser', 'test-token')
const result = await tokenManager.createToken(testUser1, 'test-token')
assert(result.token.startsWith('fwuat-'))
assert.equal(result.record.name, 'test-token')
assert.equal(result.record.user, 'testuser')
assert.deepEqual(result.record.user, testUser1)
assert.equal(result.record.revoked, false)
assert(result.record.created)
assert(result.record.displayHint)
const validation = await tokenManager.validateToken(result.token)
assert(validation)
assert.equal(validation.user, 'testuser')
assert.deepEqual(validation.user, testUser1)
assert.equal(validation.name, 'test-token')
} finally {
await cleanup()
@ -79,21 +102,21 @@ suite('useraccesstokens plugin', () => {
test('can list user tokens safely', async () => {
await setup()
try {
await tokenManager.createToken('user1', 'token1')
await tokenManager.createToken('user1', 'token2')
await tokenManager.createToken('user2', 'token3')
await tokenManager.createToken(testUser1, 'token1')
await tokenManager.createToken(testUser1, 'token2')
await tokenManager.createToken(testUser2, 'token3')
const user1Tokens = await tokenManager.listTokens('user1')
const user1Tokens = await tokenManager.listTokens(testUser1)
assert.equal(user1Tokens.length, 2)
// Verify tokenHash is not included in the response
user1Tokens.forEach(token => {
assert(!token.tokenHash)
assert(token.displayHint)
assert.equal(token.user, 'user1')
assert.deepEqual(token.user, testUser1)
})
const user2Tokens = await tokenManager.listTokens('user2')
const user2Tokens = await tokenManager.listTokens(testUser2)
assert.equal(user2Tokens.length, 1)
} finally {
await cleanup()
@ -103,14 +126,14 @@ suite('useraccesstokens plugin', () => {
test('can revoke tokens', async () => {
await setup()
try {
const result = await tokenManager.createToken('testuser', 'test-token')
const result = await tokenManager.createToken(testUser1, 'test-token')
// Token should work before revocation
let validation = await tokenManager.validateToken(result.token)
assert(validation)
// Revoke the token
await tokenManager.revokeToken('testuser', 'test-token')
await tokenManager.revokeToken(testUser1, 'test-token')
// Token should not work after revocation
validation = await tokenManager.validateToken(result.token)
@ -123,10 +146,10 @@ suite('useraccesstokens plugin', () => {
test('rejects duplicate token names for same user', async () => {
await setup()
try {
await tokenManager.createToken('testuser', 'duplicate-name')
await tokenManager.createToken(testUser1, 'duplicate-name')
try {
await tokenManager.createToken('testuser', 'duplicate-name')
await tokenManager.createToken(testUser1, 'duplicate-name')
assert.fail('Should have thrown an error for duplicate name')
} catch (error) {
assert(error.message.includes('already exists'))
@ -140,7 +163,7 @@ suite('useraccesstokens plugin', () => {
await setup()
try {
// Create token that expires immediately (for testing)
const result = await tokenManager.createToken('testuser', 'expired-token', -1)
const result = await tokenManager.createToken(testUser1, 'expired-token', -1)
// Token should be expired and not validate
const validation = await tokenManager.validateToken(result.token)
@ -149,5 +172,47 @@ suite('useraccesstokens plugin', () => {
await cleanup()
}
})
test('correctly handles object equality for user comparisons', async () => {
await setup()
try {
// Create token with testUser1
const result = await tokenManager.createToken(testUser1, 'test-token')
// List tokens using testUser1Copy (same content, different object reference)
const tokens = await tokenManager.listTokens(testUser1Copy)
assert.equal(tokens.length, 1)
assert.equal(tokens[0].name, 'test-token')
// Revoke token using testUser1Copy
await tokenManager.revokeToken(testUser1Copy, 'test-token')
// Verify token is revoked
const validation = await tokenManager.validateToken(result.token)
assert.equal(validation, null)
} finally {
await cleanup()
}
})
test('can delete tokens with object user equality', async () => {
await setup()
try {
await tokenManager.createToken(testUser1, 'token-to-delete')
// Verify token exists
let tokens = await tokenManager.listTokens(testUser1)
assert.equal(tokens.length, 1)
// Delete using testUser1Copy (same content, different reference)
await tokenManager.deleteToken(testUser1Copy, 'token-to-delete')
// Verify token is gone
tokens = await tokenManager.listTokens(testUser1)
assert.equal(tokens.length, 0)
} finally {
await cleanup()
}
})
})
})