seed(); $user = User::create(['name' => '作者', 'email' => 'w@t.com', 'password' => bcrypt('x')]); $cat = Category::create(['name' => '技术', 'slug' => 'tech']); Post::create([ 'user_id' => $user->id, 'category_id' => $cat->id, 'title' => 'API 测试文章', 'slug' => 'api-post', 'content' => '**加粗** 内容', 'content_format' => 'markdown', 'status' => 'published', 'published_at' => now(), ]); } public function test_site_endpoint(): void { $this->getJson('/api/site')->assertOk()->assertJsonPath('api_version', '1.0'); } public function test_posts_list_and_detail(): void { $this->getJson('/api/posts')->assertOk()->assertJsonCount(1, 'data'); $this->getJson('/api/posts/api-post') ->assertOk() ->assertJsonPath('title', 'API 测试文章') ->assertJsonPath('category.name', '技术'); } public function test_posts_search_and_filters(): void { $this->getJson('/api/posts?q=API')->assertOk()->assertJsonCount(1, 'data'); $this->getJson('/api/posts?category=tech')->assertOk()->assertJsonCount(1, 'data'); $this->getJson('/api/posts?q=不存在的词')->assertOk()->assertJsonCount(0, 'data'); } public function test_categories_and_tags(): void { $this->getJson('/api/categories')->assertOk()->assertJsonCount(1, 'data'); $this->getJson('/api/tags')->assertOk(); } public function test_store_comment(): void { $post = Post::where('slug', 'api-post')->first(); $this->postJson('/api/comments', [ 'post_id' => $post->id, 'author_name' => 'API 访客', 'content' => '来自 API 的评论', 'website' => '', ])->assertCreated()->assertJsonPath('data.status', 'published'); $this->assertDatabaseHas('comments', ['author_name' => 'API 访客']); } public function test_comment_honeypot_rejected(): void { $post = Post::where('slug', 'api-post')->first(); $this->postJson('/api/comments', [ 'post_id' => $post->id, 'author_name' => '机器人', 'content' => 'spam', 'website' => 'http://spam.example.com', ])->assertStatus(422); } public function test_me_requires_token(): void { $this->getJson('/api/me')->assertUnauthorized(); } }