Wpis z mikrobloga

Siema murki. Mam problem z #php #symfony #devops. Chodzi o uruchamianie testów. Skorzystałem z gotowego dockera od dunglasa https://github.com/dunglas/symfony-docker

Uruchamiam projekt

docker-compose up -d
uruchamiana jest migracja i tworzona baza danych "app". Wszystko jest ok jeśli używam np. postmana. Ale wolę napisać testy żeby nie testować ręcznie.

Użyłem behat (test rejestracji użytkownika), odpalam komendą:

docker compose exec php vendor/bin/behat
i dostaję to:

[critical] Uncaught PHP Exception Doctrine\DBAL\Exception\ConnectionException: "An exception occurred in the driver: SQLSTATE[HY000] [1044] Access denied for user 'app'@'%' to database 'app_test'" at /srv/app/vendor/doctrine/dbal/src/Driver/API/MySQL/ExceptionConverter.php line 101
Jak widać, kod próbuje użyć bazy danych "apptest" - co jest ok bo nie chcę testować na "produkcyjnej" (app) bazie danych. Pytanie tylko jak to ograć, jak stworzyć bazę pod testy podczas uruchamiania?

Próbowałem

docker-compose exec php bin/console --env=test doctrine:database:create
ale dostaje:

Could not create database apptest for connection named default
An exception occurred while executing a query: SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user 'app'@'%' to database 'app_test'

Macie jakieś hinty? Co robię źle?

https://pastebin.com/0E4cpk3Q - docker-compose.yml
https://pastebin.com/SvjEgcgz - docker-compose.prod.yml
https://pastebin.com/nF5VBjBH - docker-compose.override.yml
https://pastebin.com/vi1LQQb4 - docker-compose.dev.yml

Dodam, że chcę później te testy odpalać np. w github actions czy innym CI/CD.

A może macie jakieś hinty związane z testowaniem, stawianiem środowiska pod to itd.
  • 9
@mirunek: Wygląda na to że baza danych nie istnieje w kontenerze. Możesz dodać jako wolumen skrypt tworzący testową bd na starcie:

docker-compose.yml:

database:
restart: always
image: postgres:${DATABASE_SERVER_VERSION:-14}-alpine
ports:
- "5432"
environment:
POSTGRES_DB: ${DATABASE_NAME}
POSTGRES_USER: ${DATABASE_USER}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
depends_on:
- rabbitmq
networks:
- symfony
volumes:
- ./docker/database/init-test-db.sh:/docker-entrypoint-initdb.d/init-test-db.sh

skrypt:

#!/bin/bash
set -e
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE DATABASE "${POSTGRES_DB}-test";
GRANT ALL PRIVILEGES ON DATABASE "${POSTGRES_DB}-test" TO "${POSTGRES_USER}";
EOSQL

Oczywiście
@mirunek: A gdzie masz zdefiniowaną bazę danych apptest? Widzę że masz jedną bazę danych, więc przy okazji testów masz bazę danych "app", czy "apptest", czy może obie?

Moje rozwiązanie to dodatkowa baza danych:

database-test:
image: mysql:5.7
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE:-app_test}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-!ChangeMe!}
MYSQL_USER: ${MYSQL_USER:-app}
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
ports:
- "3307:3306"

".env.test" ma "database-test" oraz port "3307".

Do tego przed każdym testem używającym bazy danych mam coś takiego przy phpunit (mniej więcej):
@dzerzi: skorzystałem z twojego kodu:

database-test:
image: mysql:5.7
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE:-app_test}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-!ChangeMe!}
MYSQL_USER: ${MYSQL_USER:-app}
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
ports:
- "3307:3306"

baza danych istnieje ale gdy odpalam migracje to dostaje:

Access denied for user 'app'@'%' to database 'app_test'
Miałeś z tym problem?

Wiem, że programowanie to rozwiązywanie problemów, trzeba być kreatywnym. Ale nigdzie nie widziałem artykułu/sekcji w dokumentacji, która mówi, że środowisko powinno być przygotowane w sposób X,Y,Z (coś w stylu best
@mirunek: Jak masz kontener z pustą bazą, wystawioną na 3307 dla Twojej maszyny, to ja bym sprawdzał czy mogę się zalogować i wykonać ręcznie migracje (tworzyć tabele itd.).
Jak Ci się uda to wszystko zrobić a skryptowi nie, sprawdzasz czy skrypt na pewno używa tych samych danych do logowania.
Ewentualnie kwestia potwierdzenia, że w MySQL masz użytkownika app do bazy app_test z dostępem z odpowiednich hostów (najlepiej wildcard %).
Możesz też