Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

qa: dart clients integration tests #532

Draft
wants to merge 6 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions tests/integration/dart/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,18 @@ dev_dependencies:
path: ../../../clients/dart/credential_issuance_client
affinidi_tdk_vault_data_manager_client:
path: ../../../clients/dart/vault_data_manager_client
affinidi_tdk_credential_verification_client:
# path: ../../../clients/dart/credential_verification_client
path: ../../../../openapi-sdk-generator/.github/affinidi-tdk/clients/dart/credential_verification_client
affinidi_tdk_cryptography: ^1.0.0
vault_file_system_encryption_service:
path: ../../../../tdk-dart-bussiness-layer/packages/vault_file_system_encryption_service
dotenv: ^4.2.0
lints: ^5.0.0
test: ^1.24.0
pointycastle: ^3.9.1
dart_jsonwebtoken: ^2.12.0
built_collection: ^5.1.1
built_value: ^8.9.3
dio: '^5.2.0'
one_of: ^1.5.0
1 change: 1 addition & 0 deletions tests/integration/dart/test/auth_provider_test.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:test/test.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';

import 'environment.dart';

void main() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:test/test.dart';
import 'package:affinidi_tdk_consumer_auth_provider/affinidi_tdk_consumer_auth_provider.dart';

import 'environment.dart';

void main() {
Expand Down
60 changes: 36 additions & 24 deletions tests/integration/dart/test/credential_issuance_client_test.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import 'package:dio/dio.dart';
import 'package:test/test.dart';
import 'package:one_of/one_of.dart';
// import 'package:built_collection/built_collection.dart';
import 'package:built_collection/built_collection.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:affinidi_tdk_wallets_client/affinidi_tdk_wallets_client.dart';

import 'environment.dart';

void main() {
Expand All @@ -24,17 +25,22 @@ void main() {
);

// issuance client
final dio = Dio(BaseOptions(
baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
connectTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 5),
));
final issuanceClient = AffinidiTdkCredentialIssuanceClient(
dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);
dio: Dio(BaseOptions(
baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
connectTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 5),
)),
authTokenHook: authProvider.fetchProjectScopedToken);
configurationApi = issuanceClient.getConfigurationApi();

// wallet client
final walletClient = AffinidiTdkWalletsClient(
dio: Dio(BaseOptions(
baseUrl: AffinidiTdkWalletsClient.basePath,
connectTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 5),
)),
authTokenHook: authProvider.fetchProjectScopedToken);
walletApi = walletClient.getWalletApi();

