refetchEvents.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. describe('refetchEvents', function() {
  2. // there IS a similar test in automated-better, but does month view
  3. describe('when agenda events are rerendered', function() {
  4. beforeEach(function() {
  5. affix('#cal');
  6. });
  7. it('keeps scroll after refetchEvents', function(done) {
  8. var renderCalls = 0;
  9. $('#cal').fullCalendar({
  10. now: '2015-08-07',
  11. scrollTime: '00:00',
  12. height: 400, // makes this test more consistent across viewports
  13. defaultView: 'agendaDay',
  14. events: function(start, end, timezone, callback) {
  15. setTimeout(function() {
  16. callback([
  17. { id: '1', resourceId: 'b', start: '2015-08-07T02:00:00', end: '2015-08-07T07:00:00', title: 'event 1' },
  18. { id: '2', resourceId: 'c', start: '2015-08-07T05:00:00', end: '2015-08-07T22:00:00', title: 'event 2' },
  19. { id: '3', resourceId: 'd', start: '2015-08-06', end: '2015-08-08', title: 'event 3' },
  20. { id: '4', resourceId: 'e', start: '2015-08-07T03:00:00', end: '2015-08-07T08:00:00', title: 'event 4' },
  21. { id: '5', resourceId: 'f', start: '2015-08-07T00:30:00', end: '2015-08-07T02:30:00', title: 'event 5' }
  22. ]);
  23. }, 100);
  24. },
  25. eventAfterAllRender: function() {
  26. var scrollEl = $('.fc-time-grid-container.fc-scroller');
  27. renderCalls++;
  28. if (renderCalls == 1) {
  29. setTimeout(function() {
  30. scrollEl.scrollTop(100);
  31. setTimeout(function() {
  32. $('#cal').fullCalendar('refetchEvents');
  33. }, 100);
  34. }, 100);
  35. }
  36. else if (renderCalls == 2) {
  37. expect(scrollEl.scrollTop()).toBe(100);
  38. done();
  39. }
  40. }
  41. });
  42. });
  43. });
  44. describe('when there are multiple event sources', function() {
  45. var options;
  46. var fetchCount; // affects events created in createEventGenerator
  47. var calendarEl;
  48. beforeEach(function() {
  49. affix('#cal');
  50. fetchCount = 0;
  51. calendarEl = $('#cal');
  52. options = {
  53. now: '2015-08-07',
  54. defaultView: 'agendaWeek',
  55. eventSources: [
  56. {
  57. events: createEventGenerator(),
  58. color: 'green',
  59. id: 'source1'
  60. },
  61. {
  62. events: createEventGenerator(),
  63. color: 'blue',
  64. id: 'source2'
  65. },
  66. {
  67. events: createEventGenerator(),
  68. color: 'red',
  69. id: 'source3'
  70. }
  71. ]
  72. };
  73. });
  74. describe('and all events are fetched synchronously', function() {
  75. it('all events are immediately updated', function(done) {
  76. calendarEl.fullCalendar(options);
  77. fetchCount++;
  78. calendarEl.fullCalendar('refetchEvents');
  79. expect($('.fetch0').length).toEqual(0);
  80. expect($('.fetch1').length).toEqual(3);
  81. done();
  82. });
  83. });
  84. describe('and one event source is asynchronous', function() {
  85. it('original events remain on the calendar until all events have been refetched', function(done) {
  86. // set a 100ms timeout on this event source
  87. options.eventSources[0].events = function(start, end, timezone, callback) {
  88. var events = [
  89. { id: '1',
  90. start: '2015-08-07T02:00:00',
  91. end: '2015-08-07T03:00:00',
  92. title: 'event A', className: 'fetch' + fetchCount
  93. }
  94. ];
  95. setTimeout(function() {
  96. callback(events);
  97. }, 100);
  98. };
  99. options.eventAfterAllRender = function() {
  100. fetchCount++;
  101. if (fetchCount === 1) {
  102. // after the initial rendering of events, call refetchEvents
  103. calendarEl.fullCalendar('refetchEvents');
  104. expect($('.fetch0').length).toEqual(3); // original events still on the calendar
  105. expect($('.fetch1').length).toEqual(0); // new events not yet refetched
  106. setTimeout(function() { // wait until refetch+rerender is over
  107. expect($('.fetch0').length).toEqual(0);
  108. expect($('.fetch1').length).toEqual(3);
  109. done();
  110. }, 200);
  111. }
  112. };
  113. calendarEl.fullCalendar(options);
  114. });
  115. });
  116. // relies on fetchCount
  117. function createEventGenerator() {
  118. return function(start, end, timezone, callback) {
  119. var events = [
  120. {
  121. id: 1,
  122. start: '2015-08-07T02:00:00',
  123. end: '2015-08-07T03:00:00',
  124. title: 'event A',
  125. className: 'fetch' + fetchCount
  126. }
  127. ];
  128. callback(events);
  129. };
  130. }
  131. });
  132. });