Skip to content

Commit

Permalink
chore: separate test code
Browse files Browse the repository at this point in the history
  • Loading branch information
sanderPostma committed Nov 19, 2024
1 parent 50d37dd commit 0b3bf96
Show file tree
Hide file tree
Showing 13 changed files with 365 additions and 59 deletions.
5 changes: 4 additions & 1 deletion lerna.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,8 @@
"forceLocal": true,
"sort": true,
"stream": true,
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"ignoreChanges": [
"packages/oidf-resolution-tests/**"
]
}
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@
"@sphereon/ssi-sdk.agent-config": "0.30.2-feature.SDK.41.oidf.support.286",
"@sphereon/ssi-sdk.core": "0.30.2-feature.SDK.41.oidf.support.286",
"@sphereon/ssi-types": "0.30.2-feature.SDK.41.oidf.support.286",
"@sphereon/ssi-sdk-ext.identifier-resolution": "workspace:*",
"@digitalcredentials/ed25519-verification-key-2020": "3.2.2",
"*>@digitalcredentials/ed25519-verification-key-2020": "3.2.2",
"did-jwt": "6.11.6",
Expand Down
4 changes: 0 additions & 4 deletions packages/jwt-service/__tests__/localAgent.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ import { Resolver } from 'did-resolver'
import { DataSource } from 'typeorm'
import { IJwtService, JwtService } from '../src'
import jwtTests from './shared/jwtServiceTest'
import { OIDFClient } from '@sphereon/ssi-sdk.oidf-client'
import { ResourceResolver } from '@sphereon/ssi-sdk.resource-resolver'

jest.setTimeout(30000)

Expand Down Expand Up @@ -62,8 +60,6 @@ const setup = async (): Promise<boolean> => {
}),
new IdentifierResolution(),
new JwtService(),
new ResourceResolver(),
new OIDFClient(),
],
})
agent = localAgent
Expand Down
4 changes: 0 additions & 4 deletions packages/jwt-service/__tests__/restAgent.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@ import { DataSource } from 'typeorm'

import { IJwtService, JwtService } from '../src'
import jwtServiceTests from './shared/jwtServiceTest'
import { ResourceResolver } from '@sphereon/ssi-sdk.resource-resolver'
import { OIDFClient } from '@sphereon/ssi-sdk.oidf-client'

jest.setTimeout(30000)

Expand Down Expand Up @@ -100,8 +98,6 @@ const setup = async (): Promise<boolean> => {
}),
new IdentifierResolution(),
new JwtService(),
new ResourceResolver(),
new OIDFClient(),
],
})

Expand Down
43 changes: 2 additions & 41 deletions packages/jwt-service/__tests__/shared/jwtServiceTest.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import {
ExternalIdentifierOIDFEntityIdResult,
ExternalIdentifierResult,
IIdentifierResolution,
} from '@sphereon/ssi-sdk-ext.identifier-resolution'
import { IIdentifierResolution } from '@sphereon/ssi-sdk-ext.identifier-resolution'
import { JWK } from '@sphereon/ssi-types'
import { IDIDManager, IKeyManager, TAgent } from '@veramo/core'
import { decodeJwt } from 'jose'
import {decodeJwt} from "jose";

import * as u8a from 'uint8arrays'
import { IJwtService } from '../../src'
Expand Down Expand Up @@ -136,39 +132,4 @@ export default (testContext: {
console.log(jwe)
})
})

