1 <?php declare(strict_types=1);
3 namespace Tests\Commands;
7 class BackupCommandTest extends TestCase
9 static string $uniqueUserEmail = '';
11 public static function setUpBeforeClass(): void
13 static::$uniqueUserEmail = bin2hex(random_bytes(10)) . '@example.com';
14 chdir('/var/www/bookstack');
15 // Ensure the database is created and create an admin user we can look out for in the data.
16 exec('php artisan migrate --force');
17 exec('php artisan bookstack:create-admin --email="' . static::$uniqueUserEmail . '" --name="Bazza" --password="hunter200"');
20 public function test_command_does_full_backup_of_cwd_instance_by_default()
22 chdir('/var/www/bookstack');
23 $this->assertCount(0, glob('bookstack-backup-*.zip'));
25 file_put_contents('/var/www/bookstack/themes/test.txt', static::$uniqueUserEmail . '-themes');
26 file_put_contents('/var/www/bookstack/public/uploads/test.txt', static::$uniqueUserEmail . '-public-uploads');
27 file_put_contents('/var/www/bookstack/storage/uploads/test.txt', static::$uniqueUserEmail . '-storage-uploads');
29 $result = $this->runCommand('backup');
30 $result->assertSuccessfulExit();
31 $result->assertStdoutContains("Backup finished.");
33 $this->assertCount(1, glob('bookstack-backup-*.zip'));
34 $zipFile = glob('bookstack-backup-*.zip')[0];
36 $zip = new \ZipArchive();
38 $dbDump = $zip->getFromName('db.sql');
39 $this->assertStringContainsString('APP_KEY=', $zip->getFromName('.env'));
40 $this->assertStringContainsString(static::$uniqueUserEmail, $dbDump);
41 $this->assertStringContainsString('page_revisions', $dbDump);
42 $this->assertStringContainsString(static::$uniqueUserEmail . '-public-uploads', $zip->getFromName('public/uploads/test.txt'));
43 $this->assertStringContainsString(static::$uniqueUserEmail . '-storage-uploads', $zip->getFromName('storage/uploads/test.txt'));
44 $this->assertStringContainsString(static::$uniqueUserEmail . '-themes', $zip->getFromName('themes/test.txt'));
49 public function test_no_options()
51 chdir('/var/www/bookstack');
52 $this->assertCount(0, glob('bookstack-backup-*.zip'));
54 $result = $this->runCommand('backup', [
55 '--no-database' => true,
56 '--no-uploads' => true,
57 '--no-themes' => true,
59 $result->assertSuccessfulExit();
61 $zipFile = glob('bookstack-backup-*.zip')[0];
63 $zip = new \ZipArchive();
65 $this->assertLessThan(3, $zip->numFiles);
66 $this->assertFalse($zip->getFromName('db.sql'));
67 $this->assertFalse($zip->getFromName('themes/.gitignore'));
68 $this->assertFalse($zip->getFromName('public/uploads/.gitignore'));
69 $this->assertFalse($zip->getFromName('storage/uploads/.gitignore'));
74 public function test_app_directory_option()
77 $this->assertCount(0, glob('bookstack-backup-*.zip'));
79 $result = $this->runCommand('backup', [
80 '--no-database' => true,
81 '--no-uploads' => true,
82 '--no-themes' => true,
83 '--app-directory' => '/var/www/bookstack',
86 $result->assertSuccessfulExit();
88 $zipFile = glob('bookstack-backup-*.zip')[0] ?? null;
89 $this->assertNotNull($zipFile);
94 public function test_backup_path_argument()
96 chdir('/var/www/bookstack');
97 $this->assertCount(0, glob('/home/bookstack-backup-*.zip'));
98 $this->assertFileDoesNotExist('/home/my-cool-backup.zip');
100 $result = $this->runCommand('backup', [
101 'backup-path' => '/home/my-cool-backup.zip',
102 '--no-database' => true,
103 '--no-uploads' => true,
104 '--no-themes' => true,
106 $result->assertSuccessfulExit();
107 $this->assertFileExists('/home/my-cool-backup.zip');
108 unlink('/home/my-cool-backup.zip');
110 $result = $this->runCommand('backup', [
111 'backup-path' => '/home/',
112 '--no-database' => true,
113 '--no-uploads' => true,
114 '--no-themes' => true,
116 $result->assertSuccessfulExit();
117 $this->assertCount(1, glob('/home/bookstack-backup-*.zip'));
118 $zipFile = glob('/home/bookstack-backup-*.zip')[0];