You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.4 KiB
159 lines
5.4 KiB
|
2 months ago
|
<?php
|
||
|
|
|
||
|
|
namespace Tests\Feature;
|
||
|
|
|
||
|
|
use App\Models\Application;
|
||
|
|
use App\Models\ApplicationFile;
|
||
|
|
use App\Models\ApplicationReviewScore;
|
||
|
|
use App\Models\Competition;
|
||
|
|
use App\Models\Reviewer;
|
||
|
|
use App\Models\User;
|
||
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||
|
|
use Illuminate\Http\UploadedFile;
|
||
|
|
use Illuminate\Support\Facades\Storage;
|
||
|
|
use Laravel\Sanctum\Sanctum;
|
||
|
|
use Tests\TestCase;
|
||
|
|
|
||
|
|
class PostCloseFileEditTest extends TestCase
|
||
|
|
{
|
||
|
|
use RefreshDatabase;
|
||
|
|
|
||
|
|
public function test_allowlisted_user_can_upload_after_close_but_cannot_edit_form(): void
|
||
|
|
{
|
||
|
|
Storage::fake('public');
|
||
|
|
|
||
|
|
$user = User::query()->create(['mobile' => '13800138001']);
|
||
|
|
$competition = Competition::query()->create([
|
||
|
|
'slug' => 'xxf-close',
|
||
|
|
'name' => '测试赛',
|
||
|
|
'published' => true,
|
||
|
|
'signup_close_at' => now()->subHour(),
|
||
|
|
'settings' => [
|
||
|
|
'post_close_file_edit' => [
|
||
|
|
'enabled' => true,
|
||
|
|
'user_mobiles' => ['13800138001'],
|
||
|
|
],
|
||
|
|
],
|
||
|
|
]);
|
||
|
|
Application::query()->create([
|
||
|
|
'user_id' => $user->id,
|
||
|
|
'competition_id' => $competition->id,
|
||
|
|
'status' => 'submitted',
|
||
|
|
'project_name' => '原项目',
|
||
|
|
'submitted_at' => now()->subDay(),
|
||
|
|
]);
|
||
|
|
|
||
|
|
Sanctum::actingAs($user);
|
||
|
|
|
||
|
|
$this->getJson('/api/applications/current?competition_slug=xxf-close')
|
||
|
|
->assertOk()
|
||
|
|
->assertJsonPath('participant_may_edit', false)
|
||
|
|
->assertJsonPath('participant_may_edit_files', true);
|
||
|
|
|
||
|
|
$this->postJson('/api/applications/current/save?competition_slug=xxf-close', [
|
||
|
|
'project_name' => '试图改项目名',
|
||
|
|
])->assertStatus(422);
|
||
|
|
|
||
|
|
$this->withHeader('Accept', 'application/json')
|
||
|
|
->post('/api/applications/current/files?competition_slug=xxf-close', [
|
||
|
|
'kind' => 'plan',
|
||
|
|
'file' => UploadedFile::fake()->create('补传计划书.pdf', 100, 'application/pdf'),
|
||
|
|
])
|
||
|
|
->assertCreated();
|
||
|
|
|
||
|
|
$this->assertSame(1, ApplicationFile::query()->count());
|
||
|
|
}
|
||
|
|
|
||
|
|
public function test_non_allowlisted_user_cannot_upload_after_close(): void
|
||
|
|
{
|
||
|
|
Storage::fake('public');
|
||
|
|
|
||
|
|
$user = User::query()->create(['mobile' => '13800138002']);
|
||
|
|
$competition = Competition::query()->create([
|
||
|
|
'slug' => 'xxf-close-2',
|
||
|
|
'name' => '测试赛',
|
||
|
|
'published' => true,
|
||
|
|
'signup_close_at' => now()->subHour(),
|
||
|
|
'settings' => [
|
||
|
|
'post_close_file_edit' => [
|
||
|
|
'enabled' => true,
|
||
|
|
'user_mobiles' => ['13800138001'],
|
||
|
|
],
|
||
|
|
],
|
||
|
|
]);
|
||
|
|
Application::query()->create([
|
||
|
|
'user_id' => $user->id,
|
||
|
|
'competition_id' => $competition->id,
|
||
|
|
'status' => 'submitted',
|
||
|
|
]);
|
||
|
|
|
||
|
|
Sanctum::actingAs($user);
|
||
|
|
|
||
|
|
$this->getJson('/api/applications/current?competition_slug=xxf-close-2')
|
||
|
|
->assertOk()
|
||
|
|
->assertJsonPath('participant_may_edit', false)
|
||
|
|
->assertJsonPath('participant_may_edit_files', false);
|
||
|
|
|
||
|
|
$this->withHeader('Accept', 'application/json')
|
||
|
|
->post('/api/applications/current/files?competition_slug=xxf-close-2', [
|
||
|
|
'kind' => 'plan',
|
||
|
|
'file' => UploadedFile::fake()->create('计划书.pdf', 100, 'application/pdf'),
|
||
|
|
])
|
||
|
|
->assertStatus(422)
|
||
|
|
->assertJsonValidationErrors(['file']);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function test_review_lock_blocks_allowlisted_file_edit(): void
|
||
|
|
{
|
||
|
|
Storage::fake('public');
|
||
|
|
|
||
|
|
$user = User::query()->create(['mobile' => '13800138003']);
|
||
|
|
$competition = Competition::query()->create([
|
||
|
|
'slug' => 'xxf-close-3',
|
||
|
|
'name' => '测试赛',
|
||
|
|
'published' => true,
|
||
|
|
'signup_close_at' => now()->subHour(),
|
||
|
|
'settings' => [
|
||
|
|
'post_close_file_edit' => [
|
||
|
|
'enabled' => true,
|
||
|
|
'user_mobiles' => ['13800138003'],
|
||
|
|
],
|
||
|
|
],
|
||
|
|
]);
|
||
|
|
$application = Application::query()->create([
|
||
|
|
'user_id' => $user->id,
|
||
|
|
'competition_id' => $competition->id,
|
||
|
|
'status' => 'submitted',
|
||
|
|
]);
|
||
|
|
|
||
|
|
$reviewer = Reviewer::query()->create([
|
||
|
|
'mobile' => '13900139003',
|
||
|
|
'username' => 'rev_pcfe',
|
||
|
|
'name' => '评委',
|
||
|
|
'status' => 'active',
|
||
|
|
'password_hash' => 'unused',
|
||
|
|
]);
|
||
|
|
ApplicationReviewScore::query()->create([
|
||
|
|
'application_id' => $application->id,
|
||
|
|
'reviewer_id' => $reviewer->id,
|
||
|
|
'payload_json' => [],
|
||
|
|
'line_total' => 80,
|
||
|
|
]);
|
||
|
|
|
||
|
|
Sanctum::actingAs($user);
|
||
|
|
|
||
|
|
$this->getJson('/api/applications/current?competition_slug=xxf-close-3')
|
||
|
|
->assertOk()
|
||
|
|
->assertJsonPath('participant_may_edit', false)
|
||
|
|
->assertJsonPath('participant_may_edit_files', false);
|
||
|
|
|
||
|
|
$this->withHeader('Accept', 'application/json')
|
||
|
|
->post('/api/applications/current/files?competition_slug=xxf-close-3', [
|
||
|
|
'kind' => 'plan',
|
||
|
|
'file' => UploadedFile::fake()->create('计划书.pdf', 100, 'application/pdf'),
|
||
|
|
])
|
||
|
|
->assertStatus(422)
|
||
|
|
->assertJsonValidationErrors(['file']);
|
||
|
|
}
|
||
|
|
}
|