X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/a6633642232efd164d4708967ab59e498fbff896..refs/pull/3391/head:/tests/Api/BooksApiTest.php diff --git a/tests/Api/BooksApiTest.php b/tests/Api/BooksApiTest.php index a36acdd02..9625c9f2d 100644 --- a/tests/Api/BooksApiTest.php +++ b/tests/Api/BooksApiTest.php @@ -1,13 +1,17 @@ -getJson($this->baseEndpoint . '?count=1&sort=+id'); $resp->assertJson(['data' => [ [ - 'id' => $firstBook->id, + 'id' => $firstBook->id, 'name' => $firstBook->name, 'slug' => $firstBook->slug, - ] + ], ]]); } @@ -28,7 +32,7 @@ class BooksApiTest extends TestCase { $this->actingAsApiEditor(); $details = [ - 'name' => 'My API book', + 'name' => 'My API book', 'description' => 'A book created via the API', ]; @@ -49,12 +53,12 @@ class BooksApiTest extends TestCase $resp = $this->postJson($this->baseEndpoint, $details); $resp->assertStatus(422); $resp->assertJson([ - "error" => [ - "message" => "The given data was invalid.", - "validation" => [ - "name" => ["The name field is required."] + 'error' => [ + 'message' => 'The given data was invalid.', + 'validation' => [ + 'name' => ['The name field is required.'], ], - "code" => 422, + 'code' => 422, ], ]); } @@ -68,8 +72,8 @@ class BooksApiTest extends TestCase $resp->assertStatus(200); $resp->assertJson([ - 'id' => $book->id, - 'slug' => $book->slug, + 'id' => $book->id, + 'slug' => $book->slug, 'created_by' => [ 'name' => $book->createdBy->name, ], @@ -77,7 +81,7 @@ class BooksApiTest extends TestCase 'name' => $book->createdBy->name, ], 'owned_by' => [ - 'name' => $book->ownedBy->name + 'name' => $book->ownedBy->name, ], ]); } @@ -87,7 +91,7 @@ class BooksApiTest extends TestCase $this->actingAsApiEditor(); $book = Book::visible()->first(); $details = [ - 'name' => 'My updated API book', + 'name' => 'My updated API book', 'description' => 'A book created via the API', ]; @@ -99,6 +103,21 @@ class BooksApiTest extends TestCase $this->assertActivityExists('book_update', $book); } + public function test_update_increments_updated_date_if_only_tags_are_sent() + { + $this->actingAsApiEditor(); + $book = Book::visible()->first(); + DB::table('books')->where('id', '=', $book->id)->update(['updated_at' => Carbon::now()->subWeek()]); + + $details = [ + 'tags' => [['name' => 'Category', 'value' => 'Testing']] + ]; + + $this->putJson($this->baseEndpoint . "/{$book->id}", $details); + $book->refresh(); + $this->assertGreaterThan(Carbon::now()->subDay()->unix(), $book->updated_at->unix()); + } + public function test_delete_endpoint() { $this->actingAsApiEditor(); @@ -140,4 +159,30 @@ class BooksApiTest extends TestCase $resp->assertStatus(200); $resp->assertHeader('Content-Disposition', 'attachment; filename="' . $book->slug . '.pdf"'); } -} \ No newline at end of file + + public function test_export_markdown_endpoint() + { + $this->actingAsApiEditor(); + $book = Book::visible()->has('pages')->has('chapters')->first(); + + $resp = $this->get($this->baseEndpoint . "/{$book->id}/export/markdown"); + $resp->assertStatus(200); + $resp->assertHeader('Content-Disposition', 'attachment; filename="' . $book->slug . '.md"'); + $resp->assertSee('# ' . $book->name); + $resp->assertSee('# ' . $book->pages()->first()->name); + $resp->assertSee('# ' . $book->chapters()->first()->name); + } + + public function test_cant_export_when_not_have_permission() + { + $types = ['html', 'plaintext', 'pdf', 'markdown']; + $this->actingAsApiEditor(); + $this->removePermissionFromUser($this->getEditor(), 'content-export'); + + $book = Book::visible()->first(); + foreach ($types as $type) { + $resp = $this->get($this->baseEndpoint . "/{$book->id}/export/{$type}"); + $this->assertPermissionError($resp); + } + } +}