2
0

DiscussionControllerTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. use App\Models\Discussion;
  3. use Illuminate\Foundation\Testing\RefreshDatabase;
  4. use Illuminate\Support\Str;
  5. uses(RefreshDatabase::class);
  6. it('stores the annotation selector fields on create', function () {
  7. $userUid = makeStudio('annotator');
  8. $resId = (string) Str::uuid();
  9. $response = $this->postJson('/api/v2/discussion', [
  10. 'res_id' => $resId,
  11. 'res_type' => 'sentence',
  12. 'type' => 'commentary',
  13. 'title' => '义注',
  14. 'content' => '{{1-2-3-4}}',
  15. 'pos_start' => 10,
  16. 'pos_end' => 25,
  17. 'quote_exact' => '被锚定文本',
  18. 'quote_prefix' => '前缀上下文',
  19. 'quote_suffix' => '后缀上下文',
  20. 'notification' => false,
  21. ], authHeader($userUid))->assertOk();
  22. $saved = Discussion::where('editor_uid', $userUid)->first();
  23. expect($saved->pos_start)->toBe(10);
  24. expect($saved->pos_end)->toBe(25);
  25. expect($saved->quote_exact)->toBe('被锚定文本');
  26. expect($saved->quote_prefix)->toBe('前缀上下文');
  27. expect($saved->quote_suffix)->toBe('后缀上下文');
  28. // 资源输出同样暴露这些字段
  29. expect($response->json('data.pos_start'))->toBe(10);
  30. expect($response->json('data.pos_end'))->toBe(25);
  31. expect($response->json('data.quote_exact'))->toBe('被锚定文本');
  32. expect($response->json('data.quote_prefix'))->toBe('前缀上下文');
  33. expect($response->json('data.quote_suffix'))->toBe('后缀上下文');
  34. });
  35. it('leaves annotation selector fields null when not provided', function () {
  36. $userUid = makeStudio('annotator');
  37. $this->postJson('/api/v2/discussion', [
  38. 'res_id' => (string) Str::uuid(),
  39. 'res_type' => 'sentence',
  40. 'type' => 'commentary',
  41. 'title' => '无锚点',
  42. 'content' => '{{1-2-3-4}}',
  43. 'notification' => false,
  44. ], authHeader($userUid))->assertOk();
  45. $saved = Discussion::where('editor_uid', $userUid)->first();
  46. expect($saved->pos_start)->toBeNull();
  47. expect($saved->pos_end)->toBeNull();
  48. expect($saved->quote_exact)->toBeNull();
  49. expect($saved->quote_prefix)->toBeNull();
  50. expect($saved->quote_suffix)->toBeNull();
  51. });
  52. it('creates a discussion without a title', function () {
  53. $userUid = makeStudio('annotator');
  54. $this->postJson('/api/v2/discussion', [
  55. 'res_id' => (string) Str::uuid(),
  56. 'res_type' => 'sentence',
  57. 'type' => 'note',
  58. 'content' => '这里的 dassana 指见到佛陀。',
  59. 'notification' => false,
  60. ], authHeader($userUid))->assertOk();
  61. // 批注 / 脚注一类正文就是全部,标题可以没有
  62. expect(Discussion::where('editor_uid', $userUid)->first()->title)->toBeNull();
  63. });
  64. it('rejects an invalid annotation selector', function () {
  65. $userUid = makeStudio('annotator');
  66. $this->postJson('/api/v2/discussion', [
  67. 'res_id' => (string) Str::uuid(),
  68. 'res_type' => 'sentence',
  69. 'title' => 'x',
  70. 'pos_start' => -1,
  71. 'notification' => false,
  72. ], authHeader($userUid))->assertStatus(422);
  73. expect(Discussion::count())->toBe(0);
  74. });
  75. it('updates only the annotation fields present in the request', function () {
  76. $userUid = makeStudio('annotator');
  77. $discussion = new Discussion;
  78. $discussion->forceFill([
  79. 'res_id' => (string) Str::uuid(),
  80. 'res_type' => 'sentence',
  81. 'type' => 'commentary',
  82. 'title' => '旧标题',
  83. 'content' => '{{1-2-3-4}}',
  84. 'editor_uid' => $userUid,
  85. 'pos_start' => 1,
  86. 'pos_end' => 2,
  87. 'quote_exact' => '保留我',
  88. 'quote_prefix' => '保留前缀',
  89. 'quote_suffix' => '保留后缀',
  90. ])->save();
  91. $this->putJson("/api/v2/discussion/{$discussion->id}", [
  92. 'pos_start' => 5,
  93. 'quote_exact' => '新摘录',
  94. ], authHeader($userUid))->assertOk();
  95. $discussion->refresh();
  96. // 只改提交的字段
  97. expect($discussion->pos_start)->toBe(5);
  98. expect($discussion->quote_exact)->toBe('新摘录');
  99. // 未提交的字段原样保留
  100. expect($discussion->pos_end)->toBe(2);
  101. expect($discussion->quote_prefix)->toBe('保留前缀');
  102. expect($discussion->quote_suffix)->toBe('保留后缀');
  103. });
  104. it('allows clearing an annotation field explicitly', function () {
  105. $userUid = makeStudio('annotator');
  106. $discussion = new Discussion;
  107. $discussion->forceFill([
  108. 'res_id' => (string) Str::uuid(),
  109. 'res_type' => 'sentence',
  110. 'type' => 'commentary',
  111. 'title' => '旧标题',
  112. 'editor_uid' => $userUid,
  113. 'quote_exact' => '旧摘录',
  114. ])->save();
  115. $this->putJson("/api/v2/discussion/{$discussion->id}", [
  116. 'quote_exact' => null,
  117. ], authHeader($userUid))->assertOk();
  118. expect($discussion->refresh()->quote_exact)->toBeNull();
  119. });