114 lines
3.7 KiB
Go
114 lines
3.7 KiB
Go
package inspect
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/jackc/pgconn"
|
|
"github.com/spf13/afero"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/supabase/cli/internal/inspect/bloat"
|
|
"github.com/supabase/cli/internal/inspect/blocking"
|
|
"github.com/supabase/cli/internal/inspect/cache"
|
|
"github.com/supabase/cli/internal/inspect/calls"
|
|
"github.com/supabase/cli/internal/inspect/index_sizes"
|
|
"github.com/supabase/cli/internal/inspect/index_usage"
|
|
"github.com/supabase/cli/internal/inspect/locks"
|
|
"github.com/supabase/cli/internal/inspect/long_running_queries"
|
|
"github.com/supabase/cli/internal/inspect/outliers"
|
|
"github.com/supabase/cli/internal/inspect/replication_slots"
|
|
"github.com/supabase/cli/internal/inspect/role_configs"
|
|
"github.com/supabase/cli/internal/inspect/role_connections"
|
|
"github.com/supabase/cli/internal/inspect/seq_scans"
|
|
"github.com/supabase/cli/internal/inspect/table_index_sizes"
|
|
"github.com/supabase/cli/internal/inspect/table_record_counts"
|
|
"github.com/supabase/cli/internal/inspect/table_sizes"
|
|
"github.com/supabase/cli/internal/inspect/total_index_size"
|
|
"github.com/supabase/cli/internal/inspect/total_table_sizes"
|
|
"github.com/supabase/cli/internal/inspect/unused_indexes"
|
|
"github.com/supabase/cli/internal/inspect/vacuum_stats"
|
|
"github.com/supabase/cli/pkg/pgtest"
|
|
)
|
|
|
|
var dbConfig = pgconn.Config{
|
|
Host: "127.0.0.1",
|
|
Port: 5432,
|
|
User: "admin",
|
|
Password: "password",
|
|
Database: "postgres",
|
|
}
|
|
|
|
func TestReportCommand(t *testing.T) {
|
|
t.Run("runs all queries", func(t *testing.T) {
|
|
// Setup in-memory fs
|
|
fsys := afero.NewMemMapFs()
|
|
// Setup mock postgres
|
|
conn := pgtest.NewConn()
|
|
defer conn.Close(t)
|
|
conn.Query(wrapQuery(bloat.BloatQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(blocking.BlockingQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(cache.CacheQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(calls.CallsQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(index_sizes.IndexSizesQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(index_usage.IndexUsageQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(locks.LocksQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(long_running_queries.LongRunningQueriesQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(outliers.OutliersQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(replication_slots.ReplicationSlotsQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(role_configs.RoleConfigsQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(role_connections.RoleConnectionsQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(seq_scans.SeqScansQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(table_index_sizes.TableIndexSizesQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(table_record_counts.TableRecordCountsQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(table_sizes.TableSizesQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(total_index_size.TotalIndexSizeQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(total_table_sizes.TotalTableSizesQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(unused_indexes.UnusedIndexesQuery)).
|
|
Reply("COPY 0").
|
|
Query(wrapQuery(vacuum_stats.VacuumStatsQuery)).
|
|
Reply("COPY 0")
|
|
// Run test
|
|
err := Report(context.Background(), ".", dbConfig, fsys, conn.Intercept)
|
|
// Check error
|
|
assert.NoError(t, err)
|
|
matches, err := afero.Glob(fsys, "*.csv")
|
|
assert.NoError(t, err)
|
|
assert.Len(t, matches, 20)
|
|
})
|
|
}
|
|
|
|
func TestWrapQuery(t *testing.T) {
|
|
t.Run("wraps query in csv", func(t *testing.T) {
|
|
assert.Equal(t,
|
|
"COPY (SELECT 1) TO STDOUT WITH CSV HEADER",
|
|
wrapQuery("SELECT 1"),
|
|
)
|
|
})
|
|
|
|
t.Run("replaces placeholder value", func(t *testing.T) {
|
|
assert.Equal(t,
|
|
fmt.Sprintf("COPY (SELECT 'a' LIKE ANY(%s)) TO STDOUT WITH CSV HEADER", ignoreSchemas),
|
|
wrapQuery("SELECT 'a' LIKE ANY($1)"),
|
|
)
|
|
})
|
|
}
|