Expand Down Expand Up @@ -69,25 +75,31 @@ void main() {
final description = 'Test issuance config';
final format = CreateIssuanceConfigInputFormatEnum.ldpVc;
final credentialOfferDuration = 600;
// final credentialSupported = [
// CredentialSupportedObject((b) => b
// ..credentialTypeId = 'TDriversLicenseV1R1'
// ..jsonSchemaUrl =
// 'https://schema.affinidi.io/TDriversLicenseV1R1.jsonld'
// ..jsonLdContextUrl =
// 'https://schema.affinidi.io/TDriversLicenseV1R1.json')
// ];
final credentialSupported = [
CredentialSupportedObject((b) => b
..credentialTypeId = 'TDriversLicenseV1R1'
..jsonSchemaUrl =
'https://schema.affinidi.io/TDriversLicenseV1R1.json'
..jsonLdContextUrl =
'https://schema.affinidi.io/TDriversLicenseV1R1.jsonld'
..metadata = (SupportedCredentialMetadataBuilder()
..display = ListBuilder([
SupportedCredentialMetadataDisplayInner((b) => b
..name = 'Test Display'
..logo = (SupportedCredentialMetadataItemLogoBuilder()
..url = 'https://example.com/logo.png'
..altText = 'Logo'))
])))
];

// create config
final configInputBuilder = CreateIssuanceConfigInputBuilder()
..issuerWalletId = walletId
..name = name
..description = description
..format = format
..credentialOfferDuration = credentialOfferDuration
// ..credentialSupported = ListBuilder(credentialSupported)
//
;
..issuerWalletId = walletId
..name = name
..description = description
..format = format
..credentialOfferDuration = credentialOfferDuration
..credentialSupported = ListBuilder(credentialSupported);
final createdConfig = (await configurationApi.createIssuanceConfig(
createIssuanceConfigInput: configInputBuilder.build()))
.data;
Expand All @@ -108,7 +120,7 @@ void main() {
equals(credentialOfferDuration));
expect(configDetails.issuerUri, isNotEmpty);
expect(configDetails.issuerDid, isNotEmpty);
// expect(configDetails.credentialSupported, equals(credentialSupported));
expect(configDetails.credentialSupported, equals(credentialSupported));

// list config
var configs =
Expand Down
122 changes: 111 additions & 11 deletions tests/integration/dart/test/vault_data_manager_client_test.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,32 @@
import 'package:affinidi_tdk_consumer_auth_provider/affinidi_tdk_consumer_auth_provider.dart';
import 'dart:convert';

import 'package:dio/dio.dart';
import 'package:test/test.dart';
import 'package:affinidi_tdk_consumer_auth_provider/affinidi_tdk_consumer_auth_provider.dart';
import 'package:affinidi_tdk_vault_data_manager_client/affinidi_tdk_vault_data_manager_client.dart';
import 'package:affinidi_tdk_cryptography/affinidi_tdk_cryptography.dart';
import 'package:vault_file_system_encryption_service/vault_file_system_encryption_service.dart';

import 'environment.dart';

const rootNodeIdBase64Encoded = 'NzY3ZjY=';
const vfsSalt =
'031b96f9b4641f508702c03b5643fd5de8d90465fdb0bdf6abe5d6c1c8a667a8';

Future<Map<String, dynamic>> getVaultFileSystemPublicKey() async {
final Dio dio = Dio();
final absoluteUrl =
"${AffinidiTdkVaultDataManagerClient.basePath}/.well-known/jwks.json";
final response = await dio.get(absoluteUrl);
final jwks = (response.data['keys'] as List).first;
return jwks;
}

void main() {
group('Vault Data Manager Client Integration Tests', () {
// late ConfigApi configApi;
// late FilesApi filesApi;
late NodesApi nodesApi;
// late ProfileDataApi profileDataApi;
late Map<String, dynamic> vfsPublicKey;
late VaultFileSystemEncryptionService vaultFileSystemEncryptionService;

setUp(() async {
final env = getVaultEnvironment();
Expand All @@ -19,16 +37,98 @@ void main() {
final apiClient = AffinidiTdkVaultDataManagerClient(
authTokenHook: consumerAuthProvider.fetchConsumerToken,
);

// configApi = apiClient.getConfigApi();
// filesApi = apiClient.getFilesApi();
nodesApi = apiClient.getNodesApi();
// profileDataApi = apiClient.getProfileDataApi();

vfsPublicKey = await getVaultFileSystemPublicKey();
vaultFileSystemEncryptionService = VaultFileSystemEncryptionService(
cryptographyService: CryptographyService(),
jwk: vfsPublicKey,
encryptedSeed: env.encryptedSeed,
walletPassword: env.encryptionKey,
vfsNonce: utf8.encode(vfsSalt),
);
});

test('list root node children', () async {
final children = (await nodesApi.listRootNodeChildren()).data;
print(children);
test('CRUDL Root Nodes', () async {
// get list of profiles
var initialProfiles = (await nodesApi.listRootNodeChildren()).data;
expect(initialProfiles, isNotNull);
expect(initialProfiles!.nodes, isNotNull);

// add a new profile
final dekGenerateModel =
await vaultFileSystemEncryptionService.generateDek();
final edekInfoBuilder = EdekInfoBuilder()
..edek =
base64.encode(dekGenerateModel.dekEncryptedByWalletCryptoMaterial)
..dekekId = dekGenerateModel.walletCryptoMaterialHash;
final createNodeInputBuilder = CreateNodeInputBuilder()
..name = 'Test Node'
..type = NodeType.PROFILE
..parentNodeId = rootNodeIdBase64Encoded
..edekInfo = edekInfoBuilder
..dek = base64.encode(dekGenerateModel.dekEncryptedByVfsPublicKey);
final newProfile = (await nodesApi.createNode(
createNodeInput: createNodeInputBuilder.build()))
.data;
expect(newProfile, isNotNull);
expect(newProfile!.nodeId, isNotNull);

// get details of new profile
final nodeDetails =
(await nodesApi.getDetailedNodeInfo(nodeId: newProfile.nodeId)).data;
expect(nodeDetails, isNotNull);
expect(nodeDetails!.nodeId, equals(newProfile.nodeId));
expect(nodeDetails.name, equals(createNodeInputBuilder.name));
expect(nodeDetails.type, equals(createNodeInputBuilder.type));
expect(nodeDetails.parentNodeId,
equals(createNodeInputBuilder.parentNodeId));
expect(nodeDetails.edekInfo, isNotNull);
expect(nodeDetails.edekInfo!.edek, equals(edekInfoBuilder.edek));

// update profile
final updateNodeInput = UpdateNodeInputBuilder()
..name = 'Updated Test Node'
..description = 'Updated description'
..metadata = jsonEncode({
'pictureURI': 'https://example.com/picture.jpg',
});
final updatedProfile = (await nodesApi.updateNode(
nodeId: newProfile.nodeId,
updateNodeInput: updateNodeInput.build()))
.data;
expect(updatedProfile, isNotNull);
expect(updatedProfile!.nodeId, equals(newProfile.nodeId));
expect(updatedProfile.name, equals(updateNodeInput.name));
expect(updatedProfile.description, equals(updateNodeInput.description));
expect(updatedProfile.metadata, equals(updateNodeInput.metadata));

// get updated list of profiles
var updatedProfiles = (await nodesApi.listRootNodeChildren()).data;
expect(updatedProfiles, isNotNull);
expect(updatedProfiles!.nodes, isNotNull);
expect(updatedProfiles.nodes!.length,
equals(initialProfiles.nodes!.length + 1));
final updatedProfileFromList = updatedProfiles.nodes!
.firstWhere((node) => node.nodeId == newProfile.nodeId);
expect(updatedProfileFromList, isNotNull);
expect(updatedProfileFromList.nodeId, equals(newProfile.nodeId));
expect(updatedProfileFromList.name, equals(updateNodeInput.name));
expect(updatedProfileFromList.description,
equals(updateNodeInput.description));
expect(updatedProfileFromList.metadata, equals(updateNodeInput.metadata));

// delete profile
await nodesApi.deleteNode(nodeId: newProfile.nodeId);
updatedProfiles = (await nodesApi.listRootNodeChildren()).data;
expect(updatedProfiles, isNotNull);
expect(updatedProfiles!.nodes, isNotNull);
expect(
updatedProfiles.nodes!.length, equals(initialProfiles.nodes!.length));
expect(
updatedProfiles.nodes!
.any((node) => node.nodeId == newProfile.nodeId),
isFalse);
});
});
}
82 changes: 82 additions & 0 deletions tests/integration/dart/test/verification_client_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import 'package:built_value/json_object.dart';
import 'package:dio/dio.dart';
import 'package:one_of/one_of.dart';
import 'package:test/test.dart';
import 'package:built_collection/built_collection.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_verification_client/affinidi_tdk_credential_verification_client.dart';

import 'environment.dart';

void main() {
group('Credential Verification Client Integration Tests', () {
late DefaultApi verificationApi;

setUp(() async {
final env = getProjectEnvironment();
final authProvider = AuthProvider(
projectId: env.projectId,
tokenId: env.tokenId,
privateKey: env.privateKey,
keyId: env.keyId,
passphrase: env.passphrase,
);
final apiClient = AffinidiTdkCredentialVerificationClient(
dio: Dio(BaseOptions(
baseUrl: AffinidiTdkCredentialVerificationClient.basePath,
connectTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 5),
)), authTokenHook: authProvider.fetchProjectScopedToken);
verificationApi = apiClient.getDefaultApi();
});

test('Verify VC', () async {
final w3Context = W3cCredentialContextInnerBuilder()
..oneOf = OneOf2<BuiltMap<String, JsonObject>, String>(
value: 'https://www.w3.org/2018/credentials/v1', typeIndex: 1);
final schemaContext = W3cCredentialContextInnerBuilder()
..oneOf = OneOf2<BuiltMap<String, JsonObject>, String>(
value: 'https://schema.affinidi.com/EmailV1-0.jsonld',
typeIndex: 1);
final credentialBuilder = W3cCredentialBuilder()
..atContext = ListBuilder([w3Context.build(), schemaContext.build()])
..id = 'claimId:63b5d11c0d1b5566'
..type = ListBuilder(['VerifiableCredential', 'Email'])
..holder = (W3cCredentialHolderBuilder()
..oneOf = OneOf2<JsonObject, String>(
value: JsonObject({
'id':
'did:key:zQ3shiEH16wHAfbQSSuYB1Lc3KSQC31W4gkaXKa8PgCSz83du'
}),
typeIndex: 0))
..credentialSubject = (W3cCredentialCredentialSubjectBuilder()
..oneOf = OneOf2<BuiltList<String>, JsonObject>(
value:
JsonObject({'email': '[email protected]'}),
typeIndex: 1))
..credentialSchema = (W3cCredentialCredentialSchemaBuilder()
..id = 'https://schema.affinidi.com/EmailV1-0.json'
..type = 'JsonSchemaValidator2018')
..issuanceDate = '2024-05-30T19:14:31.964Z'
..expirationDate = '2025-05-30T19:14:31.964Z'
..issuer = 'did:key:zQ3shiEH16wHAfbQSSuYB1Lc3KSQC31W4gkaXKa8PgCSz83du'
..proof = (W3cProofBuilder()
..type = 'EcdsaSecp256k1Signature2019'
..created = '2024-05-30T19:14:31Z'
..verificationMethod =
'did:key:zQ3shiEH16wHAfbQSSuYB1Lc3KSQC31W4gkaXKa8PgCSz83du#zQ3shiEH16wHAfbQSSuYB1Lc3KSQC31W4gkaXKa8PgCSz83du'
..proofPurpose = 'assertionMethod'
..jws =
'eyJhbGciOiJFUzI1NksiLCJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdfQ..FEqEKSPZCHKY9XuCywtOSBzhn1EHRFEle67bfJt-3wUFvMnk9pGmQO52EOCB65WcgXSesCgKasgXZKZOJXbF5A');
final credential = credentialBuilder.build();
final verifyCredentialInputBuilder = VerifyCredentialInputBuilder()
..verifiableCredentials = ListBuilder([credential]);
final verificationResponse = (await verificationApi.verifyCredentials(
verifyCredentialInput: verifyCredentialInputBuilder.build()))
.data;
expect(verificationResponse, isNotNull);
expect(verificationResponse!.isValid, isTrue);
expect(verificationResponse.errors, isEmpty);
});
});
}
4 changes: 3 additions & 1 deletion tests/integration/dart/test/wallets_client_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:one_of/one_of.dart';
import 'package:test/test.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_wallets_client/affinidi_tdk_wallets_client.dart';

import 'environment.dart';

void main() {
Expand Down Expand Up @@ -41,7 +42,6 @@ void main() {
final createdWallet = (await walletApi.createWallet(
createWalletInput: walletInputBuilder.build()))
.data;
print(createdWallet);
expect(createdWallet, isNotNull);
expect(createdWallet!.wallet, isNotNull);
expect(createdWallet.wallet!.id, isNotEmpty);
Expand All @@ -53,6 +53,8 @@ void main() {
expect(createdWallet.wallet!.keys!.length, greaterThan(0));
expect(createdWallet.wallet!.keys!.first.id, isNotEmpty);
expect(createdWallet.wallet!.keys!.first.ari, isNotEmpty);

await walletApi.deleteWallet(walletId: createdWallet.wallet!.id!);
});
});
}
Loading