controller_test.dart 4.9 KB

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