Browse Source

Merge pull request #393 from provokateurin/feature/more-tests

Add more tests
pull/398/head
Kate 1 year ago committed by GitHub
parent
commit
eef069f900
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 21
      packages/nextcloud/lib/src/webdav/client.dart
  2. 7
      packages/nextcloud/lib/src/webdav/file.dart
  3. 2
      packages/nextcloud/lib/src/webdav/webdav.dart
  4. 4
      packages/nextcloud/lib/src/webdav/webdav.g.dart
  5. 29
      packages/nextcloud/test/core.dart
  6. 121
      packages/nextcloud/test/webdav.dart

21
packages/nextcloud/lib/src/webdav/client.dart

@ -164,16 +164,12 @@ class WebDavClient {
final DateTime? lastModified, final DateTime? lastModified,
final DateTime? created, final DateTime? created,
}) => }) =>
_send( uploadStream(
'PUT', Stream.value(localData),
_constructPath(remotePath), remotePath,
[200, 201, 204],
data: Stream.value(localData),
headers: _generateUploadHeaders(
lastModified: lastModified, lastModified: lastModified,
created: created, created: created,
contentLength: localData.lengthInBytes, contentLength: localData.lengthInBytes,
),
); );
/// upload a new file with [localData] as content to [remotePath] /// upload a new file with [localData] as content to [remotePath]
@ -197,15 +193,8 @@ class WebDavClient {
); );
/// download [remotePath] and store the response file contents to String /// download [remotePath] and store the response file contents to String
Future<Uint8List> download(final String remotePath) async => Uint8List.fromList( Future<Uint8List> download(final String remotePath) async =>
(await (await _send( Uint8List.fromList((await (await downloadStream(remotePath)).join()).codeUnits);
'GET',
_constructPath(remotePath),
[200],
))
.join())
.codeUnits,
);
/// download [remotePath] and store the response file contents to ByteStream /// download [remotePath] and store the response file contents to ByteStream
Future<HttpClientResponse> downloadStream(final String remotePath) async => _send( Future<HttpClientResponse> downloadStream(final String remotePath) async => _send(

7
packages/nextcloud/lib/src/webdav/file.dart

@ -71,11 +71,12 @@ class WebDavFile {
/// Upload date of the file /// Upload date of the file
late final DateTime? uploadedDate = late final DateTime? uploadedDate =
props.ncuploadtime != null ? DateTime.fromMillisecondsSinceEpoch(props.ncuploadtime! * 1000) : null; props.ncuploadtime != null ? DateTime.fromMillisecondsSinceEpoch(props.ncuploadtime! * 1000, isUtc: true) : null;
/// Creation date of the file as provided by uploader /// Creation date of the file as provided by uploader
late final DateTime? createdDate = late final DateTime? createdDate = props.nccreationtime != null
props.nccreationtime != null ? DateTime.fromMillisecondsSinceEpoch(props.nccreationtime! * 1000) : null; ? DateTime.fromMillisecondsSinceEpoch(props.nccreationtime! * 1000, isUtc: true)
: null;
/// Whether this file is marked as favorite /// Whether this file is marked as favorite
late final bool? favorite = props.ocfavorite == null ? null : props.ocfavorite == 1; late final bool? favorite = props.ocfavorite == null ? null : props.ocfavorite == 1;

2
packages/nextcloud/lib/src/webdav/webdav.dart

@ -84,7 +84,7 @@ class WebDavPropertyupdate with _$WebDavPropertyupdateXmlSerializableMixin {
} }
@annotation.XmlSerializable(createMixin: true) @annotation.XmlSerializable(createMixin: true)
@annotation.XmlRootElement(name: 'propertyupdate', namespace: namespaceDav) @annotation.XmlRootElement(name: 'set', namespace: namespaceDav)
class WebDavSet with _$WebDavSetXmlSerializableMixin { class WebDavSet with _$WebDavSetXmlSerializableMixin {
WebDavSet({ WebDavSet({
required this.prop, required this.prop,

4
packages/nextcloud/lib/src/webdav/webdav.g.dart

@ -289,7 +289,7 @@ void _$WebDavSetBuildXmlChildren(WebDavSet instance, XmlBuilder builder, {Map<St
} }
void _$WebDavSetBuildXmlElement(WebDavSet instance, XmlBuilder builder, {Map<String, String> namespaces = const {}}) { void _$WebDavSetBuildXmlElement(WebDavSet instance, XmlBuilder builder, {Map<String, String> namespaces = const {}}) {
builder.element('propertyupdate', namespace: 'DAV:', namespaces: namespaces, nest: () { builder.element('set', namespace: 'DAV:', namespaces: namespaces, nest: () {
instance.buildXmlChildren(builder, namespaces: namespaces); instance.buildXmlChildren(builder, namespaces: namespaces);
}); });
} }
@ -316,7 +316,7 @@ List<XmlNode> _$WebDavSetToXmlChildren(WebDavSet instance, {Map<String, String?>
XmlElement _$WebDavSetToXmlElement(WebDavSet instance, {Map<String, String?> namespaces = const {}}) { XmlElement _$WebDavSetToXmlElement(WebDavSet instance, {Map<String, String?> namespaces = const {}}) {
return XmlElement( return XmlElement(
XmlName('propertyupdate', namespaces['DAV:']), XmlName('set', namespaces['DAV:']),
[...namespaces.toXmlAttributes(), ...instance.toXmlAttributes(namespaces: namespaces)], [...namespaces.toXmlAttributes(), ...instance.toXmlAttributes(namespaces: namespaces)],
instance.toXmlChildren(namespaces: namespaces)); instance.toXmlChildren(namespaces: namespaces));
} }

29
packages/nextcloud/test/core.dart

@ -1,3 +1,4 @@
import 'package:crypto/crypto.dart';
import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/nextcloud.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
@ -98,5 +99,33 @@ Future run(final DockerImage image) async {
expect(response.ocs.data[2].subline, ''); expect(response.ocs.data[2].subline, '');
expect(response.ocs.data[2].shareWithDisplayNameUnique, ''); expect(response.ocs.data[2].shareWithDisplayNameUnique, '');
}); });
test('Get preview', () async {
final response = await client.core.getPreview(file: 'Nextcloud.png');
expect(sha1.convert(response).toString(), '168c31b76ae4e8bdc5f8edd4c896f40e9d4afe1e');
});
test('Get avatar', () async {
final response = await client.core.getAvatar(userId: 'admin', size: 32);
expect(sha1.convert(response).toString(), '618830d6512203281de64cc738e8a7b0cc3d1f47');
});
test('Get dark avatar', () async {
final response = await client.core.getDarkAvatar(userId: 'admin', size: 32);
expect(sha1.convert(response).toString(), 'e7294d71b817d05940574061008c80a7d7a04b87');
});
test('Delete app password', () async {
client = await getTestClient(
container,
useAppPassword: true,
);
await client.core.deleteAppPassword();
expect(
() => client.core.getCapabilities(),
throwsA(predicate((final e) => (e! as NextcloudApiException).statusCode == 401)),
);
});
}); });
} }

121
packages/nextcloud/test/webdav.dart

@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:crypto/crypto.dart';
import 'package:nextcloud/nextcloud.dart'; import 'package:nextcloud/nextcloud.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
@ -141,6 +142,18 @@ Future run(final DockerImage image) async {
); );
}); });
test('Download file', () async {
final response = await client.webdav.download('Nextcloud.png');
expect(sha1.convert(response).toString(), '5ab8040bc0e9a3c47f45abd8a6d44f6e381ba6ed');
});
test('Delete file', () async {
final response = await client.webdav.delete('Nextcloud.png');
expect(response.statusCode, 204);
final responses = (await client.webdav.ls('/')).responses;
expect(responses.where((final response) => response.href!.endsWith('/Nextcloud.png')), hasLength(0));
});
test('Copy file', () async { test('Copy file', () async {
final response = await client.webdav.copy( final response = await client.webdav.copy(
'Nextcloud.png', 'Nextcloud.png',
@ -208,7 +221,7 @@ Future run(final DockerImage image) async {
}); });
test('Get file props', () async { test('Get file props', () async {
final props = (await client.webdav.ls( final response = (await client.webdav.ls(
'Nextcloud.png', 'Nextcloud.png',
prop: WebDavPropfindProp.fromBools( prop: WebDavPropfindProp.fromBools(
davgetlastmodified: true, davgetlastmodified: true,
@ -240,38 +253,54 @@ Future run(final DockerImage image) async {
ocmsharepermissions: true, ocmsharepermissions: true,
), ),
)) ))
.responses .toWebDavFiles(client.webdav)
.single .single;
.propstats
.first expect(response.path, '/Nextcloud.png');
.prop; expect(response.id, isNotEmpty);
expect(webdavDateFormat.parseUtc(props.davgetlastmodified!).isBefore(DateTime.now()), isTrue); expect(response.fileId, isNotEmpty);
expect(props.davgetetag, isNotEmpty); expect(response.isCollection, isFalse);
expect(props.davgetcontenttype, 'image/png'); expect(response.mimeType, 'image/png');
expect(props.davgetcontentlength, 50598); expect(response.etag, isNotEmpty);
expect(props.davresourcetype!.collection, isNull); expect(response.size, 50598);
expect(props.ocid, isNotEmpty); expect(response.ownerId, 'user1');
expect(props.ocfileid, isNotEmpty); expect(response.ownerDisplay, 'User One');
expect(props.ocfavorite, 0); expect(response.lastModified!.isBefore(DateTime.now()), isTrue);
expect(props.occommentshref, isNotEmpty); expect(response.isDirectory, isFalse);
expect(props.occommentscount, 0); expect(response.uploadedDate, DateTime.utc(1970));
expect(props.occommentsunread, 0); expect(response.createdDate, DateTime.utc(1970));
expect(props.ocdownloadurl, isNull); expect(response.favorite, isFalse);
expect(props.ocownerid, 'user1'); expect(response.hasPreview, isTrue);
expect(props.ocownerdisplayname, 'User One'); expect(response.name, 'Nextcloud.png');
expect(props.ocsize, 50598); expect(response.isDirectory, isFalse);
expect(props.ocpermissions, 'RGDNVW');
expect(props.ncnote, isNull); expect(webdavDateFormat.parseUtc(response.props.davgetlastmodified!).isBefore(DateTime.now()), isTrue);
expect(props.ncdatafingerprint, isNull); expect(response.props.davgetetag, isNotEmpty);
expect(props.nchaspreview, isTrue); expect(response.props.davgetcontenttype, 'image/png');
expect(props.ncmounttype, isNull); expect(response.props.davgetcontentlength, 50598);
expect(props.ncisencrypted, isNull); expect(response.props.davresourcetype!.collection, isNull);
expect(props.ncmetadataetag, isNull); expect(response.props.ocid, isNotEmpty);
expect(props.ncuploadtime, 0); expect(response.props.ocfileid, isNotEmpty);
expect(props.nccreationtime, 0); expect(response.props.ocfavorite, 0);
expect(props.ncrichworkspace, isNull); expect(response.props.occommentshref, isNotEmpty);
expect(props.ocssharepermissions, 19); expect(response.props.occommentscount, 0);
expect(json.decode(props.ocmsharepermissions!), ['share', 'read', 'write']); expect(response.props.occommentsunread, 0);
expect(response.props.ocdownloadurl, isNull);
expect(response.props.ocownerid, 'user1');
expect(response.props.ocownerdisplayname, 'User One');
expect(response.props.ocsize, 50598);
expect(response.props.ocpermissions, 'RGDNVW');
expect(response.props.ncnote, isNull);
expect(response.props.ncdatafingerprint, isNull);
expect(response.props.nchaspreview, isTrue);
expect(response.props.ncmounttype, isNull);
expect(response.props.ncisencrypted, isNull);
expect(response.props.ncmetadataetag, isNull);
expect(response.props.ncuploadtime, 0);
expect(response.props.nccreationtime, 0);
expect(response.props.ncrichworkspace, isNull);
expect(response.props.ocssharepermissions, 19);
expect(json.decode(response.props.ocmsharepermissions!), ['share', 'read', 'write']);
}); });
test('Get directory props', () async { test('Get directory props', () async {
@ -279,7 +308,7 @@ Future run(final DockerImage image) async {
await client.webdav.mkdir('test'); await client.webdav.mkdir('test');
await client.webdav.upload(data, 'test/test.txt'); await client.webdav.upload(data, 'test/test.txt');
final props = (await client.webdav.ls( final response = (await client.webdav.ls(
'test', 'test',
prop: WebDavPropfindProp.fromBools( prop: WebDavPropfindProp.fromBools(
davgetcontenttype: true, davgetcontenttype: true,
@ -289,15 +318,21 @@ Future run(final DockerImage image) async {
), ),
depth: '0', depth: '0',
)) ))
.responses .toWebDavFiles(client.webdav)
.single .single;
.propstats
.first expect(response.path, '/test/');
.prop; expect(response.isCollection, isTrue);
expect(props.davgetcontenttype, isNull); expect(response.mimeType, isNull);
expectDateInReasonableTimeRange(webdavDateFormat.parseUtc(props.davgetlastmodified!), DateTime.now()); expect(response.size, data.lengthInBytes);
expect(props.davresourcetype!.collection, isNotNull); expectDateInReasonableTimeRange(response.lastModified!, DateTime.now());
expect(props.ocsize, data.lengthInBytes); expect(response.name, 'test');
expect(response.isDirectory, isTrue);
expect(response.props.davgetcontenttype, isNull);
expectDateInReasonableTimeRange(webdavDateFormat.parseUtc(response.props.davgetlastmodified!), DateTime.now());
expect(response.props.davresourcetype!.collection, isNotNull);
expect(response.props.ocsize, data.lengthInBytes);
}); });
test('Filter files', () async { test('Filter files', () async {

Loading…
Cancel
Save