getClient()->getContainer()->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOPgSql\Driver) { /* * LOG: statement: CREATE DATABASE "wallabag" * ERROR: source database "template1" is being accessed by other users * DETAIL: There is 1 other session using the database. * STATEMENT: CREATE DATABASE "wallabag" * FATAL: database "wallabag" does not exist * * http://stackoverflow.com/a/14374832/569101 */ $this->markTestSkipped('PostgreSQL spotted: can\'t find a good way to drop current database, skipping.'); } } /** * Ensure next tests will have a clean database. */ public static function tearDownAfterClass() { $application = new Application(static::$kernel); $application->setAutoExit(false); $application->run(new ArrayInput([ 'command' => 'doctrine:schema:drop', '--no-interaction' => true, '--force' => true, '--env' => 'test', ]), new NullOutput()); $application->run(new ArrayInput([ 'command' => 'doctrine:schema:create', '--no-interaction' => true, '--env' => 'test', ]), new NullOutput()); $application->run(new ArrayInput([ 'command' => 'doctrine:fixtures:load', '--no-interaction' => true, '--env' => 'test', ]), new NullOutput()); } public function testRunInstallCommand() { $application = new Application($this->getClient()->getKernel()); $application->add(new InstallCommandMock()); $command = $application->find('wallabag:install'); $tester = new CommandTester($command); $tester->setInputs([ 'y', // dropping database 'y', // create super admin 'username_'.uniqid('', true), // username 'password_'.uniqid('', true), // password 'email_'.uniqid('', true).'@wallabag.it', // email ]); $tester->execute([ 'command' => $command->getName(), ]); $this->assertContains('Checking system requirements.', $tester->getDisplay()); $this->assertContains('Setting up database.', $tester->getDisplay()); $this->assertContains('Administration setup.', $tester->getDisplay()); $this->assertContains('Config setup.', $tester->getDisplay()); $this->assertContains('Run migrations.', $tester->getDisplay()); } public function testRunInstallCommandWithReset() { $application = new Application($this->getClient()->getKernel()); $application->add(new InstallCommandMock()); $command = $application->find('wallabag:install'); $tester = new CommandTester($command); $tester->setInputs([ 'y', // create super admin 'username_'.uniqid('', true), // username 'password_'.uniqid('', true), // password 'email_'.uniqid('', true).'@wallabag.it', // email ]); $tester->execute([ 'command' => $command->getName(), '--reset' => true, ]); $this->assertContains('Checking system requirements.', $tester->getDisplay()); $this->assertContains('Setting up database.', $tester->getDisplay()); $this->assertContains('Dropping database, creating database and schema, clearing the cache', $tester->getDisplay()); $this->assertContains('Administration setup.', $tester->getDisplay()); $this->assertContains('Config setup.', $tester->getDisplay()); $this->assertContains('Run migrations.', $tester->getDisplay()); // we force to reset everything $this->assertContains('Dropping database, creating database and schema, clearing the cache', $tester->getDisplay()); } public function testRunInstallCommandWithDatabaseRemoved() { // skipped SQLite check when database is removed because while testing for the connection, // the driver will create the file (so the database) before testing if database exist if ($this->getClient()->getContainer()->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) { $this->markTestSkipped('SQLite spotted: can\'t test with database removed.'); } $application = new Application($this->getClient()->getKernel()); $application->add(new DropDatabaseDoctrineCommand()); // drop database first, so the install command won't ask to reset things $command = $application->find('doctrine:database:drop'); $command->run(new ArrayInput([ 'command' => 'doctrine:database:drop', '--force' => true, ]), new NullOutput()); // start a new application to avoid lagging connexion to pgsql $client = static::createClient(); $application = new Application($client->getKernel()); $application->add(new InstallCommand()); $command = $application->find('wallabag:install'); $tester = new CommandTester($command); $tester->setInputs([ 'y', // create super admin 'username_'.uniqid('', true), // username 'password_'.uniqid('', true), // password 'email_'.uniqid('', true).'@wallabag.it', // email ]); $tester->execute([ 'command' => $command->getName(), ]); $this->assertContains('Checking system requirements.', $tester->getDisplay()); $this->assertContains('Setting up database.', $tester->getDisplay()); $this->assertContains('Administration setup.', $tester->getDisplay()); $this->assertContains('Config setup.', $tester->getDisplay()); $this->assertContains('Run migrations.', $tester->getDisplay()); // the current database doesn't already exist $this->assertContains('Creating database and schema, clearing the cache', $tester->getDisplay()); } public function testRunInstallCommandChooseResetSchema() { $application = new Application($this->getClient()->getKernel()); $application->add(new InstallCommandMock()); $command = $application->find('wallabag:install'); $tester = new CommandTester($command); $tester->setInputs([ 'n', // don't want to reset the entire database 'y', // do want to reset the schema 'n', // don't want to create a new user ]); $tester->execute([ 'command' => $command->getName(), ]); $this->assertContains('Checking system requirements.', $tester->getDisplay()); $this->assertContains('Setting up database.', $tester->getDisplay()); $this->assertContains('Administration setup.', $tester->getDisplay()); $this->assertContains('Config setup.', $tester->getDisplay()); $this->assertContains('Run migrations.', $tester->getDisplay()); $this->assertContains('Dropping schema and creating schema', $tester->getDisplay()); } public function testRunInstallCommandChooseNothing() { $application = new Application($this->getClient()->getKernel()); $application->add(new InstallCommand()); $application->add(new DropDatabaseDoctrineCommand()); $application->add(new CreateDatabaseDoctrineCommand()); // drop database first, so the install command won't ask to reset things $command = new DropDatabaseDoctrineCommand(); $command->setApplication($application); $command->run(new ArrayInput([ 'command' => 'doctrine:database:drop', '--force' => true, ]), new NullOutput()); $this->getClient()->getContainer()->get('doctrine')->getConnection()->close(); $command = new CreateDatabaseDoctrineCommand(); $command->setApplication($application); $command->run(new ArrayInput([ 'command' => 'doctrine:database:create', '--env' => 'test', ]), new NullOutput()); $command = $application->find('wallabag:install'); $tester = new CommandTester($command); $tester->setInputs([ 'n', // don't want to reset the entire database 'n', // don't want to create a new user ]); $tester->execute([ 'command' => $command->getName(), ]); $this->assertContains('Checking system requirements.', $tester->getDisplay()); $this->assertContains('Setting up database.', $tester->getDisplay()); $this->assertContains('Administration setup.', $tester->getDisplay()); $this->assertContains('Config setup.', $tester->getDisplay()); $this->assertContains('Run migrations.', $tester->getDisplay()); $this->assertContains('Creating schema', $tester->getDisplay()); } public function testRunInstallCommandNoInteraction() { $application = new Application($this->getClient()->getKernel()); $application->add(new InstallCommandMock()); $command = $application->find('wallabag:install'); $tester = new CommandTester($command); $tester->execute([ 'command' => $command->getName(), ], [ 'interactive' => false, ]); $this->assertContains('Checking system requirements.', $tester->getDisplay()); $this->assertContains('Setting up database.', $tester->getDisplay()); $this->assertContains('Administration setup.', $tester->getDisplay()); $this->assertContains('Config setup.', $tester->getDisplay()); $this->assertContains('Run migrations.', $tester->getDisplay()); } }