diff --git a/packages/realtime_client/lib/src/message.dart b/packages/realtime_client/lib/src/message.dart index ef4fe366..6458e4f6 100644 --- a/packages/realtime_client/lib/src/message.dart +++ b/packages/realtime_client/lib/src/message.dart @@ -5,14 +5,14 @@ class Message { final String topic; final ChannelEvents event; final dynamic payload; - final String ref; + final String? ref; final String? joinRef; Message({ required this.topic, required this.event, required this.payload, - required this.ref, + this.ref, this.joinRef, }); @@ -48,7 +48,7 @@ class Message { 'event': event != ChannelEvents.heartbeat ? event.eventName() : 'heartbeat', 'payload': processedPayload, - 'ref': ref, + if (ref != null) 'ref': ref, if (joinRef != null) 'join_ref': joinRef, }; } diff --git a/packages/realtime_client/test/message_test.dart b/packages/realtime_client/test/message_test.dart new file mode 100644 index 00000000..8f3ed566 --- /dev/null +++ b/packages/realtime_client/test/message_test.dart @@ -0,0 +1,94 @@ +import 'package:realtime_client/src/constants.dart'; +import 'package:realtime_client/src/message.dart'; +import 'package:test/test.dart'; + +void main() { + group('Message', () { + test('message with null refs serializes correctly', () { + final message = Message( + topic: 'phoenix', + event: ChannelEvents.heartbeat, + payload: {}, + ref: null, + joinRef: null, + ); + final json = message.toJson(); + expect(json['ref'], isNull); + expect(json['join_ref'], isNull); + expect(json['topic'], equals('phoenix')); + expect(json['event'], equals('heartbeat')); + expect(json['payload'], equals({})); + }); + + test('heartbeat message with null joinRef', () { + final message = Message( + topic: 'phoenix', + event: ChannelEvents.heartbeat, + payload: {}, + ref: '123', + joinRef: null, + ); + final json = message.toJson(); + expect(json['ref'], equals('123')); + expect(json.containsKey('join_ref'), isFalse); + expect(json['topic'], equals('phoenix')); + expect(json['event'], equals('heartbeat')); + }); + + test('message with null ref but valid joinRef', () { + final message = Message( + topic: 'room:lobby', + event: ChannelEvents.join, + payload: {'user_id': '123'}, + ref: null, + joinRef: 'join-456', + ); + final json = message.toJson(); + expect(json.containsKey('ref'), isFalse); + expect(json['join_ref'], equals('join-456')); + expect(json['topic'], equals('room:lobby')); + expect(json['payload'], equals({'user_id': '123'})); + }); + + test('message with both ref and joinRef', () { + final message = Message( + topic: 'room:lobby', + event: ChannelEvents.join, + payload: {'user_id': '123'}, + ref: 'ref-789', + joinRef: 'join-456', + ); + final json = message.toJson(); + expect(json['ref'], equals('ref-789')); + expect(json['join_ref'], equals('join-456')); + expect(json['topic'], equals('room:lobby')); + expect(json['payload'], equals({'user_id': '123'})); + }); + + test('message with ref but null joinRef', () { + final message = Message( + topic: 'room:lobby', + event: ChannelEvents.leave, + payload: {}, + ref: 'ref-999', + joinRef: null, + ); + final json = message.toJson(); + expect(json['ref'], equals('ref-999')); + expect(json.containsKey('join_ref'), isFalse); + expect(json['topic'], equals('room:lobby')); + }); + + test('ref parameter is optional in constructor', () { + final message = Message( + topic: 'phoenix', + event: ChannelEvents.heartbeat, + payload: {}, + // ref is not provided, should be null + ); + expect(message.ref, isNull); + final json = message.toJson(); + expect(json.containsKey('ref'), isFalse); + }); + }); +}