Pages suite - 415 pages, 543 tests, 0 failed
415 pages, 543 tests, 0 failed - all ok
Every test here is an ordinary page, fetched over HTTP with &padInclude so it renders bare, and compared with the outcome written beside it. That makes it a real request, with a page's own .php half in scope for its .pad half. These tests live in apps/regression/pages/, which has _common switched off, so each one also proves it needs nothing but its own application; the pages that use _common are the Common suite.
| page | what it checks | status |
|---|---|---|
| blocks/extended | ok | |
| blocks/extendedframe | ok | |
| blocks/framed | ok | |
| blocks/page | ok | |
| callback | The row phase of a streaming callback, which reads the occurrence fields as plain variables | ok |
| catalog/functions | One line per pipe function over a stated value | ok |
| catalog/handling | The data handling options, each over a list whose answer is obvious | ok |
| catalog/options | One line per tag option, including the ones that assert being inert | ok |
| catalog/prefixes | One line per type prefix, each in its literal spelling | ok |
| catalog/properties | Every property and @ reference form on one page | ok |
| catalog/tags | One line per built-in tag no other page reaches - the catalogue half of the reference coverage | ok |
| catalog/volatile | The two draws - {ajax} ids and now - pinned by shape in one regex | ok |
| db/a_database_tag_binds_a_value_put_in_as_name | ok | |
| db/a_database_tag_called_as_a_function_binds_a_value_put_in_as_name | ok | |
| db/a_database_tag_with_nothing_spliced_runs_whatever_the_page_printed_before | A database tag with nothing spliced into its SQL runs, whatever text the page printed before it - its sort order, a guestbook entry | ok |
| db/a_float_read_from_the_database_is_bound_back_as_the_same_number | A float from the database bound back - a db() placeholder, a $name of a database tag - is the same number, not its 14 significant digits, and a whole one stays a count after LIMIT | ok |
| db/a_formatted_or_empty_record_is_still_a_record | ok | |
| db/a_locking_read_takes_its_limit_before_the_lock | ok | |
| db/a_named_query_with_replace_or_a_write_word_in_a_literal_reads | ok | |
| db/a_null_of_the_enclosing_row_is_bound_as_null | A NULL column of the enclosing row is NULL in the SQL it goes into - a $name of a database tag, the relation a nested select follows - not the empty text | ok |
| db/a_number_or_a_value_in_a_quoted_literal_spliced_into_a_database_tag_stays_a_value | A value spliced into the SQL of a database tag with {$name} is refused outside a quoted literal, but a plain number stands as itself and a value inside a quoted literal is text | ok |
| db/a_one_row_limit_sees_past_a_trailing_comment | ok | |
| db/a_page_array_sharing_a_record_s_columns_is_no_record | ok | |
| db/a_read_without_select_answers_its_rows | ok | |
| db/a_record_formatted_past_a_thousand_is_still_a_record | ok | |
| db/a_record_is_known_in_time_however_many_were_read | ok | |
| db/a_sandbox_lets_a_named_query_miss_a_field_it_hid | ok | |
| db/an_array_with_a_float_id_keeps_every_row | ok | |
| db/array | The db() array command through a page variable, and the else branch when nothing matches | ok |
| db/array2 | The same through the {array} tag, which hands its parameter to db() as the command word | ok |
| db/check | The db() check command, which answers whether a row exists rather than returning one | ok |
| db/check2 | The same through the {check} tag | ok |
| db/field | The db() field command, which returns one value | ok |
| db/field2 | The same through the {field} tag | ok |
| db/field_as_function | ok | |
| db/named | ok | |
| db/own_limit | ok | |
| db/placeholder_after_a_non_ascii_name | A statement with an unquoted name outside ASCII - naïef - fills its placeholders as any other | ok |
| db/placeholder_comment | ok | |
| db/placeholder_minus_inside_quotes | The space that keeps a bare negative number from a -- comment goes outside quotes only - A-{0} quoted stays A--1 | ok |
| db/placeholder_numeric_text | A bare placeholder holding numeric text is text on MySQL - name = {0} with 0 matches no name - and a count in a limit | ok |
| db/placeholder_numeric_text_counts_and_positions | Numeric text is a number where MySQL wants one - an ORDER BY position, a FETCH NEXT count - as after LIMIT | ok |
| db/placeholder_offset_column_and_frame | A column named offset is no OFFSET clause, and a window frame bound - ROWS BETWEEN {0} PRECEDING - is a number | ok |
| db/placeholder_position_follows_the_clause | An ORDER BY / GROUP BY position is read from the clauses and brackets - not in a UNION select list, still after field(...), in a list of any length | ok |
| db/placeholders | db() placeholders - a bare one quotes a value that is not a number, a quoted one escapes, an array becomes a list, and nothing is filled twice | ok |
| db/record | The db() record command, which returns one row | ok |
| db/record2 | The same through the {record} tag | ok |
| db/record_changed | ok | |
| db/record_twice | ok | |
| db/sqlite_binds_a_name_after_a_literal_ending_in_a_backslash | ok | |
| db/sqlite_insert_of_no_new_row_answers_no_id | ok | |
| db/sqlite_insert_whose_id_repeats_answers_it | ok | |
| db/sqlite_numeric_text_keeps_its_zeros | ok | |
| db/verb_whitespace | ok | |
| file/data_is_not_served | ok | |
| file/done | The page a file-output request lands on, reporting the name it was handed | ok |
| file/file | The {file} tag writing four files, with date, stamp and id naming them | ok |
| file/index | Output type file: the page is written to disk and the request restarts on file/done | ok |
| flush/a_tidy_marker_above_a_flush_is_taken_out | An in the part a {flush} sends early is taken out, as from the rest of the page | ok |
| flush/a_tidy_marker_below_a_flush_leaves_the_rest_as_rendered | An below a {flush} is taken out and tidy does not run over the rest - one document, as rendered | ok |
| flush/a_toc_above_a_flush_lists_the_headings_below_it | A {toc} in the part a {flush} would send holds every flush back: the toc lists the headings below it, no marker goes out | ok |
| flush/auth | A logged-in visitor below a {flush}: still logged in, the session opened before the headers went | ok |
| flush/auth_inner | The flushed page flush/auth asks with a session - on its own a guest | ok |
| flush/auth_login | The login flush/auth comes back with | ok |
| flush/csrf | ok | |
| flush/csrf_base | ok | |
| flush/csrf_split | ok | |
| flush/early | ok | |
| flush/embedded | ok | |
| flush/fragment | ok | |
| flush/live | ok | |
| flush/livepage | ok | |
| flush/login | A login below a {flush} on an open session: refused, the id cannot be renewed | ok |
| flush/login_inner | The login flush/login asks for - on its own it logs in | ok |
| flush/logout | A logout below a {flush} while a remember-me cookie stands: refused, the cookie cannot be dropped | ok |
| flush/logout_inner | The logout flush/logout asks for - on its own it logs out | ok |
| flush/nosession | ok | |
| flush/pdf | ok | |
| flush/pdf_named_preview | ok | |
| flush/slow | ok | |
| flush/tidybelow | The fixture of flush/a_tidy_marker_below_a_flush_leaves_the_rest_as_rendered, fetched bare: the page, the marker gone | ok |
| flush/timing | ok | |
| format/a_csv_answer_of_a_record_or_of_objects_is_a_table | A CSV answer of a record holding a list is one row, and of json_decode objects a row per object | ok |
| format/a_float_past_the_range_inside_an_object_is_null_in_a_json_answer | INF and NAN inside an object - a cast array, a json_decode row, a JsonSerializable - are null in a JSON answer as inside an array, never the 0 of a partial output | ok |
| format/a_float_past_the_range_is_null_in_a_json_answer | A float past the range - INF, -INF, NAN - is null in a JSON answer, as JSON.stringify writes it, never the 0 of a partial output; the CSV keeps INF | ok |
| format/a_text_that_is_no_utf8_is_kept_in_a_json_answer | A value with a byte that is no UTF-8 is kept in a JSON answer, the byte as U+FFFD - never null | ok |
| format/answers | ok | |
| format/cells | ok | |
| format/cells_csv | ok | |
| format/host | ok | |
| format/infinite | The fixture of format/a_float_past_the_range_is_null_in_a_json_answer, fetched bare: its page, and {^big} null | ok |
| format/infobjects | The fixture of format/a_float_past_the_range_inside_an_object_is_null_in_a_json_answer, fetched bare: {^field} over objects holding INF and NAN, null at any depth | ok |
| format/latin | The fixture of format/a_text_that_is_no_utf8_is_kept_in_a_json_answer, fetched bare: its page | ok |
| format/orders | ok | |
| format/output | ok | |
| format/records | The fixture of format/a_csv_answer_of_a_record_or_of_objects_is_a_table, fetched bare: its page | ok |
| format/scalar | ok | |
| forms/a_form_htmx_posts_to_its_own_directory_keeps_its_rules/index | A form with rules that htmx posts to its directory name - the address of this index - renders, its rules checked there | ok |
| forms/a_textarea_keeps_the_blank_line_its_value_starts_with | A text area writes a line break after its opening tag, which the HTML parser drops - a value starting with a blank line keeps it | ok |
| forms/client_parity | ok | |
| fragments/a_fragment_answers_without_the_developer_helpers | A page with the toolbar, live reload and the output check on carries the bar, the script and the panel as a whole page, and none of them in the answer to its fragment - asked by padFragment or by htmx in HX-Target | ok |
| fragments/byurl | ok | |
| fragments/cached | ok | |
| fragments/cachedbyurl | ok | |
| fragments/helpers | The fixture for fragments/a_fragment_answers_without_the_developer_helpers: the three helpers on, a fragment with an image the output check names - fetched bare, its panel follows the page | ok |
| fragments/list | ok | |
| fragments/missing | ok | |
| fragments/target | The fixture for fragments/targets: a page with one fragment between other HTML | ok |
| fragments/targets | An htmx request answered by the fragment named like the element it swaps (HX-Target) - the whole page when there is none or htmx did not ask, and padFragment winning over the header | ok |
| functions/date | The date function over a timestamp, a format and a strtotime modifier | ok |
| globals | object: over a page variable, which in a request is a global like any other | ok |
| hello/index | The smallest page pair there is, and the one redirect and restart land on | ok |
| helpers/cache_sweep_spares_a_fresh_entry | ok | |
| helpers/cache_sweep_spares_a_fresh_entry_put | ok | |
| helpers/cache_sweep_spares_a_fresh_entry_sweep | ok | |
| helpers/requests_abort | ok | |
| helpers/requests_abort_go | ok | |
| helpers/requests_back | ok | |
| helpers/requests_back_fallback | ok | |
| helpers/requests_input | ok | |
| helpers/requests_input_echo | ok | |
| helpers/requests_method_any_token | ok | |
| helpers/requests_method_show | ok | |
| helpers/requests_old | ok | |
| helpers/requests_old_form | ok | |
| helpers/requests_session | ok | |
| helpers/requests_session_put | ok | |
| helpers/requests_session_read | ok | |
| helpers/requests_session_regenerate | ok | |
| helpers/requests_session_regenerate_makes_a_new_csrf_token | ok | |
| helpers/signing_checks_the_request | ok | |
| helpers/signing_encodes_the_page_in_the_link | ok | |
| helpers/signing_refuses_a_body_that_names_a_signed_value | ok | |
| helpers/signing_refuses_a_json_key_that_walks_into_a_signed_value | ok | |
| helpers/signing_route/[name] | ok | |
| helpers/signing_target | ok | |
| htmlboth | A page with both a .pad and an .html - the .pad wins | ok |
| htmlonly | An .html page with no .php half, carrying a tag of its own | ok |
| htmlpage | An .html file as the template half of a pair - variables, pipes, a loop and a property all resolve in it | ok |
| live/a_posting_form_in_a_live_answer_keeps_its_csrf_token | A posting form in a {live} region under $padCsrf carries the token in the answer to an event as in the page | ok |
| live/counter | ok | |
| live/csrf | ok | |
| live/form | The fixture of live/a_posting_form_in_a_live_answer_keeps_its_csrf_token, fetched bare: the region, its form with the token | ok |
| mail/a_header_written_as_a_quoted_text_with_a_field_is_its_plain_text | ok | |
| mail/a_mail_rendered_first_leaves_the_page_its_style | ok | |
| mail/a_mail_template_takes_out_its_start_and_end | ok | |
| mail/a_pdf_in_a_mail_leaves_the_page_a_page | ok | |
| mail/addresses_with_a_comma_in_a_quoted_name | ok | |
| mail/addresses_with_a_stray_quote_or_a_long_quoted_name | ok | |
| mail/file | ok | |
| mail/from | ok | |
| mail/tags | ok | |
| manual/z99 | A page whose .php returns a string, which the build prepends to the page | ok |
| meta/framed | ok | |
| meta/page | ok | |
| misc/bench | The benchmark history: the slower verdict over made-up runs, a kept run read back, the chart | ok |
| misc/bootstrap_failure | ok | |
| misc/curl_stale | A source that fails past the ttl: the last good copy is served | ok |
| misc/curl_stale_expired | ok | |
| misc/datatypes | The html and range data types: a tidied document walked to its values, and both range spellings | ok |
| misc/local | Reading a file from _data/ by name, in each format padData() accepts | ok |
| misc/local_yml | ok | |
| misc/nocurl_reads_web_urls_only | Without ext-curl padNoCurl fetches http and https only - a file:// URL is the 999 failure | ok |
| misc/parms | Parameters, options and variables on a tag, over a PHP array, a constant and a store | ok |
| misc/pdf_preview_alone | A {pdf preview} written as a single tag: the page with its links to open and download the document | ok |
| misc/pdf_preview_alone_document | The document misc/pdf_preview_alone answers when asked: the page, without the preview's own links in it | ok |
| misc/react | The {reactData} tag over a static provider, and the @providers reference reading the parked result back | ok |
| misc/react_id | ok | |
| misc/react_keeps_its_data_with_a_byte_that_is_no_utf8 | A {reactData} provider whose text holds a byte that is no UTF-8 - a Latin-1 Caf\xE9 - keeps its data, the byte as U+FFFD: the JSON came back FALSE, and the attribute empty | ok |
| misc/react_types | ok | |
| misc/tidied | ok | |
| misc/tidy | ok | |
| misc/tidy_unclosed | ok | |
| misc/trace | The {trace} tag wrapping a scope in the execution trace | ok |
| noted/frames | An @page@ inside a comment of a wrapper marks nothing - one beside the real marker, and one in a wrapper that has no other | ok |
| noted/only/inner | ok | |
| noted/two/inner | ok | |
| override/a_bare_built_in_name_runs_the_application_s_own_function | An application function named as a built-in one stands in for it, also as a bare pipe name | ok |
| pagekey_shown | ok | |
| pagekey_value | ok | |
| pagetag | ok | |
| pairing | A page pair: the .php half fills in what the .pad half prints | ok |
| phponly | A page with no template at all - what its .php echoes is the page | ok |
| request/a_clean_url_with_a_comma_or_semicolon_in_a_directory_answers_a_returning_visitor | A visitor sending an old and a new identity pair asks a clean URL with a , or ; in a directory segment: the page answers and the expiry passes over the path setcookie cannot write | ok |
| request/a_fetch_for_a_visitor_at_any_address_is_not_local | ok | |
| request/a_fetch_of_this_site_by_another_name_is_not_local | ok | |
| request/a_fetch_the_engine_makes_for_a_visitor_is_not_local | ok | |
| request/a_fetch_without_ext_curl_follows_a_redirect_of_this_site | ok | |
| request/a_fetch_without_ext_curl_keeps_the_pin_and_the_post | ok | |
| request/a_field_a_post_leaves_out | The fixture of request/a_field_a_post_leaves_out_is_checked_from_the_query_string bare: an empty form, not stored | ok |
| request/a_field_a_post_leaves_out_is_checked_from_the_query_string | A field the post leaves out is read from the query string, so the rules check it there - website=javascript:..., plan=enterprise and role=admin in the address refused, good values passed | ok |
| request/a_guard_reading_the_user_after_padauthrequire_ends_at_the_refusal | In the guard of a {page}-included page padAuthRequire ends the guard for a guest, so a line reading the user after it never runs and the part renders as nothing | ok |
| request/a_guard_that_swallows_the_refusal_of_a_part_still_refuses_it | A guard of a {page}-included page that catches the refusal of padAuthRequire or padAuthorize - padRescue, a try/catch - and returns TRUE is refused all the same: the part renders as nothing | ok |
| request/a_guarded_page_named_as_content_renders_nothing_when_refused | A page below a _guard.php named by content= or else= is asked of its guard as a {page} is - refused, it renders as nothing | ok |
| request/a_json_body_address_is_refused | An address posted as a JSON body is a request value - refused as a form post of it is | ok |
| request/a_part_whose_guard_asks_for_a_login_renders_nothing_for_a_guest | A page included by {page} whose _guard.php calls padAuthRequire or padAuthorize renders as nothing when refused, where the whole public page was sent to the login or answered 403 | ok |
| request/a_plain_php_application_answers_404_for_up_and_the_sitemap | The plain-PHP application nono asked for ?up, ?sitemap.xml and ?robots.txt it has no page for: the 404 of any page that is not there, not a boot error on the stand-in page | ok |
| request/a_plain_php_application_leaves_the_sitemap_and_up_to_the_engine | A plain-PHP application with a root [slug].php and the sitemap and health check on answers robots.txt, sitemap.xml and up as the engine, any other name by the route | ok |
| request/a_post_that_fails | ok | |
| request/a_redirect_carries_a_list_as_the_query_writes_it | The values padRedirect and {redirect} carry go into the query as padUrl writes them - a list as ids[0]=1&ids[1]=2, a NULL left out, a name with & encoded | ok |
| request/a_redirect_to_a_name_with_a_line_break_encodes_it | A line break in the page name padRedirect is handed from the request percent-encoded in a 302 - no header added, no 500 | ok |
| request/a_redirect_whose_target_holds_a_field_sends_the_field_s_text | ok | |
| request/a_request_value_never_decides_what_a_tag_is | Request values named like a constant, a sequence, a _data file, a pipe or PHP function the template writes as a tag or a pipe: each stays what the template wrote, a page variable and a name nothing else claims stay fields | ok |
| request/a_stored_file_larger_than_the_memory_limit_is_sent_whole | padUploadSend streams a stored file of sixteen megabytes whole from a request allowed ten more than it uses - it was read into one string, a 500 past memory_limit | ok |
| request/a_trace_then_an_error | ok | |
| request/an_error_after_a_trace_tag_keeps_its_report | ok | |
| request/an_error_after_the_answer_stays_out_of_it | ok | |
| request/an_exported_page_carries_nothing_only_this_machine_sees | pad export renders on the command line, local to padLocal, for a copy any visitor reads: a page whose own PHP switches the toolbar, live reload and the output check on, with a {debug} box, carries all four to this machine and none into the export | ok |
| request/an_exported_page_fetches_this_site_as_this_machine | A page pad export renders keeps this machine's standing for what it fetches of its own site - only the developer's helpers stay out of the copy | ok |
| request/an_exported_page_fetches_this_site_without_the_developers_view | A page pad export renders fetches a page of its own site whose PHP switches the toolbar, live reload and the output check on, with a {debug} box: none of the four comes back into the copy | ok |
| request/an_identity_cookie_sent_once_is_not_expired | A padReqID and padSesID sent once each are the only copies: a clean-URL request sends no expiring Set-Cookie, only the new padReqID | ok |
| request/an_old_identity_cookie_of_a_directory_below_the_application_is_expired | A padReqID and padSesID kept on a directory below the application are expired there and on each directory between, the session id going on on the application directory | ok |
| request/answered_then_failed | ok | |
| request/at_superglobals | ok | |
| request/auth_intended | A guest sent from a page for the logged-in to the login page, and the login sending them back to the page and values first asked - once | ok |
| request/body | The raw-body fixture bare: an empty php://input | ok |
| request/caught/box | ok | |
| request/club/box | ok | |
| request/contact | ok | |
| request/contact_valid | The demo contact form posted without a mistake: stored, redirected, thanked - the store put back | ok |
| request/cookie | A cookie sent with the request, read from $_COOKIE by the fixture | ok |
| request/crumb | The fixture for request/crumbs, fetched bare: no cookie, nothing promoted | ok |
| request/crumbs | A cookie, a pq-named and an _-named request value sent to the fixture, none of which becomes a variable | ok |
| request/csrf | ok | |
| request/debugged_inner | ok | |
| request/demo_takes_a_list_field_as_no_text | The demo forms take a field posted as a list (name[]=x) as no text - no 500, nothing stored | ok |
| request/editors/box | ok | |
| request/etag_post | ok | |
| request/etag_target | ok | |
| request/every_engine_cookie_of_an_https_site_is_secure | The session, flash and padReqID cookies are Secure on an https site - behind a proxy that ends TLS ($padHostBase https) and under session.cookie_secure too - and plain on plain http | ok |
| request/exported | The fixture for request/an_exported_page_carries_nothing_only_this_machine_sees: the helpers switched on by the page itself, a {debug} box and an image the output check names | ok |
| request/fetchexported | The fixture for request/an_exported_page_fetches_this_site_without_the_developers_view: a page that fetches request/exported and names which of the developer's helpers came back | ok |
| request/fetching | The fixture for request/an_exported_page_fetches_this_site_as_this_machine: a page that fetches request/standing and shows its answer | ok |
| request/fetching_debugged_inner_at_mapped | ok | |
| request/fetching_debugged_inner_at_zero | ok | |
| request/fetching_debugged_inner_by_another_name | ok | |
| request/field_superglobals | ok | |
| request/field_superglobals_sent | ok | |
| request/flash | ok | |
| request/flash_typed | ok | |
| request/flashed | ok | |
| request/flashtyped | ok | |
| request/form_rules | The form rules fixture bare: an empty form, not processed | ok |
| request/form_rules_on_names_php_rewrites | ok | |
| request/form_rules_on_names_php_rewrites_post | ok | |
| request/form_rules_one_value | ok | |
| request/form_rules_one_value_post | ok | |
| request/form_rules_post | Rules on the fields of the template, checked before the page-s PHP: a post that breaks them comes back refilled with its messages and is not padPosted, an unrendered field is checked too, the page-s own padValidate adds to them | ok |
| request/form_rules_unnamed_posted | ok | |
| request/getting_debugged_inner | ok | |
| request/gone | The fixture for request/statuses: a page that answers 410 itself | ok |
| request/guard | ok | |
| request/guarded/inside | ok | |
| request/guardpage | ok | |
| request/guestbook | ok | |
| request/headers | ok | |
| request/hostfetch | ok | |
| request/hostheader | ok | |
| request/hosttarget | ok | |
| request/jar | The cookie fixture bare: an empty jar | ok |
| request/json_feed | The fixture of request/a_json_body_address_is_refused, fetched bare: no address, nothing fetched | ok |
| request/live_answer | ok | |
| request/live_csrf | ok | |
| request/live_names_are_texts | ok | |
| request/live_names_are_texts_post | ok | |
| request/livebar | ok | |
| request/livecsrf | ok | |
| request/members/box | ok | |
| request/nocurl_echo | ok | |
| request/nonced | ok | |
| request/post | A real POST through padCurl - the fields travel in the body and arrive as page globals | ok |
| request/rawbody | A request body that is no form, posted as text/plain and read back through php://input | ok |
| request/redirect | A redirecting page, seen unfollowed - status and destination - and followed to where it lands | ok |
| request/redirect_absolute | ok | |
| request/redirect_fragment | ok | |
| request/redirect_hash | ok | |
| request/redirect_page_fragment | ok | |
| request/redirect_query | ok | |
| request/reference_names | ok | |
| request/remember_keeps_the_form_token | ok | |
| request/remember_keeps_the_session_of_a_logged_in_visitor | ok | |
| request/rememberform | ok | |
| request/rescued/box | ok | |
| request/reserved | ok | |
| request/router | ok | |
| request/router_dir/index | ok | |
| request/router_html | ok | |
| request/sent | The fixture of upload_send bare: the stored text, shown | ok |
| request/ses | The session fixture bare: some id, pinned by shape | ok |
| request/session | A page fetching another shares its session - the fixture answers with this very request-s id | ok |
| request/session_id_with_a_trailing_newline | ok | |
| request/standing | The fixture for request/fetching: whom this machine took the request for | ok |
| request/stats | ok | |
| request/statuses | A missing page answers 404, and a status the page sets with http_response_code() stands | ok |
| request/tagnames | The fixture for request/a_request_value_never_decides_what_a_tag_is, fetched bare: what the template means by each name | ok |
| request/the_error_page_shows_no_posted_password | ok | |
| request/the_identity_cookies_are_kept_on_the_application_directory | padSesID and padReqID on the directory of the entry point, from a clean URL below it as from ?page - not one pair per directory of the address | ok |
| request/todo | A whole action round-trip: post a marker through todoPost, see it land, restore the store | ok |
| request/todo_acts_on_a_post_only | A GET of todoPost, which carries no CSRF token, adds no task | ok |
| request/up | The upload fixture bare: no file | ok |
| request/upload | A multipart upload: the payload arrives with its name, size and PHP-s word that it was uploaded | ok |
| request/upload_refuses_a_list_of_files | ok | |
| request/upload_send | padUploadSend answering a stored file: text shown, the same as a download when asked, HTML always downloaded, a path out of DATA 404 | ok |
| request/upload_take | ok | |
| request/uploads | ok | |
| request/vars | The intake fixture bare: no request vars, so the defaults show | ok |
| routes/ajax_script | ok | |
| routes/ajax_segment | ok | |
| routes/back/[name] | ok | |
| routes/blog/[year]/[slug] | ok | |
| routes/docs/[path+] | ok | |
| routes/embed | ok | |
| routes/get_segment | ok | |
| routes/paths | ok | |
| routes/products/[id] | ok | |
| routes/products/index | ok | |
| routes/products/new | ok | |
| routes/query_dots | ok | |
| routes/redirect_back | ok | |
| routes/search | ok | |
| routes/search_refill | ok | |
| routes/two_ajax_of_one_page_fill_their_own_divs_and_carry_the_nonce | ok | |
| sample/capture | ok | |
| sample/capture_rows | A capture keeps what the page returned as @return | ok |
| sample/missing | ok | |
| sample/orders | ok | |
| sample/plain | ok | |
| sample/remote | ok | |
| sample/rows | ok | |
| sample/use | ok | |
| sample/use_rows | The designer preview gives a page that returns its rows the @return of its sample | ok |
| select/demo/a_bound_array_is_a_list | An array bound into where= as $name is a list of literals, as in a bare db() placeholder | ok |
| select/demo/a_huge_page_number_is_a_page_past_the_last | ok | |
| select/demo/a_joined_fields_is_no_literal | fields= must be one quoted literal: an expression that starts with one and joins a variable is refused | ok |
| select/demo/a_joined_where_is_no_literal | where= must be one quoted literal: a condition joined from a variable is refused | ok |
| select/demo/a_nested_view_follows_its_base_relation | ok | |
| select/demo/a_pager_counts_a_select_with_a_join | ok | |
| select/demo/a_pager_counts_the_rows_its_fields_make | ok | |
| select/demo/a_view_of_a_view_reaches_the_table_at_the_end | ok | |
| select/demo/bound | A value bound into where= as $name - a quote stays inside the literal, a comma matches - and a column list bound into order= | ok |
| select/demo/fields_is_written_in_the_template | fields= is SQL the template writes, like where=: a column list from a variable is refused | ok |
| select/demo/join | The select subsystem walking a declared relation - a join written as nesting | ok |
| select/demo/numeric_text | A $name holding numeric text is text in where= on MySQL, so name = $zero with 0 matches no name | ok |
| select/demo/options | Every option a declared table takes on the tag - where, order, fields, group, having, rollup, distinctrow, db and union - one labelled line each over the staff table | ok |
| select/demo/pager | ok | |
| select/demo/pager_rows | ok | |
| select/demo/paging | ok | |
| select/demo/sqlite_key_and_relation_match_an_untyped_column | ok | |
| select/demo/type_is_a_known_word | type= is the statement command word, so a value that tries to be a whole query is refused instead of spliced in | ok |
| select/demo/union | A select table declared over a union of several tables | ok |
| select/demo/values | ok | |
| select/demo/where_comment | A comment with an apostrophe in where= does not stop the $name after it from binding | ok |
| select/support/json | A note rather than a test - see _cases/README.md. It does exercise htmlAttrJson | ok |
| select/support/prefix | The select: prefix spelling of a declared table, which also says the word the reference matcher looks for | ok |
| select/support/relation_key | ok | |
| select/support/test | A select table with a relation, read by id | ok |
| select/support/topic | A content store merged into a select result through @content@ | ok |
| shown/frames | An @page@ inside an {ignore} of a wrapper is text it shows - one beside the real marker, and one in a wrapper that has no other | ok |
| shown/only/inner | ok | |
| shown/two/inner | ok | |
| sitemap/a_page_beside_a_directory_of_its_name_leaves_the_index_its_full_address | A page docs beside a directory docs/ with an index: {sitemap} lists the page at ?docs and the index at ?docs/index, where the router sends it - not both at ?docs | ok |
| sitemap/guarded | ok | |
| sitemap/list | ok | |
| sitemap/off | ok | |
| sitemap/same/docs | ok | |
| sitemap/same/docs/index | ok | |
| sitemap/site/a | ok | |
| sitemap/site/index | ok | |
| sitemap/site/locked/c | ok | |
| sitemap/site/sub/b | ok | |
| sse/browser_every | padSse in the browser (padWasm): the every form is one round - the producer called once, the retry the interval | ok |
| sse/browser_loop | padSse in the browser: the loop form ends at the first event a tenth of a second after the start, the burst before it sent whole | ok |
| sse/browser_stop | padSse in the browser: a producer answering FALSE with nothing sent is answered 204, which stops EventSource | ok |
| sse/every | padSse calling the producer on an interval - an array sent as the named event, NULL sending nothing, FALSE ending the stream | ok |
| sse/headers | A stream as the browser gets it: text/event-stream, no-cache, no proxy buffering, and the last id back as a header or query value with its line break taken out | ok |
| sse/lastid | The fixture for sse/headers: the producer echoes the id the browser came back with | ok |
| sse/limit | ok | |
| sse/ticks | padSse with a producer that sends its own events - the retry first, a named event with an id and JSON, text over two lines, a plain message | ok |
| stacks/framed | ok | |
| stacks/page | ok | |
| start/code/increment/base | Nine nested {code} passes, each one incrementting the variable | ok |
| start/code/increment/clean | Nine nested {code} passes, each one incrementting the variable, with clean | ok |
| start/code/increment/reset | Nine nested {code} passes, each one incrementting the variable, with reset | ok |
| start/code/increment/sandbox | Nine nested {code} passes, each one incrementting the variable, with sandbox | ok |
| start/code/index | The eight {code} variants side by side | ok |
| start/code/set/base | Nine nested {code} passes, each one setting the variable | ok |
| start/code/set/clean | Nine nested {code} passes, each one setting the variable, with clean | ok |
| start/code/set/reset | Nine nested {code} passes, each one setting the variable, with reset | ok |
| start/code/set/sandbox | Nine nested {code} passes, each one setting the variable, with sandbox | ok |
| start/combi/index | The three combi chains together | ok |
| start/combi1/index | A {page} chain mixing the options rather than using one throughout | ok |
| start/combi2/index | Another mixture of them | ok |
| start/combi3/index | A third mixture | ok |
| start/index | Everything under start/ at once - the code, page and combi chains, nested and hello | ok |
| start/page/1/index | Nine nested {page} calls setting a variable - with no option it leaks outward | ok |
| start/page/2/index | The same chain with sandbox, so each pass has its own scope and the value unwinds | ok |
| start/page/3/index | The same chain with reset | ok |
| start/page/4/index | The same chain with clean | ok |
| start/page/5/index | The same chain incrementing rather than setting, with no option | ok |
| start/page/6/index | Incrementing with sandbox | ok |
| start/page/7/index | Incrementing with reset | ok |
| start/page/8/index | Incrementing with clean | ok |
| start/page/index | The eight {page} chains side by side, which is what makes their differences readable | ok |
| tags/code | ok | |
| tags/curl_post_target | ok | |
| tags/curl_posts_its_post_option | ok | |
| tags/markdown | ok | |
| tags/script | The script: prefix running a shell, python, perl and php script from _scripts/ | ok |
| tags/tilde | ok | |
| vars/at/1 | The @ reference over a flat global and a nested one, by name and by wildcard | ok |
| vars/at/2 | The same references where the value is buried five levels deep | ok |
| vars/at/7 | The @ reference walking an XML file, with optional hiding what is not there | ok |
| vars/at/8 | A dotted path with a condition at each step, into a data file | ok |
| vars/at/9 | The @ reference as a tag pair and through the {at} tag, over the same data | ok |
| vars/at/random | The wildcard forms of a dotted reference, each drawn fresh, asserted by shape | ok |