Files
votianlt/app/test/models/message_envelope_test.dart

191 lines
6.1 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:votianlt_app/models/message_envelope.dart';
void main() {
group('MessageEnvelope', () {
group('fromJson', () {
test('parses all required fields correctly', () {
final json = {
'messageId': 'test-uuid-123',
'timestamp': '2024-01-15T10:30:00.000Z',
'topic': '/server/user123/message',
'payload': {'key': 'value'},
};
final envelope = MessageEnvelope.fromJson(json);
expect(envelope.messageId, 'test-uuid-123');
expect(envelope.timestamp, DateTime.utc(2024, 1, 15, 10, 30, 0));
expect(envelope.topic, '/server/user123/message');
expect(envelope.payload, {'key': 'value'});
expect(envelope.requiresAck, true); // default
expect(envelope.retryCount, 0); // default
expect(envelope.expiresAt, isNull);
});
test('parses optional fields when present', () {
final json = {
'messageId': 'test-uuid-456',
'timestamp': '2024-01-15T10:30:00.000Z',
'topic': '/server/user123/message',
'payload': {'data': 123},
'requiresAck': false,
'retryCount': 3,
'expiresAt': '2024-01-15T11:30:00.000Z',
};
final envelope = MessageEnvelope.fromJson(json);
expect(envelope.requiresAck, false);
expect(envelope.retryCount, 3);
expect(envelope.expiresAt, DateTime.utc(2024, 1, 15, 11, 30, 0));
});
test('handles list payload', () {
final json = {
'messageId': 'test-uuid-789',
'timestamp': '2024-01-15T10:30:00.000Z',
'topic': '/server/user123/jobs',
'payload': [
{'id': '1'},
{'id': '2'}
],
};
final envelope = MessageEnvelope.fromJson(json);
expect(envelope.payload, isList);
expect(envelope.payload.length, 2);
});
test('handles null payload', () {
final json = {
'messageId': 'test-uuid-null',
'timestamp': '2024-01-15T10:30:00.000Z',
'topic': '/server/user123/ping',
'payload': null,
};
final envelope = MessageEnvelope.fromJson(json);
expect(envelope.payload, isNull);
});
});
group('toJson', () {
test('serializes all fields correctly', () {
final envelope = MessageEnvelope(
messageId: 'test-uuid-123',
timestamp: DateTime.utc(2024, 1, 15, 10, 30, 0),
topic: '/server/user123/message',
payload: {'key': 'value'},
requiresAck: true,
retryCount: 2,
expiresAt: DateTime.utc(2024, 1, 15, 11, 30, 0),
);
final json = envelope.toJson();
expect(json['messageId'], 'test-uuid-123');
expect(json['timestamp'], '2024-01-15T10:30:00.000Z');
expect(json['topic'], '/server/user123/message');
expect(json['payload'], {'key': 'value'});
expect(json['requiresAck'], true);
expect(json['retryCount'], 2);
expect(json['expiresAt'], '2024-01-15T11:30:00.000Z');
});
test('omits expiresAt when null', () {
final envelope = MessageEnvelope(
messageId: 'test-uuid-123',
timestamp: DateTime.utc(2024, 1, 15, 10, 30, 0),
topic: '/server/user123/message',
payload: {'key': 'value'},
);
final json = envelope.toJson();
expect(json.containsKey('expiresAt'), false);
});
});
group('fromJson/toJson roundtrip', () {
test('preserves all data through serialization', () {
final original = MessageEnvelope(
messageId: 'roundtrip-uuid',
timestamp: DateTime.utc(2024, 1, 15, 10, 30, 0),
topic: '/server/user123/message',
payload: {'nested': {'key': 'value'}, 'list': [1, 2, 3]},
requiresAck: false,
retryCount: 5,
expiresAt: DateTime.utc(2024, 1, 16, 10, 30, 0),
);
final json = original.toJson();
final restored = MessageEnvelope.fromJson(json);
expect(restored.messageId, original.messageId);
expect(restored.timestamp, original.timestamp);
expect(restored.topic, original.topic);
expect(restored.payload, original.payload);
expect(restored.requiresAck, original.requiresAck);
expect(restored.retryCount, original.retryCount);
expect(restored.expiresAt, original.expiresAt);
});
});
group('copyWith', () {
test('creates copy with updated messageId', () {
final original = MessageEnvelope(
messageId: 'original-id',
timestamp: DateTime.utc(2024, 1, 15, 10, 30, 0),
topic: '/server/user123/message',
payload: {'key': 'value'},
);
final copy = original.copyWith(messageId: 'new-id');
expect(copy.messageId, 'new-id');
expect(copy.timestamp, original.timestamp);
expect(copy.topic, original.topic);
expect(copy.payload, original.payload);
});
test('creates copy with updated retryCount', () {
final original = MessageEnvelope(
messageId: 'test-id',
timestamp: DateTime.utc(2024, 1, 15, 10, 30, 0),
topic: '/server/user123/message',
payload: {'key': 'value'},
retryCount: 0,
);
final copy = original.copyWith(retryCount: 3);
expect(copy.retryCount, 3);
expect(copy.messageId, original.messageId);
});
});
group('toString', () {
test('returns readable representation', () {
final envelope = MessageEnvelope(
messageId: 'test-id',
timestamp: DateTime.utc(2024, 1, 15, 10, 30, 0),
topic: '/server/user123/message',
payload: {'key': 'value'},
requiresAck: true,
retryCount: 2,
);
final str = envelope.toString();
expect(str, contains('test-id'));
expect(str, contains('/server/user123/message'));
expect(str, contains('requiresAck: true'));
expect(str, contains('retryCount: 2'));
});
});
});
}