2
0

LibraryCourseTest.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <?php
  2. use App\Models\Course;
  3. use Carbon\Carbon;
  4. use Illuminate\Foundation\Testing\RefreshDatabase;
  5. use Illuminate\Support\Str;
  6. uses(RefreshDatabase::class);
  7. /**
  8. * 造一门公开课程(publicity=30),返回模型。
  9. *
  10. * 覆盖报名窗口与课程窗口用四个字段:sign_up_start_at / sign_up_end_at
  11. * 决定「可报名」,start_at / end_at 决定「进行中 / 已结束」。
  12. */
  13. function makeLibraryCourse(array $overrides = []): Course
  14. {
  15. $course = new Course;
  16. $course->forceFill(array_merge([
  17. 'id' => (string) Str::uuid(),
  18. 'title' => '测试课程',
  19. 'studio_id' => (string) Str::uuid(),
  20. 'publicity' => 30,
  21. ], $overrides))->save();
  22. return $course;
  23. }
  24. it('partitions courses by sign-up window and course window', function () {
  25. $now = Carbon::now();
  26. makeLibraryCourse([
  27. 'title' => '进行中可报名',
  28. 'sign_up_start_at' => $now->copy()->subDays(10),
  29. 'sign_up_end_at' => $now->copy()->addDays(10),
  30. 'start_at' => $now->copy()->subDays(5),
  31. 'end_at' => $now->copy()->addDays(5),
  32. ]);
  33. // 已结束:课程时间已过(报名也早已结束),无论多新都不进「最新课程」
  34. makeLibraryCourse([
  35. 'title' => '已结束课程',
  36. 'sign_up_start_at' => $now->copy()->subDays(40),
  37. 'sign_up_end_at' => $now->copy()->subDays(20),
  38. 'start_at' => $now->copy()->subDays(30),
  39. 'end_at' => $now->copy()->subDays(1),
  40. ]);
  41. // 未开始但可报名:只进「开放报名」
  42. makeLibraryCourse([
  43. 'title' => '未开始可报名',
  44. 'sign_up_start_at' => $now->copy()->subDays(1),
  45. 'sign_up_end_at' => $now->copy()->addDays(10),
  46. 'start_at' => $now->copy()->addDays(5),
  47. 'end_at' => $now->copy()->addDays(20),
  48. ]);
  49. // 进行中但报名已结束:三个区块都不该出现
  50. makeLibraryCourse([
  51. 'title' => '进行中报名已结束',
  52. 'sign_up_start_at' => $now->copy()->subDays(20),
  53. 'sign_up_end_at' => $now->copy()->subDays(1),
  54. 'start_at' => $now->copy()->subDays(5),
  55. 'end_at' => $now->copy()->addDays(5),
  56. ]);
  57. $response = $this->get('/library/course')->assertOk();
  58. // 最新课程 = 可报名 且 进行中
  59. $response->assertViewHas('latestCourses', function ($courses) {
  60. $titles = $courses->pluck('title')->all();
  61. return in_array('进行中可报名', $titles, true)
  62. && ! in_array('已结束课程', $titles, true)
  63. && ! in_array('未开始可报名', $titles, true)
  64. && ! in_array('进行中报名已结束', $titles, true);
  65. });
  66. // 开放报名 = 可报名
  67. $response->assertViewHas('openCourses', function ($courses) {
  68. $titles = $courses->pluck('title')->all();
  69. return in_array('进行中可报名', $titles, true)
  70. && in_array('未开始可报名', $titles, true)
  71. && ! in_array('已结束课程', $titles, true)
  72. && ! in_array('进行中报名已结束', $titles, true);
  73. });
  74. // 历史课程 = 已结束
  75. $response->assertViewHas('historyCourses', function ($courses) {
  76. $titles = $courses->pluck('title')->all();
  77. return in_array('已结束课程', $titles, true)
  78. && ! in_array('进行中可报名', $titles, true)
  79. && ! in_array('未开始可报名', $titles, true)
  80. && ! in_array('进行中报名已结束', $titles, true);
  81. });
  82. // 统计条:open=可报名数量,closed=已结束数量
  83. $response->assertViewHas('stats', function ($stats) {
  84. return $stats['total'] === 4
  85. && $stats['open'] === 2
  86. && $stats['closed'] === 1;
  87. });
  88. });
  89. it('history page lists only ended courses', function () {
  90. $now = Carbon::now();
  91. makeLibraryCourse([
  92. 'title' => '已结束课程',
  93. 'start_at' => $now->copy()->subDays(30),
  94. 'end_at' => $now->copy()->subDays(1),
  95. ]);
  96. makeLibraryCourse([
  97. 'title' => '进行中可报名',
  98. 'sign_up_start_at' => $now->copy()->subDays(10),
  99. 'sign_up_end_at' => $now->copy()->addDays(10),
  100. 'start_at' => $now->copy()->subDays(5),
  101. 'end_at' => $now->copy()->addDays(5),
  102. ]);
  103. $this->get('/library/course/history')
  104. ->assertOk()
  105. ->assertViewHas('courses', function ($paginator) {
  106. $titles = $paginator->getCollection()->pluck('title')->all();
  107. return in_array('已结束课程', $titles, true)
  108. && ! in_array('进行中可报名', $titles, true);
  109. });
  110. });
  111. it('renders enrollment quota instead of a cohort number', function () {
  112. $now = Carbon::now();
  113. makeLibraryCourse([
  114. 'title' => '限名额课程',
  115. 'number' => 2000,
  116. 'sign_up_start_at' => $now->copy()->subDays(10),
  117. 'sign_up_end_at' => $now->copy()->addDays(10),
  118. 'start_at' => $now->copy()->subDays(5),
  119. 'end_at' => $now->copy()->addDays(5),
  120. ]);
  121. makeLibraryCourse([
  122. 'title' => '不限名额课程',
  123. 'number' => 0,
  124. 'sign_up_start_at' => $now->copy()->subDays(10),
  125. 'sign_up_end_at' => $now->copy()->addDays(10),
  126. 'start_at' => $now->copy()->subDays(5),
  127. 'end_at' => $now->copy()->addDays(5),
  128. ]);
  129. $this->get('/library/course?lang=zh-Hans')
  130. ->assertOk()
  131. ->assertSee('招生 2000 人')
  132. ->assertDontSee('第 2000 期')
  133. ->assertDontSee('招生 0 人')
  134. // 报名人数不再展示
  135. ->assertDontSee('course-card__members')
  136. ->assertDontSee('course-row__members');
  137. });