datasette/tests
Simon Willison 5bf4cf8860 Add insert row UI to table pages
Add a permission-gated Insert row button to mutable table pages and expose the metadata needed by the client-side UI, including the insert API path, table name, primary keys, editable columns, defaults, nullability, and column type information.

Reuse the existing row edit modal for inserts. Insert submissions now use the JSON API with return=true, derive the new row's tilde-encoded row path from the returned primary key values, fetch the matching table fragment, and insert the rendered row into the current table. Successful inserts and updates now show mutation status messages above the table.

Support SQLite defaults in insert forms by showing default expressions as non-editable values with Set value / Use default controls. Keep those controls aligned and stable so toggling between default and custom values does not shift the modal layout.

Refine the edit modal at the same time: send only changed fields on update, skip the update API entirely when nothing changed, clear stale mutation status for no-op saves, and simplify modal headings so insert/edit context is shown in the bold title instead of duplicated summary text.

Add tests for the insert button and metadata, including omitted integer primary keys, default values, table names, and compound primary keys.
2026-06-13 21:34:45 -07:00
..
plugins Merge branch 'main' into queries 2026-05-26 13:51:51 -07:00
test_templates Fix handling of nested custom page wildcard paths, closes #996 2020-10-07 15:51:11 -07:00
__init__.py Broke up test_app into test_api and test_html 2017-12-15 04:08:24 -08:00
build_small_spatialite_db.py New run_sanity_checks mechanism, for SpatiLite 2019-05-11 15:55:30 -07:00
conftest.py datasette.allowed_many() method 2026-06-12 12:51:40 -07:00
ext.c Add new entrypoint option to --load-extensions. (#1789) 2022-08-23 11:34:30 -07:00
fixtures.py Enforce query ownership and remove canned query hook 2026-05-24 22:58:50 -07:00
spatialite.db New run_sanity_checks mechanism, for SpatiLite 2019-05-11 15:55:30 -07:00
test-datasette-load-plugins.sh fix (typo): Corrected spelling of 'environments' (#2268) 2024-02-19 14:41:32 -08:00
test_actions_sql.py Expanded analysis of SQL operations, refs #2748 2026-05-26 22:11:35 -07:00
test_actor_restriction_bug.py New PermissionSQL.restriction_sql mechanism for actor restrictions 2025-11-03 14:17:51 -08:00
test_allowed_many.py Switch to CTE to handle 600+ actions at once 2026-06-13 11:09:28 -07:00
test_allowed_resources.py Better test name 2026-05-23 17:07:47 -07:00
test_api.py Remove legacy ?_extras= row parameter 2026-06-10 21:49:23 -07:00
test_api_write.py Fix write query failing when a named parameter is called :sql (#2765) 2026-06-10 20:15:03 -07:00
test_auth.py Rename set-column-types action to et-column-type 2026-03-18 12:33:09 -07:00
test_base_view.py New View base class (#2080) 2023-05-25 17:18:43 -07:00
test_cli.py datasette inspect now counts 10,000+ tables correctly (#2752) 2026-05-28 15:52:51 -07:00
test_cli_serve_get.py Black formatting 2026-02-17 13:30:24 -08:00
test_cli_serve_server.py Move HTTPS test to a bash script 2022-12-17 18:33:07 -08:00
test_column_types.py Call ds.close() in more places in tests 2026-04-16 20:25:58 -07:00
test_config_dir.py From 409 warnings down to 52 warnings. 2026-04-14 18:46:47 -07:00
test_config_permission_rules.py Run black formatter 2025-10-25 15:38:07 -07:00
test_crossdb.py From 409 warnings down to 52 warnings. 2026-04-14 18:46:47 -07:00
test_csrf_middleware.py Normalize headers in CSRF checks, refs #2689 2026-04-14 19:24:38 -07:00
test_csv.py Black formatting 2026-02-17 13:30:24 -08:00
test_custom_pages.py Prevent open redirect via backslash in path (#2680) 2026-06-10 23:36:28 -07:00
test_datasette_https_server.sh Detect server start/stop more reliably. 2022-12-18 08:01:51 -08:00
test_default_deny.py Add regression test for --default-deny index 500 (#2644) 2026-06-10 23:36:28 -07:00
test_docs.py Add row and query JSON extras 2026-06-09 02:56:27 -07:00
test_docs_plugins.py Call ds.close() in more places in tests 2026-04-16 20:25:58 -07:00
test_extras.py Build extras registries once per scope instead of per request 2026-06-10 23:04:12 -07:00
test_facets.py Respect metadata-defined facet ordering in sorted_facet_results (#2648) 2026-02-25 16:33:27 -08:00
test_fd_leak.py FD-leak regression test for Datasette.close() 2026-04-16 20:18:05 -07:00
test_filters.py Switch to ruff and fix all lint errors, refs #2630 2026-01-23 20:43:16 -08:00
test_fixtures.py datasette.fixtures module, closes #2733 2026-05-21 23:05:37 -07:00
test_html.py Fix write query failing when a named parameter is called :sql (#2765) 2026-06-10 20:15:03 -07:00
test_internal_db.py Prototype of new /-/jump menu plus plugin hook 2026-05-21 15:02:17 -07:00
test_internals_database.py Fix execute_isolated_fn() against immutable databases 2026-06-10 20:04:55 -07:00
test_internals_datasette.py Fix for Database.close()/Datasette.close() order (#2710) 2026-05-12 16:31:36 -07:00
test_internals_datasette_client.py Prototype of new /-/jump menu plus plugin hook 2026-05-21 15:02:17 -07:00
test_internals_request.py Request.fake(... url_vars), plus .fake() is now documented 2022-03-31 19:01:58 -07:00
test_internals_response.py response.set_cookie(), closes #795 2020-06-09 15:19:37 -07:00
test_internals_urls.py Fix double-prefixed export links with base_url 2026-05-30 22:41:54 -07:00
test_jump.py Renamed canned queries to queries / stored queries in docs 2026-05-26 15:17:51 -07:00
test_label_column_for_table.py Detect single unique text column in label_column_for_table, closes #2458 2025-02-01 17:02:49 -08:00
test_load_extensions.py Introduce new /$DB/-/query endpoint, soft replaces /$DB?sql=... (#2363) 2024-07-15 10:33:51 -07:00
test_messages.py Introduce new /$DB/-/query endpoint, soft replaces /$DB?sql=... (#2363) 2024-07-15 10:33:51 -07:00
test_multipart.py Add request.form() for multipart form data and file uploads 2026-01-28 18:41:03 -08:00
test_navigation_search_js.py Ran Black 2026-05-22 21:27:04 -07:00
test_package.py Upgrade Docker images to Python 3.11, closes #1853 2022-10-25 12:04:53 -07:00
test_permission_endpoints.py Add actor= parameter to datasette.client methods (#2688) 2026-04-14 18:31:57 -07:00
test_permissions.py Fix /-/check 500 for query actions (#2756) 2026-06-10 23:36:28 -07:00
test_plugins.py Pass columns and rows to can_render for canned queries (#2711) 2026-06-10 23:36:28 -07:00
test_publish_cloudrun.py Black formatting 2026-02-17 13:30:24 -08:00
test_publish_heroku.py Upgrade to Python 3.11 on Heroku, refs #1905 2022-11-18 16:44:46 -08:00
test_pytest_autoclose_plugin.py Fix ruff lints in close-related tests 2026-04-16 20:34:48 -07:00
test_queries.py Fix execute_isolated_fn() against immutable databases 2026-06-10 20:04:55 -07:00
test_restriction_sql.py Switch to ruff and fix all lint errors, refs #2630 2026-01-23 20:43:16 -08:00
test_routes.py Black formatting 2026-02-17 13:30:24 -08:00
test_schema_endpoints.py Add actor= parameter to datasette.client methods (#2688) 2026-04-14 18:31:57 -07:00
test_search_tables.py Prototype of new /-/jump menu plus plugin hook 2026-05-21 15:02:17 -07:00
test_spatialite.py Skip SpatiaLite test if no conn.enable_load_extension() 2022-09-05 17:09:57 -07:00
test_stored_queries.py Fix write query failing when a named parameter is called :sql (#2765) 2026-06-10 20:15:03 -07:00
test_table_api.py Make filters, actions and display_rows extras internal 2026-06-10 22:50:44 -07:00
test_table_html.py Add insert row UI to table pages 2026-06-13 21:34:45 -07:00
test_token_handler.py TokenRestrictions.abbreviated(datasette) utility method for creating _r dicts (#2696) 2026-04-17 08:44:43 -07:00
test_tracer.py Fix for trace_child_tasks exception handling 2026-06-12 13:21:58 -07:00
test_utils.py Fix SQL injection via bracket escape bypass in escape_sqlite() (#2677) 2026-06-10 23:36:28 -07:00
test_utils_check_callable.py Rename callable.py to check_callable.py, refs #2078 2023-05-25 11:49:40 -07:00
test_utils_permissions.py Black formatting 2026-02-17 13:30:24 -08:00
test_utils_sql_analysis.py Detect and disallow insert to virtual/shadow table 2026-05-28 08:36:59 -07:00
test_write_sql_operation_decisions.py Refactored write decision tests 2026-05-28 12:09:20 -07:00
test_write_wrapper.py Replace Janus queue with asyncio.Future 2026-05-16 11:45:43 -07:00
utils.py From 409 warnings down to 52 warnings. 2026-04-14 18:46:47 -07:00