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 ( import (
"context" "context"
"log" "database/sql"
"fmt"
"net"
"testing" "testing"
"time"
"akvorado/common/helpers" "akvorado/common/helpers"
"akvorado/common/reporter" "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) { func testSavedFilter(t *testing.T, c *Component) {
// Create // Create
if err := c.CreateSavedFilter(context.Background(), SavedFilter{ if err := c.CreateSavedFilter(context.Background(), SavedFilter{
@@ -105,54 +101,53 @@ func testSavedFilter(t *testing.T, c *Component) {
func TestSavedFilterSqlite(t *testing.T) { func TestSavedFilterSqlite(t *testing.T) {
r := reporter.NewMock(t) r := reporter.NewMock(t)
testSavedFilter(t, NewMock(t, r, DefaultConfiguration())) testSavedFilter(t, NewMock(t, r, DefaultConfiguration()))
} }
func TestSavedFilterPostgres(t *testing.T) { func TestSavedFilterPostgres(t *testing.T) {
r := reporter.NewMock(t) server := helpers.CheckExternalService(t, "Postgresql", []string{"postgres:5432", "127.0.0.1:5432"})
ctx := context.Background() server, serverPort, err := net.SplitHostPort(server)
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 { if err != nil {
log.Fatalf("failed to start container: %s", err) t.Fatalf("failed to parse server:\n%+v", 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)
} }
r := reporter.NewMock(t)
dsn := fmt.Sprintf(
"host=%s port=%s user=akvorado password=akpass dbname=akvorado sslmode=disable",
server, serverPort)
c := NewMock( c := NewMock(
t, t,
r, r,
Configuration{ Configuration{
Driver: "postgresql", Driver: "postgresql",
DSN: dsn, DSN: dsn,
}, },
) )
testSavedFilter(t, c) // 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)
} }
func TestPopulateSavedFilters(t *testing.T) { func TestPopulateSavedFilters(t *testing.T) {

View File

@@ -32,6 +32,22 @@ services:
ports: ports:
- 127.0.0.1:6379:6379/tcp - 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 clickhouse: &clickhouse
extends: extends:
file: versions.yml file: versions.yml

View File

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