describe('oidf-identifier-resolution', () => { // TODO move to separate package? We can't load JwtService in identifier-resolution
it('should resolve OIDF entity ID against multiple trust anchors', async () => {
const EXAMPLE_ENTITY_ID = 'https://agent.findynet.demo.sphereon.com/oid4vci'
const result: ExternalIdentifierResult = await agent.identifierExternalResolve({
identifier: EXAMPLE_ENTITY_ID,
trustAnchors: ['https://federation.demo.sphereon.com', 'https://federation.dev.findy.fi']
})

expect(result).toBeDefined()
expect(result.method).toEqual('entity_id')

if (result.method === 'entity_id') {
const entityResult = result as ExternalIdentifierOIDFEntityIdResult
expect(entityResult.trustedAnchors).toBeDefined()

expect(entityResult.trustedAnchors['https://federation.demo.sphereon.com'])
.toEqual('036f147e164a6b2ae860330b75bb54243b028086b4297a8d663bb4afe4080afec7')

expect(entityResult.errorList).toBeDefined()
if(entityResult.errorList) {
expect(entityResult.errorList['https://federation.dev.findy.fi'])
.toEqual('A Trust chain could not be established')
}

expect(Array.isArray(entityResult.jwks)).toBe(true)
expect(entityResult.jwks).toHaveLength(1)

const jwk = entityResult.jwks[0]
expect(jwk.jwkThumbprint).toEqual('PjWRF5oJSGKQQaf_NPMndBA528S_Ulqcu6E_ZWZkkWY')

expect(entityResult.trustEstablished).toBeTruthy()
}
})
})
}
2 changes: 0 additions & 2 deletions packages/jwt-service/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@
"@sphereon/ssi-sdk-ext.did-resolver-jwk": "workspace:*",
"@sphereon/ssi-sdk-ext.kms-local": "workspace:*",
"@sphereon/ssi-sdk.dev": "0.30.2-feature.SDK.41.oidf.support.286",
"@sphereon/ssi-sdk.oidf-client": "0.30.2-feature.SDK.41.oidf.support.286",
"@sphereon/ssi-sdk.resource-resolver": "0.30.2-feature.SDK.41.oidf.support.286",
"@veramo/data-store": "4.2.0",
"@veramo/did-manager": "4.2.0",
"@veramo/did-resolver": "4.2.0",
Expand Down
64 changes: 64 additions & 0 deletions packages/oidf-resolution-tests/__tests__/localAgent.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { IdentifierResolution, IIdentifierResolution } from '../../identifier-resolution/src' // FIXME fix when new types have been absorbed throughout ssi-sdk
import { SphereonKeyManager } from '@sphereon/ssi-sdk-ext.key-manager'
import { SphereonKeyManagementSystem } from '@sphereon/ssi-sdk-ext.kms-local'
import { createAgent, IKeyManager, TAgent } from '@veramo/core'
import { Entities, KeyStore, migrations, PrivateKeyStore } from '@veramo/data-store'
import { SecretBox } from '@veramo/kms-local'
import { OrPromise } from '@veramo/utils'
import { DataSource } from 'typeorm'
import { IJwtService, JwtService } from '@sphereon/ssi-sdk-ext.jwt-service'
import oidfResolutionTests from './shared/oidfResolutionTest'
import { OIDFClient } from '@sphereon/ssi-sdk.oidf-client'
import { ResourceResolver } from '@sphereon/ssi-sdk.resource-resolver'

jest.setTimeout(30000)

const KMS_SECRET_KEY = 'd17c8674f5db9396f8eecccde25e882bb0336316bc411ae38dc1f3dcd7ed100f'
let databaseFile = ':memory:'
let dbConnection: OrPromise<DataSource>
let agent: TAgent<IKeyManager & IIdentifierResolution & IJwtService>


const setup = async (): Promise<boolean> => {
const db: OrPromise<DataSource> = new DataSource({
type: 'sqlite',
database: databaseFile,
synchronize: false,
logging: ['info', 'warn'],
entities: [...Entities],
migrations: [...migrations],
migrationsRun: true,
}).initialize()
const secretBox = new SecretBox(KMS_SECRET_KEY)

const localAgent = createAgent<IKeyManager & IIdentifierResolution & IJwtService>({
plugins: [
new SphereonKeyManager({
store: new KeyStore(db),
kms: {
local: new SphereonKeyManagementSystem(new PrivateKeyStore(db, secretBox)),
},
}),
new IdentifierResolution(),
new JwtService(),
new ResourceResolver(),
new OIDFClient(),
],
})
agent = localAgent
dbConnection = db
return true
}

const tearDown = async (): Promise<boolean> => {
await (await dbConnection).destroy()
return true
}

const getAgent = () => agent

const testContext = { getAgent, setup, tearDown }

describe('Local integration tests', () => {
oidfResolutionTests(testContext)
})
118 changes: 118 additions & 0 deletions packages/oidf-resolution-tests/__tests__/restAgent.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import { IdentifierResolution, IIdentifierResolution } from '../../identifier-resolution/src' // FIXME fix when new types have been absorbed throughout ssi-sdk
import { SphereonKeyManager } from '@sphereon/ssi-sdk-ext.key-manager'
import { SphereonKeyManagementSystem } from '@sphereon/ssi-sdk-ext.kms-local'

import { createAgent, IAgent, IAgentOptions, IKeyManager, TAgent } from '@veramo/core'
import { Entities, KeyStore, migrations, PrivateKeyStore } from '@veramo/data-store'
import { SecretBox } from '@veramo/kms-local'
import { AgentRestClient } from '@veramo/remote-client'
import { AgentRouter, RequestWithAgentRouter } from '@veramo/remote-server'
import { OrPromise } from '@veramo/utils'

// @ts-ignore
import express from 'express'
import { Server } from 'http'
import { DataSource } from 'typeorm'

import oidfResolutionTests from './shared/oidfResolutionTest'
import { ResourceResolver } from '@sphereon/ssi-sdk.resource-resolver'
import { OIDFClient } from '@sphereon/ssi-sdk.oidf-client'
import { IJwtService, JwtService } from '@sphereon/ssi-sdk-ext.jwt-service'

jest.setTimeout(30000)

const databaseFile = ':memory:'
const port = 13213
const basePath = '/agent'

// const PRIVATE_KEY_HEX = '7dd923e40f4615ac496119f7e793cc2899e99b64b88ca8603db986700089532b'

