controller_test.dart 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import 'package:flutter_test/flutter_test.dart';
  2. import 'package:gmus/actions.dart';
  3. import 'package:gmus/controller.dart';
  4. import 'package:gmus/socket.dart';
  5. import 'package:mockito/mockito.dart';
  6. import 'package:web_socket_channel/io.dart';
  7. import 'package:web_socket_channel/web_socket_channel.dart';
  8. void main() {
  9. group('Controller', () {
  10. group('Receiving messages from pubsub', () {
  11. group(CLIENT_LIST_UPDATED, () {
  12. String message = '{"type":"CLIENT_LIST_UPDATED","payload":[{"name":"client-A","lastPing":123},{"name":"client-B","lastPing":456}]}';
  13. test('client list should be updated', () {
  14. Controller controller = Controller();
  15. onRemoteMessage(controller, message);
  16. expect(controller.clients.length, 2);
  17. expect(controller.clients[0].name, 'client-A');
  18. expect(controller.clients[0].lastPing, 123);
  19. expect(controller.clients[1].name, 'client-B');
  20. expect(controller.clients[1].lastPing, 456);
  21. });
  22. });
  23. group(STATE_SET, () {
  24. String message = '{"type":"STATE_SET","payload":{"master":"new-master-client","activeClients":["some-client"],"songId":7123,"currentTime":10.843,"seekTime":23.001,"playing":false,"queue":[9750],"shuffleMode":true}}';
  25. test('player state should be updated', () {
  26. Controller controller = Controller();
  27. onRemoteMessage(controller, message);
  28. expect(controller.player.value.master, 'new-master-client');
  29. expect(controller.player.value.songId, 7123);
  30. expect(controller.player.value.currentTime, 10.843);
  31. expect(controller.player.value.seekTime, 23.001);
  32. expect(controller.player.value.playing, false);
  33. expect(controller.player.value.shuffleMode, true);
  34. });
  35. test('queue should be updated', () {
  36. Controller controller = Controller();
  37. onRemoteMessage(controller, message);
  38. expect(controller.player.value.queue.length, 1);
  39. expect(controller.player.value.queue[0], 9750);
  40. });
  41. test('active clients should be updated', () {
  42. Controller controller = Controller();
  43. onRemoteMessage(controller, message);
  44. expect(controller.player.value.activeClients.length, 1);
  45. expect(controller.player.value.activeClients[0], 9750);
  46. });
  47. });
  48. });
  49. group('Play / pause', () {
  50. group('When slave', () {
  51. group('when paused', () {
  52. test('should send a "play" action to pubsub', () {
  53. var controller = mockControllerAsSlave();
  54. controller.player.value.playing = false;
  55. controller.playPause();
  56. verify(controller.socket.channel.sink.add('{"type":"STATE_SET","payload":{"songId":null,"playing":true,"currentTime":0.0,"seekTime":-1.0,"master":"other-client-name-master","activeClients":[],"queue":[],"shuffleMode":false}}')).called(1);
  57. });
  58. });
  59. group('when playing', () {
  60. test('should send a "pause" action to pubsub', () {
  61. var controller = mockControllerAsSlave();
  62. controller.player.value.playing = true;
  63. controller.player.value.songId = 182;
  64. controller.playPause();
  65. verify(controller.socket.channel.sink.add('{"type":"STATE_SET","payload":{"songId":182,"playing":false,"currentTime":0.0,"seekTime":-1.0,"master":"other-client-name-master","activeClients":[],"queue":[],"shuffleMode":false}}')).called(1);
  66. });
  67. });
  68. });
  69. group('When master', () {
  70. test('should not send any actions to pubsub', () {
  71. var controller = mockControllerAsMaster();
  72. controller.player.value.playing = false;
  73. controller.playPause();
  74. verifyNever(controller.socket.channel.sink.add('{"type":"STATE_SET","payload":{"songId":null,"playing":true,"currentTime":0.0,"seekTime":-1.0,"master":"other-client-name-master","activeClients":[],"queue":[],"shuffleMode":false}}'));
  75. });
  76. });
  77. });
  78. group('Playing a song', () {
  79. group('When slave', () {
  80. test('should send an action to pubsub to play the song', () {
  81. var controller = mockControllerAsSlave();
  82. controller.playSong(871);
  83. verify(controller.socket.channel.sink.add('{"type":"STATE_SET","payload":{"songId":871,"playing":true,"currentTime":0.0,"seekTime":-1.0,"master":"other-client-name-master","activeClients":[],"queue":[],"shuffleMode":false}}')).called(1);
  84. });
  85. });
  86. group('When master', () {
  87. test('should throw an error', () {
  88. var controller = mockControllerAsMaster();
  89. expect(() => controller.playSong(871), throwsException);
  90. });
  91. });
  92. });
  93. });
  94. }
  95. class MockWebSocketSink extends Mock implements WebSocketSink {}
  96. class MockChannel extends Mock implements IOWebSocketChannel {
  97. final WebSocketSink sink;
  98. MockChannel({
  99. this.sink,
  100. });
  101. }
  102. Controller mockControllerAsMaster() {
  103. Controller controllerAsMaster = Controller();
  104. controllerAsMaster.uniqueName.value = 'my-client-name-master';
  105. controllerAsMaster.player.value.master = 'my-client-name-master';
  106. controllerAsMaster.socket.channel = MockChannel(sink: MockWebSocketSink());
  107. return controllerAsMaster;
  108. }
  109. Controller mockControllerAsSlave() {
  110. Controller controllerAsSlave = Controller();
  111. controllerAsSlave.uniqueName.value = 'my-client-name-slave';
  112. controllerAsSlave.player.value.master = 'other-client-name-master';
  113. controllerAsSlave.socket.channel = MockChannel(sink: MockWebSocketSink());
  114. return controllerAsSlave;
  115. }