liuggio / fastest

Simple parallel testing execution... with some goodies for functional tests.
MIT License
475 stars 65 forks source link

Support for DATABASE_URL #179

Open gebi84 opened 2 years ago

gebi84 commented 2 years ago

first thx for the great tool.

I'm using the latest version 1.9.0

When i only set the URL in the .env: DATABASE_URL=mysql://root:root@127.0.0.1/fwgshopmanager_test

I get following error: [ErrorException] Notice: Undefined index: master

the params array which comes into ConnectionFactory::createConnection looks like so array:9 [ "url" => "mysql://root:root@127.0.0.1/fwgshopmanager_test" "charset" => "UTF8" "host" => "localhost" "port" => null "user" => "root" "password" => null "driver" => "pdo_mysql" "driverOptions" => [] "defaultTableOptions" => [] ]

My suggestion to fix this would be:

if (isset($params['url']) && !isset($params['dbname'])) {
    $connection = DriverManager::getConnection($params, $config, $eventManager);
    $params = $connection->getParams();
    unset($params['url']);
}

if (isset($params['dbname'])) {
    $dbName = $this->getDbNameFromEnv($params['dbname']);
} else {
    $dbName = $this->getDbNameFromEnv($params['master']['dbname']);
}
DonCallisto commented 2 years ago

Could this have something to do with https://github.com/liuggio/fastest/pull/159?

gebi84 commented 2 years ago

no I don't think so, this also does not handle the url parameter

mr120 commented 2 years ago

EDIT: Actually this doesn't work. This could potentially work with a config/packages/dev/doctrine.yaml, and a .env.dev but that is a lot of extra config. If the global doctrine.yaml uses the 'url', then the test one will use it too which will result in the wrong database being used. All said, I think the suggestion from gebi84 looks good.

I believe this is the same issue as #101

Original message below: An alternate solution that uses the connection string would be helpful, however this can be easily overcome with test specific configs.

#config/packages/doctrine.yaml
doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'
#config/packages/test/doctrine.yaml
doctrine:
    dbal:
        driver: '%env(DATABASE_DRIVER)%'
        host: '%env(DATABASE_HOST)%'
        port: '%env(DATABASE_PORT)%'
        dbname: '%env(DATABASE_NAME)%'
        user: '%env(DATABASE_USER)%'
        password: '%env(DATABASE_PASSWORD)%'
        charset: UTF8

Being sure your .env has the required properties

soulcodex commented 2 years ago

Hi guys, is absolutly neccesary support DATABASE_URL param for connection with database, i am not able to establish connection with my database using the params listing like commented us @mr120 :(

DonCallisto commented 2 years ago

Hi @soulcodex, at the moment I won't be able to tackle this quickly. If you find a solution for this issue, you're welcome to open a PR.

soulcodex commented 2 years ago

I will start to work with a PR with the Connection Factory based on regex capture for URL approach at least for relational databases like MySQL, PG and SQLITE

See you soon

soulcodex commented 2 years ago

@DonCallisto take a look at the changes I have for the package using DSN instead of a list of parameters, it only remains to test it and add the approach for SQLite.

https://github.com/soulcodex/fastest/tree/feature/1-add-support-for-database-url/adapters/Doctrine/DBAL/Factory

DonCallisto commented 2 years ago

Please, produce a diff (for example with a draft PR) and when I'll have time, I'll try to take a look. Thanks.