Skip to content

Commit

Permalink
fix: update with web5 changes (#17)
Browse files Browse the repository at this point in the history
  • Loading branch information
ethan-tbd committed Apr 23, 2024
1 parent 7d222e2 commit 27243b1
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 102 deletions.
58 changes: 31 additions & 27 deletions lib/src/http_client/tbdex_http_client.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'dart:convert';
import 'dart:io';

import 'package:http/http.dart' as http;
import 'package:tbdex/src/http_client/models/create_exchange_request.dart';
import 'package:tbdex/src/http_client/models/exchange.dart';
import 'package:tbdex/src/http_client/models/get_offerings_filter.dart';
Expand All @@ -19,10 +19,10 @@ class TbdexHttpClient {
static const _jsonHeader = 'application/json';
static const _expirationDuration = Duration(minutes: 5);

static http.Client _client = http.Client();
static HttpClient _client = HttpClient();

// ignore: avoid_setters_without_getters
static set client(http.Client client) {
static set client(HttpClient client) {
_client = client;
}

Expand All @@ -35,18 +35,17 @@ class TbdexHttpClient {
final pfiServiceEndpoint = await _getPfiServiceEndpoint(pfiDid);
final url = Uri.parse('$pfiServiceEndpoint/exchanges/$exchangeId');

final response = await _client.get(
url,
headers: {
'Authorization': 'Bearer $requestToken',
},
);
final request = await _client.getUrl(url);
request.headers.set('Authorization', 'Bearer $requestToken');
final response = await request.close();

final body = await response.transform(utf8.decoder).join();

if (response.statusCode != 200) {
throw Exception('failed to fetch exchange: ${response.body}');
throw Exception('failed to fetch exchange: $body');
}

return Parser.parseExchange(response.body);
return Parser.parseExchange(body);
}

static Future<List<Exchange>> getExchanges(
Expand All @@ -57,18 +56,17 @@ class TbdexHttpClient {
final pfiServiceEndpoint = await _getPfiServiceEndpoint(pfiDid);
final url = Uri.parse('$pfiServiceEndpoint/exchanges/');

final response = await _client.get(
url,
headers: {
'Authorization': 'Bearer $requestToken',
},
);
final request = await _client.getUrl(url);
request.headers.set('Authorization', 'Bearer $requestToken');
final response = await request.close();

final body = await response.transform(utf8.decoder).join();

if (response.statusCode != 200) {
throw Exception('failed to fetch exchanges: ${response.body}');
throw Exception('failed to fetch exchanges: $body');
}

return Parser.parseExchanges(response.body);
return Parser.parseExchanges(body);
}

static Future<List<Offering>> getOfferings(
Expand All @@ -80,13 +78,16 @@ class TbdexHttpClient {
queryParameters: filter?.toJson(),
);

final response = await _client.get(url);
final request = await _client.getUrl(url);
final response = await request.close();

final body = await response.transform(utf8.decoder).join();

if (response.statusCode != 200) {
throw Exception(response);
}

return Parser.parseOfferings(response.body);
return Parser.parseOfferings(body);
}

static Future<void> createExchange(
Expand Down Expand Up @@ -129,11 +130,9 @@ class TbdexHttpClient {
final path = '/exchanges${exchangeId != null ? '/$exchangeId' : ''}';
final url = Uri.parse(pfiServiceEndpoint + path);

final response = await _client.post(
url,
headers: {'Content-Type': _jsonHeader},
body: requestBody,
);
final request = await _client.postUrl(url);
request.headers.set('Content-Type', _jsonHeader);
final response = await request.close();

if (response.statusCode != 201) {
throw Exception(response);
Expand All @@ -152,7 +151,12 @@ class TbdexHttpClient {
orElse: () => throw Exception('did does not have service of type PFI'),
);

return service?.serviceEndpoint ?? '';
final endpoint = service?.serviceEndpoint ?? [];

if (endpoint.isEmpty) {
throw Exception('no service endpoints found');
}
return 'http://${endpoint[0]}';
}

static Future<String> _generateRequestToken(
Expand Down
169 changes: 94 additions & 75 deletions test/http_client/tbdex_http_client_test.dart
Original file line number Diff line number Diff line change
@@ -1,34 +1,52 @@
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:io';

import 'package:mocktail/mocktail.dart';
import 'package:tbdex/src/http_client/tbdex_http_client.dart';
import 'package:test/test.dart';

import '../test_data.dart';

class MockClient extends Mock implements http.Client {}
class MockClient extends Mock implements HttpClient {}

class MockHttpHeaders extends Mock implements HttpHeaders {}

class MockHttpRequest extends Mock implements HttpClientRequest {}

class MockHttpResponse extends Mock implements HttpClientResponse {}

void main() async {
const pfiDid = 'did:dht:74hg1efatndi8enx3e4z6c4u8ieh1xfkyay4ntg4dg1w6risu35y';
const pfiDid = 'did:web:localhost%3A8892:ingress';
const pfiServiceEndpoint = 'http://localhost:8892/ingress/pfi';

late MockClient mockHttpClient;
late MockClient client;
late MockHttpHeaders headers;
late MockHttpRequest request;
late MockHttpResponse response;
await TestData.initializeDids();

group('TbdexHttpClient', () {
setUp(() {
mockHttpClient = MockClient();
TbdexHttpClient.client = mockHttpClient;
client = MockClient();
headers = MockHttpHeaders();
request = MockHttpRequest();
response = MockHttpResponse();

TbdexHttpClient.client = client;
});

test('can get exchange', () async {
when(() => request.headers).thenReturn(headers);
when(() => request.close()).thenAnswer((_) async => response);

when(() => response.statusCode).thenReturn(200);
when(() => response.transform(utf8.decoder))
.thenAnswer((_) => Stream.value(TestData.getExchangeResponse()));

when(
() => mockHttpClient.get(
Uri.parse('$pfiServiceEndpoint/exchanges/exchange_id'),
headers: any(named: 'headers'),
),
).thenAnswer(
(_) async => http.Response(TestData.getExchangeResponse(), 200),
);
() => client
.getUrl(Uri.parse('$pfiServiceEndpoint/exchanges/exchange_id')),
).thenAnswer((_) async => request);

final exchange = await TbdexHttpClient.getExchange(
TestData.aliceDid,
Expand All @@ -39,22 +57,22 @@ void main() async {
expect(exchange.length, 2);

verify(
() => mockHttpClient.get(
Uri.parse('$pfiServiceEndpoint/exchanges/exchange_id'),
headers: any(named: 'headers'),
),
() => client
.getUrl(Uri.parse('$pfiServiceEndpoint/exchanges/exchange_id')),
).called(1);
});

test('can get exchanges', () async {
when(() => request.headers).thenReturn(headers);
when(() => request.close()).thenAnswer((_) async => response);

when(() => response.statusCode).thenReturn(200);
when(() => response.transform(utf8.decoder))
.thenAnswer((_) => Stream.value(TestData.getExchangesResponse()));

when(
() => mockHttpClient.get(
Uri.parse('$pfiServiceEndpoint/exchanges/'),
headers: any(named: 'headers'),
),
).thenAnswer(
(_) async => http.Response(TestData.getExchangesResponse(), 200),
);
() => client.getUrl(Uri.parse('$pfiServiceEndpoint/exchanges/')),
).thenAnswer((_) async => request);

final exchanges = await TbdexHttpClient.getExchanges(
TestData.aliceDid,
Expand All @@ -64,58 +82,55 @@ void main() async {
expect(exchanges.length, 1);

verify(
() => mockHttpClient.get(
Uri.parse('$pfiServiceEndpoint/exchanges/'),
headers: any(named: 'headers'),
),
() => client.getUrl(Uri.parse('$pfiServiceEndpoint/exchanges/')),
).called(1);
});

test('can get offerings', () async {
when(() => request.close()).thenAnswer((_) async => response);

when(() => response.statusCode).thenReturn(200);
when(() => response.transform(utf8.decoder))
.thenAnswer((_) => Stream.value(TestData.getOfferingResponse()));

when(
() => mockHttpClient.get(
Uri.parse('$pfiServiceEndpoint/offerings/'),
headers: any(named: 'headers'),
),
).thenAnswer(
(_) async => http.Response(TestData.getOfferingResponse(), 200),
);
() => client.getUrl(Uri.parse('$pfiServiceEndpoint/offerings/')),
).thenAnswer((_) async => request);

final offerings = await TbdexHttpClient.getOfferings(pfiDid);

expect(offerings.length, 1);

verify(
() => mockHttpClient.get(
Uri.parse('$pfiServiceEndpoint/offerings/'),
headers: any(named: 'headers'),
),
() => client.getUrl(Uri.parse('$pfiServiceEndpoint/offerings/')),
).called(1);
});

test('can create exchange', () async {
final rfq = TestData.getRfq(to: pfiDid);
await rfq.sign(TestData.aliceDid);
final request =
TestData.getCreateExchangeRequest(rfq, replyTo: 'reply_to');
request
.write(TestData.getCreateExchangeRequest(rfq, replyTo: 'reply_to'));

when(
() => mockHttpClient.post(
Uri.parse('$pfiServiceEndpoint/exchanges'),
headers: any(named: 'headers'),
body: request,
when(() => request.headers).thenReturn(headers);
when(() => request.close()).thenAnswer((_) async => response);

when(() => response.statusCode).thenReturn(201);
when(() => response.transform(utf8.decoder)).thenAnswer(
(_) => Stream.value(
'',
),
).thenAnswer(
(_) async => http.Response('', 201),
);

when(
() => client.postUrl(Uri.parse('$pfiServiceEndpoint/exchanges')),
).thenAnswer((_) async => request);

await TbdexHttpClient.createExchange(rfq, replyTo: 'reply_to');

verify(
() => mockHttpClient.post(
() => client.postUrl(
Uri.parse('$pfiServiceEndpoint/exchanges'),
headers: any(named: 'headers'),
body: request,
),
).called(1);
});
Expand All @@ -124,25 +139,27 @@ void main() async {
final order = TestData.getOrder(to: pfiDid);
final exchangeId = order.metadata.exchangeId;
await order.sign(TestData.aliceDid);
final request = TestData.getSubmitOrderRequest(order);

when(
() => mockHttpClient.post(
Uri.parse('$pfiServiceEndpoint/exchanges/$exchangeId'),
headers: any(named: 'headers'),
body: request,
),
).thenAnswer(
(_) async => http.Response('', 201),
request.write(TestData.getSubmitOrderRequest(order));

when(() => request.headers).thenReturn(headers);
when(() => request.close()).thenAnswer((_) async => response);

when(() => response.statusCode).thenReturn(201);
when(() => response.transform(utf8.decoder)).thenAnswer(
(_) => Stream.value(''),
);

when(
() => client
.postUrl(Uri.parse('$pfiServiceEndpoint/exchanges/$exchangeId')),
).thenAnswer((_) async => request);

await TbdexHttpClient.submitOrder(order);

verify(
() => mockHttpClient.post(
() => client.postUrl(
Uri.parse('$pfiServiceEndpoint/exchanges/$exchangeId'),
headers: any(named: 'headers'),
body: request,
),
).called(1);
});
Expand All @@ -151,25 +168,27 @@ void main() async {
final close = TestData.getClose(to: pfiDid);
final exchangeId = close.metadata.exchangeId;
await close.sign(TestData.aliceDid);
final request = TestData.getSubmitCloseRequest(close);

when(
() => mockHttpClient.post(
Uri.parse('$pfiServiceEndpoint/exchanges/$exchangeId'),
headers: any(named: 'headers'),
body: request,
),
).thenAnswer(
(_) async => http.Response('', 201),
request.write(TestData.getSubmitCloseRequest(close));

when(() => request.headers).thenReturn(headers);
when(() => request.close()).thenAnswer((_) async => response);

when(() => response.statusCode).thenReturn(201);
when(() => response.transform(utf8.decoder)).thenAnswer(
(_) => Stream.value(''),
);

when(
() => client
.postUrl(Uri.parse('$pfiServiceEndpoint/exchanges/$exchangeId')),
).thenAnswer((_) async => request);

await TbdexHttpClient.submitClose(close);

verify(
() => mockHttpClient.post(
() => client.postUrl(
Uri.parse('$pfiServiceEndpoint/exchanges/$exchangeId'),
headers: any(named: 'headers'),
body: request,
),
).called(1);
});
Expand Down

0 comments on commit 27243b1

Please sign in to comment.