controller_test.dart 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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","songId":7123,"currentTime":10.843,"seekTime":23.001,"playing":false,"queue":[9750]}}';
  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. });
  34. test('queue should be updated', () {
  35. Controller controller = Controller();
  36. onRemoteMessage(controller, message);
  37. expect(controller.player.value.queue.length, 1);
  38. expect(controller.player.value.queue[0], 9750);
  39. });
  40. });
  41. });
  42. group('Play / pause', () {
  43. group('When slave', () {
  44. group('when paused', () {
  45. test('should send a "play" action to pubsub', () {
  46. var controller = mockControllerAsSlave();
  47. controller.player.value.playing = false;
  48. controller.playPause();
  49. 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);
  50. });
  51. });
  52. group('when playing', () {
  53. test('should send a "pause" action to pubsub', () {
  54. var controller = mockControllerAsSlave();
  55. controller.player.value.playing = true;
  56. controller.player.value.songId = 182;
  57. controller.playPause();
  58. 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);
  59. });
  60. });
  61. });
  62. group('When master', () {
  63. test('should not send any actions to pubsub', () {
  64. var controller = mockControllerAsMaster();
  65. controller.player.value.playing = false;
  66. controller.playPause();
  67. 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":[]}}'));
  68. });
  69. });
  70. });
  71. group('Playing a song', () {
  72. group('When slave', () {
  73. test('should send an action to pubsub to play the song', () {
  74. var controller = mockControllerAsSlave();
  75. controller.playSong(871);
  76. 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);
  77. });
  78. });
  79. group('When master', () {
  80. test('should throw an error', () {
  81. var controller = mockControllerAsMaster();
  82. expect(() => controller.playSong(871), throwsException);
  83. });
  84. });
  85. });
  86. });
  87. }
  88. class MockWebSocketSink extends Mock implements WebSocketSink {}
  89. class MockChannel extends Mock implements IOWebSocketChannel {
  90. final WebSocketSink sink;
  91. MockChannel({
  92. this.sink,
  93. });
  94. }
  95. Controller mockControllerAsMaster() {
  96. Controller controllerAsMaster = Controller();
  97. controllerAsMaster.uniqueName.value = 'my-client-name-master';
  98. controllerAsMaster.player.value.master = 'my-client-name-master';
  99. controllerAsMaster.channel = MockChannel(sink: MockWebSocketSink());
  100. return controllerAsMaster;
  101. }
  102. Controller mockControllerAsSlave() {
  103. Controller controllerAsSlave = Controller();
  104. controllerAsSlave.uniqueName.value = 'my-client-name-slave';
  105. controllerAsSlave.player.value.master = 'other-client-name-master';
  106. controllerAsSlave.channel = MockChannel(sink: MockWebSocketSink());
  107. return controllerAsSlave;
  108. }