| 730 | |
| 731 | #[tokio::test(flavor = "multi_thread", worker_threads = 2)] |
| 732 | async fn pg_dump_round_trip_plain_sql() -> Result<()> { |
| 733 | let server = PgliteServer::temporary_tcp()?; |
| 734 | let mut conn = sqlx::PgConnection::connect(&server.database_url()) |
| 735 | .await |
| 736 | .context("connect to PGlite server")?; |
| 737 | conn.execute( |
| 738 | "CREATE TABLE dump_items(id INTEGER PRIMARY KEY, value TEXT); |
| 739 | CREATE INDEX dump_items_value_idx ON dump_items(value); |
| 740 | CREATE SEQUENCE dump_items_seq START WITH 10; |
| 741 | CREATE VIEW dump_item_values AS SELECT value FROM dump_items; |
| 742 | INSERT INTO dump_items(id, value) VALUES (1, 'alpha'), (2, 'beta'); |
| 743 | SELECT nextval('dump_items_seq');", |
| 744 | ) |
| 745 | .await |
| 746 | .context("seed pg_dump source data")?; |
| 747 | drop(conn); |
| 748 | |
| 749 | let (server, dump) = tokio::task::spawn_blocking(move || -> Result<_> { |
| 750 | let dump = server.dump_sql(PgDumpOptions::default())?; |
| 751 | Ok((server, dump)) |
| 752 | }) |
| 753 | .await |
| 754 | .context("join pg_dump task")??; |
| 755 | |
| 756 | assert!(dump.contains("PostgreSQL database dump")); |
| 757 | assert!( |
| 758 | dump.contains("CREATE TABLE public.dump_items"), |
| 759 | "dump did not contain dump_items table DDL:\n{dump}" |
| 760 | ); |
| 761 | assert!(dump.contains("CREATE INDEX dump_items_value_idx")); |
| 762 | assert!(dump.contains("CREATE SEQUENCE public.dump_items_seq")); |
| 763 | assert!(dump.contains("CREATE VIEW public.dump_item_values")); |
| 764 | assert!(dump.contains("INSERT INTO")); |
| 765 | |
| 766 | let (server, schema_only) = tokio::task::spawn_blocking(move || -> Result<_> { |
| 767 | let dump = server.dump_sql(PgDumpOptions::new().arg("--schema-only"))?; |
| 768 | Ok((server, dump)) |
| 769 | }) |
| 770 | .await |
| 771 | .context("join schema-only pg_dump task")??; |
| 772 | assert!(schema_only.contains("CREATE TABLE public.dump_items")); |
| 773 | assert!( |
| 774 | !schema_only.contains("INSERT INTO public.dump_items"), |
| 775 | "schema-only dump unexpectedly contained data:\n{schema_only}" |
| 776 | ); |
| 777 | |
| 778 | let (server, quoted) = tokio::task::spawn_blocking(move || -> Result<_> { |
| 779 | let dump = server.dump_sql(PgDumpOptions::new().arg("--quote-all-identifiers"))?; |
| 780 | Ok((server, dump)) |
| 781 | }) |
| 782 | .await |
| 783 | .context("join quoted pg_dump task")??; |
| 784 | assert!(quoted.contains("CREATE TABLE \"public\".\"dump_items\"")); |
| 785 | assert!(quoted.contains("INSERT INTO \"public\".\"dump_items\"")); |
| 786 | |
| 787 | let mut usable = sqlx::PgConnection::connect(&server.database_url()) |
| 788 | .await |
| 789 | .context("reconnect after pg_dump")?; |