laravel / framework

The Laravel Framework.
https://laravel.com
MIT License
32.24k stars 10.92k forks source link

Phpunit sqlite file "table 'migrations' already exists" #27157

Closed CrixuAMG closed 5 years ago

CrixuAMG commented 5 years ago

Description:

When running Phpunit, using the RefreshDatabase trait on the tests, the tests fails when trying to execute a migration.

Trace:

1) Tests\Feature\LoginTest::a_user_can_login
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 table "migrations" already exists (SQL: create table "migrations" ("id" integer not null primary key autoincrement, "migration" varchar not null, "batch" integer not null))

/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:624
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:459
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php:97
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php:264
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php:165
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php:157
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/InstallCommand.php:54
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/Container.php:572
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Command.php:183
/home/vagrant/company/app/vendor/symfony/console/Command/Command.php:255
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Command.php:170
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Command.php:198
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:93
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:63
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/Container.php:572
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Command.php:183
/home/vagrant/company/app/vendor/symfony/console/Command/Command.php:255
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Command.php:170
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Command.php:198
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/FreshCommand.php:55
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:29
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:87
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:31
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Container/Container.php:572
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Command.php:183
/home/vagrant/company/app/vendor/symfony/console/Command/Command.php:255
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Command.php:170
/home/vagrant/company/app/vendor/symfony/console/Application.php:901
/home/vagrant/company/app/vendor/symfony/console/Application.php:262
/home/vagrant/company/app/vendor/symfony/console/Application.php:145
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Application.php:89
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Console/Application.php:188
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:250
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Foundation/Testing/PendingCommand.php:136
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Foundation/Testing/PendingCommand.php:218
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithConsole.php:55
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php:55
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php:18
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:104
/home/vagrant/company/app/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:71

Phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>

        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="DB_DEFAULT" value="sqlite_testing"/>
        <env name="DB_DATABASE" value="storage/testing.sqlite"/>
    </php>
</phpunit>

LoginTest:

<?php

namespace Tests\Feature;

use App\Models\Organisation;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

/**
 * Class LoginTest
 *
 * @package Tests\Feature
 */
class LoginTest extends TestCase
{
    use RefreshDatabase;

    // Tests that don't manually execute commands or migrations
}

Steps To Reproduce:

1) Create the sqlite file

touch storage/testing.sqlite

2) Update config/database.php with this:

'sqlite_testing' => [
            'driver'   => 'sqlite',
            'database' => storage_path() . '/testing.sqlite',
            'prefix'   => '',
        ],

3) Add the RefreshDatabase trait to a test 4) Run Phpunit

driesvints commented 5 years ago

Can you first please try one of the following support channels? If you can actually identify this as a bug, feel free to report back.