diff --git a/packages/sdk-js/src/DidHelpers/index.ts b/packages/sdk-js/src/DidHelpers/index.ts index d54f51fdd..5d978add1 100644 --- a/packages/sdk-js/src/DidHelpers/index.ts +++ b/packages/sdk-js/src/DidHelpers/index.ts @@ -12,6 +12,7 @@ import { Signers } from '@kiltprotocol/utils' import type { SharedArguments } from './interfaces.js' export { createDid } from './createDid.js' +export { addService, removeService } from './service.js' export { setVerificationMethod } from './setVerificationMethod.js' export { transact } from './transact.js' export { claimWeb3Name, releaseWeb3Name } from './w3names.js' diff --git a/packages/sdk-js/src/DidHelpers/service.spec.ts b/packages/sdk-js/src/DidHelpers/service.spec.ts new file mode 100644 index 000000000..0e5b7f91c --- /dev/null +++ b/packages/sdk-js/src/DidHelpers/service.spec.ts @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2018-2024, BOTLabs GmbH. + * + * This source code is licensed under the BSD 4-Clause "Original" license + * found in the LICENSE file in the root directory of this source tree. + */ + +import type { DidDocument, DidUrl, KiltKeyringPair } from '@kiltprotocol/types' +import { Crypto } from '@kiltprotocol/utils' +import { + ApiMocks, + createLocalDemoFullDidFromKeypair, +} from '../../../../tests/testUtils/index.js' +import { ConfigService } from '../index.js' +import { transact } from './index.js' +import { addService, removeService } from './service.js' + +jest.mock('./transact.js') + +const mockedTransact = jest.mocked(transact) +const mockedApi = ApiMocks.createAugmentedApi() + +describe.each(['#my_service', 'did:kilt:4abctest#my_service'])( + 'service management with id %s', + (serviceId) => { + let didDocument: DidDocument + let keypair: KiltKeyringPair + beforeAll(async () => { + ConfigService.set({ api: mockedApi }) + + keypair = Crypto.makeKeypairFromUri('//Alice') + const { id, verificationMethod, authentication } = + await createLocalDemoFullDidFromKeypair(keypair, { + verificationRelationships: new Set(['assertionMethod']), + }) + didDocument = { + id, + authentication, + assertionMethod: authentication, + verificationMethod: verificationMethod?.filter( + (vm) => vm.id === authentication![0] + ), + } + }) + + it('creates an add service tx', async () => { + addService({ + didDocument, + api: mockedApi, + submitter: keypair, + signers: [keypair], + service: { + id: serviceId as DidUrl, + type: ['http://schema.org/EmailService'], + serviceEndpoint: ['mailto:info@kilt.io'], + }, + }) + + expect(mockedTransact).toHaveBeenLastCalledWith( + expect.objectContaining[0]>>({ + call: expect.any(Object), + expectedEvents: expect.arrayContaining([ + { + section: 'did', + method: 'DidUpdated', + }, + ]), + didDocument, + api: mockedApi, + submitter: keypair, + signers: [keypair], + }) + ) + expect(mockedTransact.mock.lastCall?.[0].call.toHuman()).toMatchObject({ + method: { + args: { + service_endpoint: { + id: 'my_service', + serviceTypes: ['http://schema.org/EmailService'], + urls: ['mailto:info@kilt.io'], + }, + }, + section: 'did', + method: 'addServiceEndpoint', + }, + }) + }) + + it('creates a remove service tx', async () => { + removeService({ + didDocument, + api: mockedApi, + submitter: keypair, + signers: [keypair], + id: serviceId as DidUrl, + }) + + expect(mockedTransact).toHaveBeenLastCalledWith( + expect.objectContaining[0]>>({ + call: expect.any(Object), + expectedEvents: expect.arrayContaining([ + { + section: 'did', + method: 'DidUpdated', + }, + ]), + didDocument, + api: mockedApi, + submitter: keypair, + signers: [keypair], + }) + ) + expect(mockedTransact.mock.lastCall?.[0].call.toHuman()).toMatchObject({ + method: { + args: { + service_id: 'my_service', + }, + section: 'did', + method: 'removeServiceEndpoint', + }, + }) + }) + } +) diff --git a/tests/integration/didHelpers.spec.ts b/tests/integration/didHelpers.spec.ts index 3da557372..b5c2a5436 100644 --- a/tests/integration/didHelpers.spec.ts +++ b/tests/integration/didHelpers.spec.ts @@ -12,6 +12,7 @@ import type { DidDocument, KeyringPair, KiltKeyringPair, + Service, } from '@kiltprotocol/types' import { Crypto } from '@kiltprotocol/utils' @@ -109,6 +110,62 @@ describe('w3ns', () => { }, 30_000) }) +describe('services', () => { + let keypair: KeyringPair + let didDocument: DidDocument + beforeAll(async () => { + keypair = Crypto.makeKeypairFromUri('//Services') + const result = await DidHelpers.createDid({ + api, + signers: [keypair], + submitter: paymentAccount, + fromPublicKey: keypair, + }).submit() + didDocument = result.asConfirmed.didDocument + }) + + it('adds a service', async () => { + const result = await DidHelpers.addService({ + api, + signers: [keypair], + submitter: paymentAccount, + didDocument, + service: { + id: '#my_service', + type: ['http://schema.org/EmailService'], + serviceEndpoint: ['mailto:info@kilt.io'], + }, + }).submit() + expect(result.status).toStrictEqual('confirmed') + didDocument = result.asConfirmed.didDocument + expect(didDocument).toHaveProperty( + 'service', + expect.arrayContaining([ + { + id: `${didDocument.id}#my_service`, + type: ['http://schema.org/EmailService'], + serviceEndpoint: ['mailto:info@kilt.io'], + }, + ]) + ) + expect(didDocument.service).toHaveLength(1) + }, 30_000) + + it('removes a service', async () => { + const result = await DidHelpers.removeService({ + api, + signers: [keypair], + submitter: paymentAccount, + didDocument, + id: '#my_service', + }).submit() + + expect(result.status).toStrictEqual('confirmed') + didDocument = result.asConfirmed.didDocument + expect(didDocument).not.toHaveProperty('service') + }, 30_000) +}) + afterAll(async () => { await disconnect() })