let serverAgent: IAgent
let clientAgent: TAgent<IKeyManager & IIdentifierResolution & IJwtService>
let restServer: Server
let dbConnection: OrPromise<DataSource>

const KMS_SECRET_KEY = 'd17c8674f5db9396f8eecccde25e882bb0336316bc411ae38dc1f3dcd7ed100f'

const getAgent = (options?: IAgentOptions) => {
if (!serverAgent) {
throw Error('Server agent not available yet (missed await?)')
}
if (!clientAgent) {
clientAgent = createAgent<IIdentifierResolution & IKeyManager & IJwtService>({
...options,
plugins: [
new AgentRestClient({
url: 'http://localhost:' + port + basePath,
enabledMethods: serverAgent.availableMethods(),
schema: serverAgent.getSchema(),
}),
],
})
}

return clientAgent
}

const setup = async (): Promise<boolean> => {
if (serverAgent) {
return true
}
const db: OrPromise<DataSource> = new DataSource({
type: 'sqlite',
database: databaseFile,
synchronize: false,
logging: ['info', 'warn'],
entities: [...Entities],
migrations: [...migrations],
migrationsRun: true,
}).initialize()

const secretBox = new SecretBox(KMS_SECRET_KEY)

const agent = createAgent<IKeyManager & IIdentifierResolution & IJwtService>({
plugins: [
new SphereonKeyManager({
store: new KeyStore(db),
kms: {
local: new SphereonKeyManagementSystem(new PrivateKeyStore(db, secretBox)),
},
}),
new IdentifierResolution(),
new JwtService(),
new ResourceResolver(),
new OIDFClient(),
],
})

serverAgent = agent
dbConnection = db

const agentRouter = AgentRouter({
exposedMethods: serverAgent.availableMethods(),
})

const requestWithAgent = RequestWithAgentRouter({
agent: serverAgent,
})

return new Promise((resolve) => {
const app = express()
app.use(basePath, requestWithAgent, agentRouter)
restServer = app.listen(port, () => {
resolve(true)
})
})
}

const tearDown = async (): Promise<boolean> => {
restServer.close()
await (await dbConnection).dropDatabase()
return true
}

const testContext = { getAgent, setup, tearDown }

describe('REST integration tests', () => {
oidfResolutionTests(testContext)
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import {
ExternalIdentifierOIDFEntityIdResult,
ExternalIdentifierResult,
IIdentifierResolution,
} from '../../../identifier-resolution/src/types' // FIXME fix when new types have been absorbed throughout ssi-sdk
import { IKeyManager, TAgent } from '@veramo/core'
import { IJwtService } from '@sphereon/ssi-sdk-ext.jwt-service'
import { describe } from 'node:test'

type ConfiguredAgent = TAgent<IKeyManager & IIdentifierResolution & IJwtService>

export default (testContext: {
getAgent: () => ConfiguredAgent;
setup: () => Promise<boolean>;
tearDown: () => Promise<boolean>
}) => {
let agent: ConfiguredAgent
// let key: IKey

// tbe above key as hex
const privateKeyHex = '8E9B109E719098BF980487DF1F5D77E9CB29606EBED2263B5F57C213DF84F4B2'.toLowerCase()

beforeAll(async () => {
await testContext.setup().then(() => (agent = testContext.getAgent()))
await agent.keyManagerImport({kid: 'test', type: 'Secp256r1', kms: 'local', privateKeyHex})
})
afterAll(testContext.tearDown)



describe('oidf-identifier-resolution', () => {
it('should resolve OIDF entity ID against multiple trust anchors', async () => {
const EXAMPLE_ENTITY_ID = 'https://agent.findynet.demo.sphereon.com/oid4vci'
const result: ExternalIdentifierResult = await agent.identifierExternalResolve({
identifier: EXAMPLE_ENTITY_ID,
trustAnchors: ['https://federation.demo.sphereon.com', 'https://federation.dev.findy.fi']
})

expect(result).toBeDefined()
expect(result.method).toEqual('entity_id')

if (result.method === 'entity_id') {
const entityResult = result as ExternalIdentifierOIDFEntityIdResult
expect(entityResult.trustedAnchors).toBeDefined()

expect(entityResult.trustedAnchors['https://federation.demo.sphereon.com'])
.toEqual('036f147e164a6b2ae860330b75bb54243b028086b4297a8d663bb4afe4080afec7')

expect(entityResult.errorList).toBeDefined()
if(entityResult.errorList) {
expect(entityResult.errorList['https://federation.dev.findy.fi'])
.toEqual('A Trust chain could not be established')
}

expect(Array.isArray(entityResult.jwks)).toBe(true)
expect(entityResult.jwks).toHaveLength(1)

const jwk = entityResult.jwks[0]
expect(jwk.jwkThumbprint).toEqual('PjWRF5oJSGKQQaf_NPMndBA528S_Ulqcu6E_ZWZkkWY')

expect(entityResult.trustEstablished).toBeTruthy()
}
})
})
}
Loading

0 comments on commit 0b3bf96

Please sign in to comment.