diff --git a/cmd/dump/dump_integration_test.go b/cmd/dump/dump_integration_test.go index fbba5835..f04f1636 100644 --- a/cmd/dump/dump_integration_test.go +++ b/cmd/dump/dump_integration_test.go @@ -81,6 +81,13 @@ func TestDumpCommand_Issue125FunctionDefault(t *testing.T) { runExactMatchTest(t, "issue_125_function_default") } +func TestDumpCommand_Issue133IndexSort(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + runExactMatchTest(t, "issue_133_index_sort") +} + func runExactMatchTest(t *testing.T, testDataDir string) { runExactMatchTestWithContext(t, context.Background(), testDataDir) } diff --git a/testdata/dump/issue_133_index_sort/manifest.json b/testdata/dump/issue_133_index_sort/manifest.json new file mode 100644 index 00000000..9f589795 --- /dev/null +++ b/testdata/dump/issue_133_index_sort/manifest.json @@ -0,0 +1,10 @@ +{ + "name": "issue_133_index_sort", + "description": "Test case for index sorting in alphabetical order (GitHub issue #133)", + "source": "https://github.com/pgschema/pgschema/issues/133", + "notes": [ + "Tests that indexes are dumped in alphabetical order for consistent, predictable output", + "Indexes are created in non-alphabetical order: email, created_at, status, department, last_name", + "Expected dump order is alphabetical: created_at, department, email, last_name, status" + ] +} diff --git a/testdata/dump/issue_133_index_sort/pgdump.sql b/testdata/dump/issue_133_index_sort/pgdump.sql new file mode 100644 index 00000000..c5ef0a1b --- /dev/null +++ b/testdata/dump/issue_133_index_sort/pgdump.sql @@ -0,0 +1,84 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 17.5 (Debian 17.5-1.pgdg120+1) +-- Dumped by pg_dump version 17.6 (Homebrew) + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET transaction_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +SET default_tablespace = ''; + +SET default_table_access_method = heap; + +-- +-- Name: users; Type: TABLE; Schema: public; Owner: - +-- + +CREATE TABLE public.users ( + id bigint NOT NULL, + email character varying(255) NOT NULL, + last_name character varying(100), + department character varying(50), + status character varying(20), + created_at timestamp with time zone DEFAULT now() +); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY public.users + ADD CONSTRAINT users_pkey PRIMARY KEY (id); + + +-- +-- Name: idx_users_created_at; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_users_created_at ON public.users USING btree (created_at); + + +-- +-- Name: idx_users_department; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_users_department ON public.users USING btree (department); + + +-- +-- Name: idx_users_email; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_users_email ON public.users USING btree (email); + + +-- +-- Name: idx_users_last_name; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_users_last_name ON public.users USING btree (last_name); + + +-- +-- Name: idx_users_status; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX idx_users_status ON public.users USING btree (status); + + +-- +-- PostgreSQL database dump complete +-- + diff --git a/testdata/dump/issue_133_index_sort/pgschema.sql b/testdata/dump/issue_133_index_sort/pgschema.sql new file mode 100644 index 00000000..476dde44 --- /dev/null +++ b/testdata/dump/issue_133_index_sort/pgschema.sql @@ -0,0 +1,52 @@ +-- +-- pgschema database dump +-- + +-- Dumped from database version PostgreSQL 17.5 +-- Dumped by pgschema version 1.4.0 + + +-- +-- Name: users; Type: TABLE; Schema: -; Owner: - +-- + +CREATE TABLE IF NOT EXISTS users ( + id bigint, + email varchar(255) NOT NULL, + last_name varchar(100), + department varchar(50), + status varchar(20), + created_at timestamptz DEFAULT now(), + CONSTRAINT users_pkey PRIMARY KEY (id) +); + +-- +-- Name: idx_users_created_at; Type: INDEX; Schema: -; Owner: - +-- + +CREATE INDEX IF NOT EXISTS idx_users_created_at ON users (created_at); + +-- +-- Name: idx_users_department; Type: INDEX; Schema: -; Owner: - +-- + +CREATE INDEX IF NOT EXISTS idx_users_department ON users (department); + +-- +-- Name: idx_users_email; Type: INDEX; Schema: -; Owner: - +-- + +CREATE INDEX IF NOT EXISTS idx_users_email ON users (email); + +-- +-- Name: idx_users_last_name; Type: INDEX; Schema: -; Owner: - +-- + +CREATE INDEX IF NOT EXISTS idx_users_last_name ON users (last_name); + +-- +-- Name: idx_users_status; Type: INDEX; Schema: -; Owner: - +-- + +CREATE INDEX IF NOT EXISTS idx_users_status ON users (status); + diff --git a/testdata/dump/issue_133_index_sort/raw.sql b/testdata/dump/issue_133_index_sort/raw.sql new file mode 100644 index 00000000..b620a154 --- /dev/null +++ b/testdata/dump/issue_133_index_sort/raw.sql @@ -0,0 +1,33 @@ +-- +-- Test case for GitHub issue #133: Index sorting +-- +-- This test case validates that indexes are dumped in alphabetical order +-- rather than in an arbitrary order. +-- +-- The indexes are intentionally created in non-alphabetical order: +-- idx_users_email, idx_users_created_at, idx_users_status, +-- idx_users_department, idx_users_last_name +-- +-- Expected alphabetical order in dump output: +-- idx_users_created_at, idx_users_department, idx_users_email, +-- idx_users_last_name, idx_users_status +-- + +CREATE TABLE users ( + id bigint NOT NULL, + email varchar(255) NOT NULL, + last_name varchar(100), + department varchar(50), + status varchar(20), + created_at timestamp with time zone DEFAULT now() +); + +-- Create indexes in non-alphabetical order to test sorting +CREATE INDEX idx_users_email ON users(email); +CREATE INDEX idx_users_created_at ON users(created_at); +CREATE INDEX idx_users_status ON users(status); +CREATE INDEX idx_users_department ON users(department); +CREATE INDEX idx_users_last_name ON users(last_name); + +-- Add primary key +ALTER TABLE users ADD CONSTRAINT users_pkey PRIMARY KEY (id);