pluginsStore.spec.jsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import {Plugin} from 'fixtures/js-stubs/plugin';
  2. import {Plugins} from 'fixtures/js-stubs/plugins';
  3. import PluginsStore from 'sentry/stores/pluginsStore';
  4. describe('PluginsStore', function () {
  5. beforeAll(function () {
  6. jest.spyOn(PluginsStore, 'trigger');
  7. });
  8. beforeEach(function () {
  9. PluginsStore.trigger.mockReset();
  10. });
  11. afterEach(function () {});
  12. it('has correct initial state', function () {
  13. PluginsStore.reset();
  14. expect(PluginsStore.getState()).toEqual({
  15. loading: true,
  16. error: null,
  17. pageLinks: null,
  18. plugins: [],
  19. });
  20. });
  21. describe('fetchAll', function () {
  22. beforeEach(function () {
  23. PluginsStore.reset();
  24. });
  25. it('has correct state when all plugins fetched successfully', function () {
  26. PluginsStore.onFetchAll();
  27. expect(PluginsStore.trigger).toHaveBeenCalledWith({
  28. loading: true,
  29. error: null,
  30. pageLinks: null,
  31. plugins: [],
  32. });
  33. PluginsStore.onFetchAllSuccess(Plugins(), {pageLinks: null});
  34. expect(PluginsStore.trigger).toHaveBeenCalledWith({
  35. loading: false,
  36. error: null,
  37. pageLinks: null,
  38. plugins: Plugins(),
  39. });
  40. });
  41. it('has correct state when error in fetching all plugins', function () {
  42. PluginsStore.onFetchAll();
  43. expect(PluginsStore.trigger).toHaveBeenCalledWith({
  44. loading: true,
  45. error: null,
  46. pageLinks: null,
  47. plugins: [],
  48. });
  49. PluginsStore.onFetchAllError({responseJSON: {message: 'Error'}});
  50. expect(PluginsStore.trigger).toHaveBeenCalledWith({
  51. loading: false,
  52. error: {responseJSON: {message: 'Error'}},
  53. pageLinks: null,
  54. plugins: [],
  55. });
  56. });
  57. it('does not reset loading state on consecutive fetches', function () {
  58. PluginsStore.onFetchAll();
  59. expect(PluginsStore.trigger).toHaveBeenCalledWith({
  60. loading: true,
  61. error: null,
  62. pageLinks: null,
  63. plugins: [],
  64. });
  65. PluginsStore.onFetchAllSuccess(Plugins(), {pageLinks: null});
  66. expect(PluginsStore.trigger).toHaveBeenCalledWith({
  67. loading: false,
  68. error: null,
  69. pageLinks: null,
  70. plugins: Plugins(),
  71. });
  72. PluginsStore.onFetchAll();
  73. expect(PluginsStore.trigger).toHaveBeenCalledWith({
  74. loading: false,
  75. error: null,
  76. pageLinks: null,
  77. plugins: Plugins(),
  78. });
  79. });
  80. });
  81. describe('update', function () {
  82. const plugin = Plugin();
  83. beforeEach(function () {
  84. PluginsStore.reset();
  85. PluginsStore.plugins = new Map(Plugins().map(p => [p.id, p]));
  86. });
  87. it('has optimistic state when updating', function () {
  88. PluginsStore.onUpdate('amazon-sqs', {name: 'Amazon Sqs'});
  89. const state = PluginsStore.getState();
  90. expect(state).toMatchObject({
  91. error: null,
  92. pageLinks: null,
  93. });
  94. expect(state.plugins[0]).toMatchObject({
  95. ...plugin,
  96. id: 'amazon-sqs',
  97. name: 'Amazon Sqs',
  98. });
  99. // Doesn't update other plugins plz
  100. expect(state.plugins[1]).toMatchObject({
  101. id: 'github',
  102. name: 'GitHub',
  103. });
  104. });
  105. it('saves old plugin state', function () {
  106. PluginsStore.onUpdate('amazon-sqs', {name: 'Amazon Sqs'});
  107. const state = PluginsStore.getState();
  108. expect(state).toMatchObject({
  109. error: null,
  110. pageLinks: null,
  111. });
  112. expect(PluginsStore.updating.get('amazon-sqs')).toMatchObject({
  113. ...plugin,
  114. id: 'amazon-sqs',
  115. name: 'Amazon SQS',
  116. });
  117. });
  118. it('removes old plugin state on successful update', function () {
  119. PluginsStore.onUpdate('amazon-sqs', {name: 'Amazon Sqs'});
  120. expect(PluginsStore.updating.get('amazon-sqs')).toMatchObject({
  121. ...plugin,
  122. id: 'amazon-sqs',
  123. name: 'Amazon SQS',
  124. });
  125. PluginsStore.onUpdateSuccess('amazon-sqs');
  126. expect(PluginsStore.getState().plugins[0]).toMatchObject({
  127. id: 'amazon-sqs',
  128. name: 'Amazon Sqs',
  129. });
  130. expect(PluginsStore.updating.get('amazon-sqs')).toEqual(undefined);
  131. });
  132. it('restores old plugin state when update has an error', function () {
  133. PluginsStore.onUpdate('amazon-sqs', {name: 'Amazon Sqs'});
  134. expect(PluginsStore.getState().plugins[0]).toMatchObject({
  135. id: 'amazon-sqs',
  136. name: 'Amazon Sqs',
  137. });
  138. PluginsStore.onUpdateError('amazon-sqs');
  139. expect(PluginsStore.getState().plugins[0]).toMatchObject({
  140. id: 'amazon-sqs',
  141. name: 'Amazon SQS',
  142. });
  143. expect(PluginsStore.updating.get('amazon-sqs')).toEqual(undefined);
  144. });
  145. });
  146. });