DiscussionControllerTest.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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' => 'note',
  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' => 'note',
  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('rejects an invalid annotation selector', function () {
  53. $userUid = makeStudio('annotator');
  54. $this->postJson('/api/v2/discussion', [
  55. 'res_id' => (string) Str::uuid(),
  56. 'res_type' => 'sentence',
  57. 'title' => 'x',
  58. 'pos_start' => -1,
  59. 'notification' => false,
  60. ], authHeader($userUid))->assertStatus(422);
  61. expect(Discussion::count())->toBe(0);
  62. });
  63. it('updates only the annotation fields present in the request', function () {
  64. $userUid = makeStudio('annotator');
  65. $discussion = new Discussion;
  66. $discussion->forceFill([
  67. 'res_id' => (string) Str::uuid(),
  68. 'res_type' => 'sentence',
  69. 'type' => 'note',
  70. 'title' => '旧标题',
  71. 'content' => '{{1-2-3-4}}',
  72. 'editor_uid' => $userUid,
  73. 'pos_start' => 1,
  74. 'pos_end' => 2,
  75. 'quote_exact' => '保留我',
  76. 'quote_prefix' => '保留前缀',
  77. 'quote_suffix' => '保留后缀',
  78. ])->save();
  79. $this->putJson("/api/v2/discussion/{$discussion->id}", [
  80. 'pos_start' => 5,
  81. 'quote_exact' => '新摘录',
  82. ], authHeader($userUid))->assertOk();
  83. $discussion->refresh();
  84. // 只改提交的字段
  85. expect($discussion->pos_start)->toBe(5);
  86. expect($discussion->quote_exact)->toBe('新摘录');
  87. // 未提交的字段原样保留
  88. expect($discussion->pos_end)->toBe(2);
  89. expect($discussion->quote_prefix)->toBe('保留前缀');
  90. expect($discussion->quote_suffix)->toBe('保留后缀');
  91. });
  92. it('allows clearing an annotation field explicitly', function () {
  93. $userUid = makeStudio('annotator');
  94. $discussion = new Discussion;
  95. $discussion->forceFill([
  96. 'res_id' => (string) Str::uuid(),
  97. 'res_type' => 'sentence',
  98. 'type' => 'note',
  99. 'title' => '旧标题',
  100. 'editor_uid' => $userUid,
  101. 'quote_exact' => '旧摘录',
  102. ])->save();
  103. $this->putJson("/api/v2/discussion/{$discussion->id}", [
  104. 'quote_exact' => null,
  105. ], authHeader($userUid))->assertOk();
  106. expect($discussion->refresh()->quote_exact)->toBeNull();
  107. });