manojo123's avatar

Problem With PHPUnit + SQLite dropColumn()

Hello Everyone,

Suddenly all my tests started to fail with the same error.

  • Im using Laravel Framework 7.27.0

  • Ubuntu 20.04

  • PHPUnit in :memory: database and sqlite

  • I did not change any migration and always worked before without problems.

  • If run phpunit on my production server, works, looks like some bad configuration issue

  • If I create blank project and add a dropCOlumn migration works without a problem.

  • If I git reset --hard a week ago (yesterday was working without any problems) I still get errors

Tests\Unit\UserTest::it_has_many_categories
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 near "1": syntax error (SQL: CREATE TABLE products (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id INTEGER NOT NULL, code VARCHAR(255) NOT NULL COLLATE BINARY, name VARCHAR(255) NOT NULL COLLATE BINARY, slug VARCHAR(255) NOT NULL COLLATE BINARY, description VARCHAR(255) DEFAULT NULL COLLATE BINARY, price NUMERIC(10, 0) NOT NULL, image VARCHAR(255) DEFAULT NULL COLLATE BINARY, active BOOLEAN DEFAULT '1' NOT NULL, created_at DATETIME DEFAULT NULL, updated_at DATETIME DEFAULT NULL, stock INTEGER DEFAULT 0 NOT NULL, title CLOB DEFAULT NULL COLLATE BINARY, CONSTRAINT 1 FOREIGN KEY (user_id) REFERENCES users (id) ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE))

/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Connection.php:671
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Connection.php:631
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Connection.php:465
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Schema/Blueprint.php:102
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php:290
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php:151
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:261
/var/www/atsnacks/database/migrations/2019_10_17_095205_drop_category_id_in_products_table.php:21
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:392
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:401
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:200
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:165
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:110
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:72
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:541
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:81
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:37
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Container/Util.php:37
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:95
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:39
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Container/Container.php:596
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Console/Command.php:134
/var/www/atsnacks/vendor/symfony/console/Command/Command.php:258
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Console/Command.php:121
/var/www/atsnacks/vendor/symfony/console/Application.php:916
/var/www/atsnacks/vendor/symfony/console/Application.php:264
/var/www/atsnacks/vendor/symfony/console/Application.php:140
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Console/Application.php:93
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Console/Application.php:185
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:263
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Testing/PendingCommand.php:171
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Testing/PendingCommand.php:291
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithConsole.php:52
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php:40
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Foundation/Testing/RefreshDatabase.php:17
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:115
/var/www/atsnacks/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:84

Here is my migration file from the error. If I full comment this migration the error goes to the next dropColumn migration. As I could see. The column got dropped but then fails for some reason.

class DropCategoryIdInProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('products', function (Blueprint $table) {
            if(DB::connection()->getDatabaseName() != ':memory:'){
                $table->dropForeign('products_category_id_foreign');
            }
            $table->dropColumn('category_id');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('products', function (Blueprint $table) {
            $table->unsignedBigInteger('category_id')->index();
            $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
        });
    }

Anyone has an Idea what can be? Thanks in advance.

0 likes
5 replies
manojo123's avatar

I do not have a .env.testing

Everything is inside .env

APP_NAME=Laravel
APP_ENV=local
APP_KEY=MY_KEY
APP_DEBUG=true
APP_URL=http://localhost

EDITOR=vim
LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=atsnacks
DB_USERNAME=root
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=database
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

DEFAULT_COMPANY=2
DEFAULT_ADDRESS=1
DEFAULT_DOCUMENT=1
DEFAULT_PROVIDER_COMPANY=4
TEST_SHOP=0666
TEST_SERIE=900
TEST_SERIE_NC=901

phpunit:

<?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="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
        <server name="DB_CONNECTION" value="sqlite"/>
        <server name="DB_DATABASE" value=":memory:"/>
    </php>
</phpunit>

manojo123's avatar

I pushed all my changes to production and executed composer update. Then all my tests broke. Looks like a very new bug from vendor. I will investigate and post here if I find something.

manojo123's avatar

Okay I have a pre production server that I didnt update composer and I was able to make the final proof that there is a broken package in laravel with phpunit

where is my terminal commands and outputs

jmoura@at-snacks:/var/www/atsnacks$ php vendor/bin/phpunit
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

...............................................................  63 / 167 ( 37%)
............................................................... 126 / 167 ( 75%)
.........................................                       167 / 167 (100%)

Time: 21.1 seconds, Memory: 70.50 MB

OK (167 tests, 288 assertions)
jmoura@at-snacks:/var/www/atsnacks$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 30 updates, 0 removals
  - Updating doctrine/dbal (2.10.2 => 2.10.3): Downloading (100%)         
  - Updating symfony/css-selector (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/var-dumper (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/routing (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/process (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/mime (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/string (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/http-foundation (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/event-dispatcher (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/error-handler (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/http-kernel (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/finder (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating symfony/console (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating brick/math (0.8.15 => 0.8.17): Downloading (100%)         
  - Updating ramsey/uuid (4.1.0 => 4.1.1): Downloading (100%)         
  - Updating symfony/translation (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating nesbot/carbon (2.38.0 => 2.39.0): Downloading (100%)         
  - Updating league/flysystem (1.1.1 => 1.1.3): Downloading (100%)         
  - Updating league/commonmark (1.5.3 => 1.5.4): Downloading (100%)         
  - Updating laravel/framework (v7.25.0 => v7.27.0): Downloading (100%)         
  - Updating laravel/ui (v2.1.0 => v2.2.0): Downloading (100%)         
  - Updating manojo123/nova-attach-pivot (1.0.14 => 1.0.16): Downloading (100%)         
  - Updating spatie/laravel-permission (3.15.0 => 3.16.0): Downloading (100%)         
  - Updating cakephp/chronos (2.0.5 => 2.0.6): Downloading (100%)         
  - Updating symfony/intl (v5.1.3 => v5.1.5): Downloading (100%)         
  - Updating nikic/php-parser (v4.8.0 => v4.9.1): Downloading (100%)         
  - Updating spatie/laravel-medialibrary (8.5.0 => 8.6.0): Downloading (100%)         
  - Updating lcobucci/jwt (3.3.2 => 3.3.3): Downloading (100%)         
  - Updating markbaker/complex (1.4.8 => 1.5.0): Downloading (100%)         
  - Updating markbaker/matrix (1.2.0 => 1.2.1): Downloading (100%)         
  - Installing inspheric/nova-indicator-field (v1.43): Downloading (100%)         
Package alexbowers/nova-prepopulate-searchable is abandoned, you should avoid using it. Use genealabs/nova-prepopulate-searchable instead.
Package moontoast/math is abandoned, you should avoid using it. Use brick/math instead.
Package phpunit/php-token-stream is abandoned, you should avoid using it. No replacement was suggested.
Package zendframework/zend-diactoros is abandoned, you should avoid using it. Use laminas/laminas-diactoros instead.
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: alexbowers/nova-prepopulate-searchable
Discovered Package: arcanedev/log-viewer
Discovered Package: barryvdh/laravel-dompdf
Discovered Package: beyondcode/laravel-dump-server
Discovered Package: coderello/laravel-nova-lang
Discovered Package: david-griffiths/nova-dark-theme
Discovered Package: ebess/advanced-nova-media-library
Discovered Package: fideloper/proxy
Discovered Package: gregoriohc/laravel-nova-theme-responsive
Discovered Package: inspheric/nova-indicator-field
Discovered Package: intervention/image
Discovered Package: kabbouchi/nova-impersonate
Discovered Package: lab404/laravel-impersonate
Discovered Package: laravel/nova
Discovered Package: laravel/passport
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: maatwebsite/excel
Discovered Package: maatwebsite/laravel-nova-excel
Discovered Package: manojo123/laravel-nova-permission
Discovered Package: manojo123/nova-attach-pivot
Discovered Package: manojo123/novapassport
Discovered Package: manojo123/shoppingcart
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Discovered Package: php-junior/nova-logs
Discovered Package: simplesoftwareio/simple-qrcode
Discovered Package: spatie/laravel-medialibrary
Discovered Package: spatie/laravel-permission
Discovered Package: tanmuhittin/nova-collapsible-groups
Package manifest generated successfully.
jmoura@at-snacks:/var/www/atsnacks$ php vendor/bin/phpunit
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE  63 / 167 ( 37%)
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 126 / 167 ( 75%)
EEEEEEEEEEEEEEEEEEEEEEE^Cjmoura@at-snacks:/var/www/atsnacks$ 

Now I will try to identify with package is broken. I will be glad if someone could help me with that.

manojo123's avatar
manojo123
OP
Best Answer
Level 14

After 14 Hours I managed to fix the problem by downgrading dbal/doctine version from 2.10.13 to 2.10.12 in composer.json

"doctrine/dbal": "2.10.2"

The doctrine 2.10.3 for some reason cant find well the foreign key name at line 2586 in file /vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/AbstractPlatform.php returning 1 or 0 on getQuotedName method

if (strlen($foreignKey->getName())) {
    $sql .= 'CONSTRAINT ' . $foreignKey->getQuotedName($this) . ' ';
}
1 like

Please or to participate in this conversation.