Skip to content

Commit 0c507fb

Browse files
committed
api: Add send-submessage route
The route is not documented in the Zulip API Documentation. Instead, we refer to the zulip-mobile implementation and https://zulip.readthedocs.io/en/latest/subsystems/widgets.html#polls-todo-lists-and-games. Signed-off-by: Zixuan James Li <[email protected]>
1 parent f86498e commit 0c507fb

File tree

5 files changed

+49
-3
lines changed

5 files changed

+49
-3
lines changed

lib/api/model/events.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/api/model/submessage.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,12 @@ class Submessage {
8282
/// The only type of submessage that actually exists in Zulip (as of 2024,
8383
/// and since this "submessages" subsystem was created in 2017–2018)
8484
/// is [SubmessageType.widget].
85+
@JsonEnum(fieldRename: FieldRename.snake, alwaysCreate: true)
8586
enum SubmessageType {
8687
widget,
87-
unknown,
88+
unknown;
89+
90+
String toJson() => _$SubmessageTypeEnumMap[this]!;
8891
}
8992

9093
/// The data encoded in a submessage at [Submessage.content].

lib/api/model/submessage.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/api/route/submessage.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import '../core.dart';
2+
import '../model/submessage.dart';
3+
4+
/// https://zulip.readthedocs.io/en/latest/subsystems/widgets.html#polls-todo-lists-and-games
5+
/// https://github.com/zulip/zulip-mobile/blob/fc23edd67a5ec7f32c7c5f6cd81893b94dc043a2/src/api/submessages/sendSubmessage.js
6+
Future<void> sendSubmessage(ApiConnection connection, {
7+
required int messageId,
8+
required SubmessageType submessageType,
9+
required SubmessageData content,
10+
}) {
11+
return connection.post('sendSubmessage', (_) {}, 'submessage', {
12+
'message_id': messageId,
13+
'msg_type': RawParameter(submessageType.toJson()),
14+
'content': content,
15+
});
16+
}

test/api/route/submessage_test.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'package:checks/checks.dart';
2+
import 'package:http/http.dart' as http;
3+
import 'package:flutter_test/flutter_test.dart';
4+
import 'package:zulip/api/model/submessage.dart';
5+
import 'package:zulip/api/route/submessage.dart';
6+
7+
import '../../stdlib_checks.dart';
8+
import '../fake_api.dart';
9+
10+
void main() {
11+
test('smoke sendSubmessage', () {
12+
return FakeApiConnection.with_<void>((connection) async {
13+
connection.prepare(json: {});
14+
await sendSubmessage(connection, messageId: 1,
15+
submessageType: SubmessageType.widget,
16+
content: PollQuestionEventSubmessage(question: 'test question'));
17+
check(connection.takeRequests()).single.isA<http.Request>()
18+
..method.equals('POST')
19+
..url.path.equals('/api/v1/submessage')
20+
..bodyFields.deepEquals({
21+
'message_id': '1',
22+
'msg_type': 'widget',
23+
'content': '{"type":"question","question":"test question"}',
24+
});
25+
});
26+
});
27+
}

0 commit comments

Comments
 (0)