Index: pkg/pubserver/test/shelf_pubserver_test.dart |
diff --git a/pkg/pubserver/test/shelf_pubserver_test.dart b/pkg/pubserver/test/shelf_pubserver_test.dart |
deleted file mode 100644 |
index 036ba91bddbe0c8785b60ee692c8b210012304a0..0000000000000000000000000000000000000000 |
--- a/pkg/pubserver/test/shelf_pubserver_test.dart |
+++ /dev/null |
@@ -1,371 +0,0 @@ |
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-library pubserver.shelf_pubserver_test; |
- |
-import 'dart:async'; |
-import 'dart:convert'; |
- |
-import 'package:shelf/shelf.dart' as shelf; |
-import 'package:pubserver/repository.dart'; |
-import 'package:pubserver/shelf_pubserver.dart'; |
-import 'package:unittest/unittest.dart'; |
- |
-class RepositoryMock implements PackageRepository { |
- final Function downloadFun; |
- final Function downloadUrlFun; |
- final Function finishAsyncUploadFun; |
- final Function lookupVersionFun; |
- final Function startAsyncUploadFun; |
- final Function uploadFun; |
- final Function versionsFun; |
- |
- RepositoryMock( |
- {this.downloadFun, this.downloadUrlFun, this.finishAsyncUploadFun, |
- this.lookupVersionFun, this.startAsyncUploadFun, this.uploadFun, |
- this.versionsFun, this.supportsAsyncUpload: false, |
- this.supportsDownloadUrl: false, this.supportsUpload: false}); |
- |
- Future<Stream> download(String package, String version) async { |
- if (downloadFun != null) return downloadFun(package, version); |
- throw 'download'; |
- } |
- |
- Future<Uri> downloadUrl(String package, String version) async { |
- if (downloadUrlFun != null) return downloadUrlFun(package, version); |
- throw 'downloadUrl'; |
- } |
- |
- Future finishAsyncUpload(Uri uri) async { |
- if (finishAsyncUploadFun != null) return finishAsyncUploadFun(uri); |
- throw 'finishAsyncUpload'; |
- } |
- |
- Future<PackageVersion> lookupVersion(String package, String version) async { |
- if (lookupVersionFun != null) return lookupVersionFun(package, version); |
- throw 'lookupVersion'; |
- } |
- |
- Future<AsyncUploadInfo> startAsyncUpload(Uri redirectUrl) async { |
- if (startAsyncUploadFun != null) { |
- return startAsyncUploadFun(redirectUrl); |
- } |
- throw 'startAsyncUpload'; |
- } |
- |
- final bool supportsAsyncUpload; |
- |
- final bool supportsDownloadUrl; |
- |
- final bool supportsUpload; |
- |
- Future upload(Stream<List<int>> data) { |
- if (uploadFun != null) return uploadFun(data); |
- throw 'upload'; |
- } |
- |
- Stream<PackageVersion> versions(String package) { |
- if (versionsFun != null) return versionsFun(package); |
- return new Stream.fromFuture(new Future.error('versions')); |
- } |
-} |
- |
-Uri getUri(String path) => Uri.parse('http://www.example.com$path'); |
- |
-shelf.Request getRequest(String path) { |
- var url = getUri(path); |
- return new shelf.Request('GET', url); |
-} |
- |
-shelf.Request multipartRequest(Uri uri, List<int> bytes) { |
- var requestBytes = []; |
- String boundary = 'testboundary'; |
- |
- requestBytes.addAll(ASCII.encode('--$boundary\r\n')); |
- requestBytes.addAll( |
- ASCII.encode('Content-Type: application/octet-stream\r\n')); |
- requestBytes.addAll(ASCII.encode('Content-Length: ${bytes.length}\r\n')); |
- requestBytes.addAll(ASCII.encode('Content-Disposition: ' |
- 'form-data; name="file"; ' |
- 'filename="package.tar.gz"\r\n\r\n')); |
- requestBytes.addAll(bytes); |
- requestBytes.addAll(ASCII.encode('\r\n--$boundary--\r\n')); |
- |
- var headers = { |
- 'Content-Type' : 'multipart/form-data; boundary="$boundary"', |
- 'Content-Length' : '${requestBytes.length}', |
- }; |
- |
- var body = new Stream.fromIterable([requestBytes]); |
- return new shelf.Request('POST', uri, headers: headers, body: body); |
-} |
- |
-main() { |
- group('shelf_pubserver', () { |
- test('invalid endpoint', () async { |
- var mock = new RepositoryMock(); |
- var server = new ShelfPubServer(mock); |
- |
- testInvalidUrl(String path) async { |
- var request = getRequest(path); |
- var response = await server.requestHandler(request); |
- await response.read().drain(); |
- expect(response.statusCode, equals(404)); |
- } |
- |
- await testInvalidUrl('/foobar'); |
- await testInvalidUrl('/api'); |
- await testInvalidUrl('/api/'); |
- await testInvalidUrl('/api/packages/analyzer/0.1.0'); |
- }); |
- |
- group('/api/packages/<package>', () { |
- test('does not exist', () async { |
- var mock = |
- new RepositoryMock(versionsFun: (_) => new Stream.fromIterable([])); |
- var server = new ShelfPubServer(mock); |
- var request = getRequest('/api/packages/analyzer'); |
- |
- var response = await server.requestHandler(request); |
- await response.read().drain(); |
- expect(response.statusCode, equals(404)); |
- }); |
- |
- test('success full retrieval of version', () async { |
- var mock = new RepositoryMock(versionsFun: (String package) { |
- // The pubspec is invalid, but that is irrelevant for this test. |
- var pubspec = JSON.encode({'foo': 1}); |
- var analyzer = new PackageVersion('analyzer', '0.1.0', pubspec); |
- return new Stream.fromIterable([analyzer]); |
- }); |
- var server = new ShelfPubServer(mock); |
- var request = getRequest('/api/packages/analyzer'); |
- var response = await server.requestHandler(request); |
- var body = await response.readAsString(); |
- |
- var expectedVersionJson = { |
- 'pubspec': {'foo': 1}, |
- 'version': '0.1.0', |
- 'archive_url': |
- '${getUri('/packages/analyzer/versions/0.1.0.tar.gz')}', |
- }; |
- var expectedJson = { |
- 'name': 'analyzer', |
- 'latest': expectedVersionJson, |
- 'versions': [expectedVersionJson], |
- }; |
- |
- expect(response.mimeType, equals('application/json')); |
- expect(response.statusCode, equals(200)); |
- expect(JSON.decode(body), equals(expectedJson)); |
- }); |
- }); |
- |
- group('/api/packages/<package>/versions/<version>', () { |
- test('does not exist', () async { |
- var mock = new RepositoryMock(lookupVersionFun: (_, __) => null); |
- var server = new ShelfPubServer(mock); |
- var request = getRequest('/api/packages/analyzer/versions/0.1.0'); |
- |
- var response = await server.requestHandler(request); |
- await response.read().drain(); |
- expect(response.statusCode, equals(404)); |
- }); |
- |
- test('success full retrieval of version', () async { |
- var mock = new RepositoryMock( |
- lookupVersionFun: (String package, String version) { |
- // The pubspec is invalid, but that is irrelevant for this test. |
- var pubspec = JSON.encode({'foo': 1}); |
- return new PackageVersion(package, version, pubspec); |
- }); |
- var server = new ShelfPubServer(mock); |
- var request = getRequest('/api/packages/analyzer/versions/0.1.0'); |
- var response = await server.requestHandler(request); |
- var body = await response.readAsString(); |
- |
- var expectedJson = { |
- 'pubspec': {'foo': 1}, |
- 'version': '0.1.0', |
- 'archive_url': |
- '${getUri('/packages/analyzer/versions/0.1.0.tar.gz')}', |
- }; |
- |
- expect(response.mimeType, equals('application/json')); |
- expect(response.statusCode, equals(200)); |
- expect(JSON.decode(body), equals(expectedJson)); |
- }); |
- }); |
- |
- group('/packages/<package>/versions/<version>.tar.gz', () { |
- group('download', () { |
- test('successfull redirect', () async { |
- var mock = new RepositoryMock( |
- downloadFun: (String package, String version) { |
- return new Stream.fromIterable([[1, 2, 3]]); |
- }); |
- var server = new ShelfPubServer(mock); |
- var request = getRequest('/packages/analyzer/versions/0.1.0.tar.gz'); |
- var response = await server.requestHandler(request); |
- var body = await response.read().fold([], (b, d) => b..addAll(d)); |
- |
- expect(response.statusCode, equals(200)); |
- expect(body, equals([1, 2, 3])); |
- }); |
- }); |
- |
- group('download url', () { |
- test('successfull redirect', () async { |
- var expectedUrl = |
- Uri.parse('https://blobs.com/analyzer-0.1.0.tar.gz'); |
- var mock = new RepositoryMock(supportsDownloadUrl: true, |
- downloadUrlFun: (String package, String version) { |
- return expectedUrl; |
- }); |
- var server = new ShelfPubServer(mock); |
- var request = getRequest('/packages/analyzer/versions/0.1.0.tar.gz'); |
- var response = await server.requestHandler(request); |
- var body = await response.readAsString(); |
- |
- expect(response.statusCode, equals(303)); |
- expect(response.headers['location'], equals('$expectedUrl')); |
- }); |
- }); |
- }); |
- |
- group('/api/packages/versions/new', () { |
- test('async successfull', () async { |
- var expectedUrl = Uri.parse('https://storage.googleapis.com'); |
- var foobarUrl = Uri.parse('https://foobar.com/package/done'); |
- var newUrl = getUri('/api/packages/versions/new'); |
- var finishUrl = getUri('/api/packages/versions/newUploadFinish'); |
- var mock = new RepositoryMock( |
- supportsUpload: true, |
- supportsAsyncUpload: true, |
- startAsyncUploadFun: (Uri redirectUri) { |
- expect(redirectUri, equals(finishUrl)); |
- return new Future.value( |
- new AsyncUploadInfo(expectedUrl, {'a' : '$foobarUrl'})); |
- }, finishAsyncUploadFun: (Uri uri) { |
- expect('$uri', equals('$finishUrl')); |
- }); |
- var server = new ShelfPubServer(mock); |
- |
- // Start upload |
- var request = new shelf.Request('GET', newUrl); |
- var response = await server.requestHandler(request); |
- |
- expect(response.statusCode, equals(200)); |
- expect(response.headers['content-type'], equals('application/json')); |
- |
- var jsonBody = JSON.decode(await response.readAsString()); |
- expect(jsonBody, equals({ |
- 'url' : '$expectedUrl', |
- 'fields' : { |
- 'a' : '$foobarUrl', |
- }, |
- })); |
- |
- // We would do now a multipart POST to `expectedUrl` which would |
- // redirect us back to the pub.dartlang.org app via `finishUrl`. |
- |
- // Call the `finishUrl`. |
- request = new shelf.Request('GET', finishUrl); |
- response = await server.requestHandler(request); |
- jsonBody = JSON.decode(await response.readAsString()); |
- expect(jsonBody, equals({ |
- 'success' : { |
- 'message' : 'Successfully uploaded package.' |
- }, |
- })); |
- }); |
- |
- test('sync successfull', () async { |
- var tarballBytes = const [1, 2, 3]; |
- var newUrl = getUri('/api/packages/versions/new'); |
- var uploadUrl = getUri('/api/packages/versions/newUpload'); |
- var finishUrl = getUri('/api/packages/versions/newUploadFinish'); |
- var mock = new RepositoryMock( |
- supportsUpload: true, |
- uploadFun: (Stream<List<int>> stream) { |
- return stream.fold([], (b, d) => b..addAll(d)).then((List<int> data) { |
- expect(data, equals(tarballBytes)); |
- }); |
- }); |
- var server = new ShelfPubServer(mock); |
- |
- // Start upload |
- var request = new shelf.Request('GET', newUrl); |
- var response = await server.requestHandler(request); |
- expect(response.statusCode, equals(200)); |
- expect(response.headers['content-type'], equals('application/json')); |
- var jsonBody = JSON.decode(await response.readAsString()); |
- expect(jsonBody, equals({ |
- 'url' : '$uploadUrl', |
- 'fields' : {}, |
- })); |
- |
- // Post data via a multipart request. |
- request = multipartRequest(uploadUrl, tarballBytes); |
- response = await server.requestHandler(request); |
- await response.read(); |
- expect(response.statusCode, equals(302)); |
- expect(response.headers['location'], equals('$finishUrl')); |
- |
- // Call the `finishUrl`. |
- request = new shelf.Request('GET', finishUrl); |
- response = await server.requestHandler(request); |
- jsonBody = JSON.decode(await response.readAsString()); |
- expect(jsonBody, equals({ |
- 'success' : { |
- 'message' : 'Successfully uploaded package.' |
- }, |
- })); |
- }); |
- |
- test('sync failure', () async { |
- var tarballBytes = const [1, 2, 3]; |
- var newUrl = getUri('/api/packages/versions/new'); |
- var uploadUrl = getUri('/api/packages/versions/newUpload'); |
- var finishUrl = |
- getUri('/api/packages/versions/newUploadFinish?error=abc'); |
- var mock = new RepositoryMock( |
- supportsUpload: true, |
- uploadFun: (Stream<List<int>> stream) { |
- return new Future.error('abc'); |
- }); |
- var server = new ShelfPubServer(mock); |
- |
- // Start upload - would happen here. |
- |
- // Post data via a multipart request. |
- var request = multipartRequest(uploadUrl, tarballBytes); |
- var response = await server.requestHandler(request); |
- await response.read(); |
- expect(response.statusCode, equals(302)); |
- expect(response.headers['location'], equals('$finishUrl')); |
- |
- // Call the `finishUrl`. |
- request = new shelf.Request('GET', finishUrl); |
- response = await server.requestHandler(request); |
- var jsonBody = JSON.decode(await response.readAsString()); |
- expect(jsonBody, equals({ |
- 'error' : { |
- 'message' : 'abc' |
- }, |
- })); |
- }); |
- |
- test('unsupported', () async { |
- var newUrl = getUri('/api/packages/versions/new'); |
- var mock = new RepositoryMock(); |
- var server = new ShelfPubServer(mock); |
- var request = new shelf.Request('GET', newUrl); |
- var response = await server.requestHandler(request); |
- |
- expect(response.statusCode, equals(404)); |
- }); |
- }); |
- }); |
-} |