Skip to content

Commit

Permalink
api: Add mimeType param to uploadFile binding
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisbobbe committed Jul 24, 2024
1 parent 6bde85b commit 9dec325
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 2 deletions.
3 changes: 2 additions & 1 deletion lib/api/route/messages.dart
Original file line number Diff line number Diff line change
Expand Up @@ -262,9 +262,10 @@ Future<UploadFileResult> uploadFile(
required Stream<List<int>> content,
required int length,
required String filename,
required String? mimeType,
}) {
return connection.postFileFromStream('uploadFile', UploadFileResult.fromJson, 'user_uploads',
content, length, filename: filename);
content, length, filename: filename, contentType: mimeType);
}

@JsonSerializable(fieldRename: FieldRename.snake)
Expand Down
6 changes: 5 additions & 1 deletion lib/widgets/compose_box.dart
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,11 @@ Future<void> _uploadFiles({
Uri? url;
try {
final result = await uploadFile(store.connection,
content: content, length: length, filename: filename);
content: content,
length: length,
filename: filename,
mimeType: null, // TODO(#829)
);
url = Uri.parse(result.uri);
} catch (e) {
if (!context.mounted) return;
Expand Down
49 changes: 49 additions & 0 deletions test/api/route/messages_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,55 @@ void main() {
});
});

group('uploadFile', () {
Future<void> checkUploadFile(FakeApiConnection connection, {
required List<List<int>> content,
required int length,
required String filename,
required String? mimeType,
}) async {
connection.prepare(json:
UploadFileResult(uri: '/user_uploads/1/4e/m2A3MSqFnWRLUf9SaPzQ0Up_/$filename').toJson());
await uploadFile(connection,
content: Stream.fromIterable(content),
length: length,
filename: filename,
mimeType: mimeType);
check(connection.lastRequest).isA<http.MultipartRequest>()
..method.equals('POST')
..url.path.equals('/api/v1/user_uploads')
..files.single.which((it) => it
..field.equals('file')
..length.equals(length)
..filename.equals(filename)
..contentType.asString.equals(mimeType ?? 'application/octet-stream')
..has<Future<List<int>>>((f) => f.finalize().toBytes(), 'contents')
.completes((it) => it.deepEquals(content.expand((l) => l))));
}

test('with mime type', () {
return FakeApiConnection.with_((connection) async {
await checkUploadFile(connection,
content: ['asdf'.codeUnits],
length: 4,
filename: 'image.jpg',
mimeType: 'image/jpeg',
);
});
});

test('without mime type', () {
return FakeApiConnection.with_((connection) async {
await checkUploadFile(connection,
content: ['asdf'.codeUnits],
length: 4,
filename: 'some_file',
mimeType: null,
);
});
});
});

group('addReaction', () {
Future<void> checkAddReaction(FakeApiConnection connection, {
required int messageId,
Expand Down

0 comments on commit 9dec325

Please sign in to comment.