import 'package:angel3_mq/mq.dart';
import 'package:angel3_mq/src/queue/queue.dart';
import 'package:test/test.dart';

void main() {
  group('Queue', () {
    test('Creating a Queue', () {
      // Arrange
      const queueId = 'my_queue_id';

      // Act
      final myQueue = Queue(queueId);

      // Assert
      expect(myQueue.id, equals(queueId));
      expect(myQueue.latestMessage, isNull);
    });

    test('Get dataStream from Queue', () {
      // Arrange
      const queueId = 'my_queue_id';
      final myQueue = Queue(queueId);

      // Act
      final dataStream = myQueue.dataStream;

      // Assert
      expect(dataStream, isNotNull);
    });

    test('Enqueue and Check Has Listeners', () {
      // Arrange
      const queueId = 'my_queue_id';
      final myQueue = Queue(queueId);
      final message = Message(
        headers: {'contentType': 'json', 'sender': 'Alice'},
        payload: {'text': 'Hello, World!'},
        timestamp: '2023-09-07T12:00:002',
      );

      // Act
      myQueue.enqueue(message);
      final hasListeners = myQueue.hasListeners();

      // Assert
      expect(myQueue.id, equals(queueId));
      expect(myQueue.latestMessage, equals(message));
      expect(hasListeners, isFalse); // No listeners by default
    });

    test('Queue equality', () {
      // Arrange
      final queue1 = Queue('queue_id_1');
      final queue2 = Queue('queue_id_2');
      final queue3 = Queue('queue_id_1'); // Same ID as queue1

      // Act & Assert
      expect(queue1, equals(queue3)); // Should be equal based on ID
      expect(
        queue1,
        isNot(equals(queue2)),
      ); // Should not be equal due to different IDs
    });

    test('Queue hashCode', () {
      // Arrange
      final queue1 = Queue('queue_id_1');
      final queue2 = Queue('queue_id_2');
      final queue3 = Queue('queue_id_1'); // Same ID as queue1

      // Act & Assert
      expect(queue1.hashCode, equals(queue3.hashCode));
      expect(queue1.hashCode, isNot(equals(queue2.hashCode)));
    });

    test('Queue dispose', () {
      // Arrange
      const queueId = 'my_queue_id';
      final myQueue = Queue(queueId);
      final message = Message(
        headers: {'contentType': 'json', 'sender': 'Alice'},
        payload: {'text': 'Hello, World!'},
        timestamp: '2023-09-07T12:00:002',
      );

      // Act
      myQueue
        ..enqueue(message)
        ..dispose();
      final hasListeners = myQueue.hasListeners();

      // Assert
      expect(myQueue.id, equals(queueId));
      expect(myQueue.latestMessage, equals(message));
      expect(hasListeners, isFalse);
    });
  });
}
