console/database: use docker-compose for postgresql testing

This commit is contained in:
Francois Espinet
2024-04-10 14:26:20 +00:00
committed by Vincent Bernat
parent d998388d06
commit e2cf908179
3 changed files with 54 additions and 41 deletions

View File

@@ -5,19 +5,15 @@ package database
import (
"context"
"log"
"database/sql"
"fmt"
"net"
"testing"
"time"
"akvorado/common/helpers"
"akvorado/common/reporter"
"github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/modules/postgres"
"github.com/testcontainers/testcontainers-go/wait"
)
func testSavedFilter(t *testing.T, c *Component) {
// Create
if err := c.CreateSavedFilter(context.Background(), SavedFilter{
@@ -109,40 +105,16 @@ func TestSavedFilterSqlite(t *testing.T) {
}
func TestSavedFilterPostgres(t *testing.T) {
server := helpers.CheckExternalService(t, "Postgresql", []string{"postgres:5432", "127.0.0.1:5432"})
server, serverPort, err := net.SplitHostPort(server)
if err != nil {
t.Fatalf("failed to parse server:\n%+v", err)
}
r := reporter.NewMock(t)
ctx := context.Background()
dbName := "akvorado"
dbUser := "akvorado"
dbPassword := "akpass"
postgresContainer, err := postgres.RunContainer(ctx,
testcontainers.WithImage("docker.io/postgres:16-alpine"),
postgres.WithDatabase(dbName),
postgres.WithUsername(dbUser),
postgres.WithPassword(dbPassword),
testcontainers.WithWaitStrategy(
wait.ForLog("database system is ready to accept connections").
WithOccurrence(2).
WithStartupTimeout(5*time.Second)),
)
if err != nil {
log.Fatalf("failed to start container: %s", err)
}
// Clean up the container
defer func() {
if err := postgresContainer.Terminate(ctx); err != nil {
log.Fatalf("failed to terminate container: %s", err)
}
}()
dsn, err := postgresContainer.ConnectionString(ctx)
if err != nil {
t.Fatalf("failed to get postgres connection string: %s", err)
}
dsn := fmt.Sprintf(
"host=%s port=%s user=akvorado password=akpass dbname=akvorado sslmode=disable",
server, serverPort)
c := NewMock(
t,
r,
@@ -152,6 +124,29 @@ func TestSavedFilterPostgres(t *testing.T) {
},
)
// clean database for future tests
t.Cleanup(func() {
db, err := sql.Open("pgx", dsn)
if err != nil {
t.Fatalf("sql.Open() error:\n%+v", err)
}
defer db.Close()
if _, err := db.Exec(`
DO $$ DECLARE
r RECORD;
BEGIN
-- if the schema you operate on is not "current", you will want to
-- replace current_schema() in query with 'schematodeletetablesfrom'
-- *and* update the generate 'DROP...' accordingly.
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
END LOOP;
END $$;
`); err != nil {
t.Fatalf("db.Exec() error:\n%+v", err)
}
})
testSavedFilter(t, c)
}

View File

@@ -32,6 +32,22 @@ services:
ports:
- 127.0.0.1:6379:6379/tcp
postgres:
extends:
file: versions.yml
service: postgres
environment:
POSTGRES_PASSWORD: akpass
POSTGRES_USER: akvorado
POSTGRES_DB: akvorado
ports:
- 127.0.0.1:5432:5432/tcp
healthcheck:
test: ["CMD-SHELL", "pg_isready -U akvorado -d akvorado"]
interval: 5s
timeout: 5s
retries: 5
clickhouse: &clickhouse
extends:
file: versions.yml

View File

@@ -29,3 +29,5 @@ services:
# for tests
srlinux:
image: ghcr.io/nokia/srlinux:23.7.1
postgres:
image: docker.io/postgres:16-alpine