How Monokulo is tested
Monokulo handles other people’s money, so it gets tested hard. Every change runs more than 2,600 automatic tests. Every night, two kinds of robot tester invent thousands of strange situations and check that no payment goes missing. This page rebuilds itself from those runs. Open any section to see the details.
All checks passed·Tests and coverage from
6b1dcda on 16 Oct 2026·Nightly properties 17 Oct 2026·Fuzzing 16 Oct 2026·Live network 16 Oct 2026Tests2,6072,607 passed · 0 skipped
Engine and server90.6%of 87,305 Rust lines
Checkout and POS95.0%of 1,655 browser lines
WooCommerce95.6%of 502 PHP lines
Properties nightly211plus 9 fuzz targets · 26 live daily
All tests
Every test, sorted by area and then by the file it lives in. A tick means it passed on the last run; the time is how long it took.
Search
Suite
Area
Area and groupTestsTime
Payment detection 41 groups6991.9 h
engine::daemon_fallback21236 ms
- ✓A block request gives each node the time its link needsdaemon_fallback::tests::a_block_request_gives_each_node_the_time_its_link_needs16 ms
- ✓A down primary fails over to the fallback within the same calldaemon_fallback::tests::a_down_primary_fails_over_to_the_fallback_within_the_same_call11 ms
- ✓A failed node cools down for longer each time and recoversdaemon_fallback::tests::a_failed_node_cools_down_for_longer_each_time_and_recovers13 ms
- ✓A hanging node gets only its share of the call deadlinedaemon_fallback::tests::a_hanging_node_gets_only_its_share_of_the_call_deadline9 ms
- ✓A healthy primary is always used and the fallback is never calleddaemon_fallback::tests::a_healthy_primary_is_always_used_and_the_fallback_is_never_called13 ms
- ✓A node in cooldown is skipped and the primary is back first after itdaemon_fallback::tests::a_node_in_cooldown_is_skipped_and_the_primary_is_back_first_after_it10 ms
- ✓A pinned tick uses one node and a failure moves the next tick ondaemon_fallback::tests::a_pinned_tick_uses_one_node_and_a_failure_moves_the_next_tick_on11 ms
- ✓A single configured node is trusted as is with nothing to corroborate againstdaemon_fallback::tests::a_single_configured_node_is_trusted_as_is_with_nothing_to_corroborate_against10 ms
- ✓A single configured node with no fallbacks behaves like a bare clientdaemon_fallback::tests::a_single_configured_node_with_no_fallbacks_behaves_like_a_bare_client11 ms
- ✓A transaction is nowhere only when every reachable node says sodaemon_fallback::tests::a_transaction_is_nowhere_only_when_every_reachable_node_says_so10 ms
- ✓An excluded node is never pinned or trieddaemon_fallback::tests::an_excluded_node_is_never_pinned_or_tried10 ms
- ✓Disagreement between nodes refuses to affirm a double spenddaemon_fallback::tests::disagreement_between_nodes_refuses_to_affirm_a_double_spend11 ms
- ✓Each key image is corroborated independently of the othersdaemon_fallback::tests::each_key_image_is_corroborated_independently_of_the_others10 ms
- ✓Every node failing returns the last node s error rather than panickingdaemon_fallback::tests::every_node_failing_returns_the_last_node_s_error_rather_than_panicking10 ms
- ✓Every node unreachable is an error not a silent unspentdaemon_fallback::tests::every_node_unreachable_is_an_error_not_a_silent_unspent12 ms
- ✓Once failed over the client becomes sticky to the working nodedaemon_fallback::tests::once_failed_over_the_client_becomes_sticky_to_the_working_node10 ms
- ✓Only one node reachable this call is also trusted as isdaemon_fallback::tests::only_one_node_reachable_this_call_is_also_trusted_as_is11 ms
- ✓Pool and unspent disagreement is also inconclusivedaemon_fallback::tests::pool_and_unspent_disagreement_is_also_inconclusive12 ms
- ✓Recovery of an earlier node is picked back up once the current one failsdaemon_fallback::tests::recovery_of_an_earlier_node_is_picked_back_up_once_the_current_one_fails12 ms
- ✓Unanimous agreement on unspent is reported as isdaemon_fallback::tests::unanimous_agreement_on_unspent_is_reported_as_is13 ms
- ✓Unanimous spent in blockchain across every node is affirmeddaemon_fallback::tests::unanimous_spent_in_blockchain_across_every_node_is_affirmed11 ms
engine::daemon_rpc783 ms
- ✓A get blocks bin entry carries its own block identitydaemon_rpc::tests::a_get_blocks_bin_entry_carries_its_own_block_identity11 ms
- ✓An in pool entry with no block height key at all deserializes as nonedaemon_rpc::tests::an_in_pool_entry_with_no_block_height_key_at_all_deserializes_as_none11 ms
- ✓Get height response parses and the block count to tip height adjustment holdsdaemon_rpc::tests::get_height_response_parses_and_the_block_count_to_tip_height_adjustment_holds10 ms
- ✓Get info says which network a node is ondaemon_rpc::tests::get_info_says_which_network_a_node_is_on11 ms
- ✓Only an affirmative miss locates a transaction as not founddaemon_rpc::tests::only_an_affirmative_miss_locates_a_transaction_as_not_found14 ms
- ✓Optional fields a real node may omit still parsedaemon_rpc::tests::optional_fields_a_real_node_may_omit_still_parse13 ms
- ✓Spent status accepts the real signed int type and an absent keydaemon_rpc::tests::spent_status_accepts_the_real_signed_int_type_and_an_absent_key13 ms
engine::daemon_rpc::live_node_tests138 ms
- ✓A response larger than the cap is refused as a node errordaemon_rpc::live_node_tests::a_response_larger_than_the_cap_is_refused_as_a_node_error38 ms
engine::daemon_rpc::wire_tests25917 ms
- ✓A blocks pruned transactions are checked against its own listdaemon_rpc::wire_tests::a_blocks_pruned_transactions_are_checked_against_its_own_list12 ms
- ✓A block answer is capped by what was asked fordaemon_rpc::wire_tests::a_block_answer_is_capped_by_what_was_asked_for34 ms
- ✓A followed pool is reused briefly and corrected by the plain listdaemon_rpc::wire_tests::a_followed_pool_is_reused_briefly_and_corrected_by_the_plain_list23 ms
- ✓A large blocks outline is read from its own blobdaemon_rpc::wire_tests::a_large_blocks_outline_is_read_from_its_own_blob28 ms
- ✓A node that cannot say pool changes is asked for the listdaemon_rpc::wire_tests::a_node_that_cannot_say_pool_changes_is_asked_for_the_list47 ms
- ✓A node that cannot answer for tip and pool together is asked apartdaemon_rpc::wire_tests::a_node_that_cannot_answer_for_tip_and_pool_together_is_asked_apart80 ms
- ✓A node that stops saying pool changes fails the poll before it is given up ondaemon_rpc::wire_tests::a_node_that_stops_saying_pool_changes_fails_the_poll_before_it_is_given_up_on25 ms
- ✓A pool that cannot be read is an errordaemon_rpc::wire_tests::a_pool_that_cannot_be_read_is_an_error23 ms
- ✓A small answer measures the round tripdaemon_rpc::wire_tests::a_small_answer_measures_the_round_trip21 ms
- ✓A tip and a pool asked for together fail apartdaemon_rpc::wire_tests::a_tip_and_a_pool_asked_for_together_fail_apart36 ms
- ✓A transaction blob is checked against the id it came underdaemon_rpc::wire_tests::a_transaction_blob_is_checked_against_the_id_it_came_under13 ms
- ✓An announced pool change is asked about within the reuse windowdaemon_rpc::wire_tests::an_announced_pool_change_is_asked_about_within_the_reuse_window23 ms
- ✓An answer over the cap asks for lessdaemon_rpc::wire_tests::an_answer_over_the_cap_asks_for_less21 ms
- ✓Blobs and difficulty headers are read as monerod sends themdaemon_rpc::wire_tests::blobs_and_difficulty_headers_are_read_as_monerod_sends_them31 ms
- ✓Headers and hashes are asked for as just thatdaemon_rpc::wire_tests::headers_and_hashes_are_asked_for_as_just_that28 ms
- ✓Pool answers parse in every shape a node sendsdaemon_rpc::wire_tests::pool_answers_parse_in_every_shape_a_node_sends10 ms
- ✓Several transactions are located in one requestdaemon_rpc::wire_tests::several_transactions_are_located_in_one_request26 ms
- ✓A request that runs out of time says so and slows the estimatedaemon_rpc::wire_tests::a_request_that_runs_out_of_time_says_so_and_slows_the_estimate223 ms
- ✓The blocks request is the recorded onedaemon_rpc::wire_tests::the_blocks_request_is_the_recorded_one10 ms
- ✓The pool is followed by its changesdaemon_rpc::wire_tests::the_pool_is_followed_by_its_changes25 ms
- ✓The pool outlook reads the node s info and pool statsdaemon_rpc::wire_tests::the_pool_outlook_reads_the_node_s_info_and_pool_stats33 ms
- ✓The pool view applies changes and correctionsdaemon_rpc::wire_tests::the_pool_view_applies_changes_and_corrections13 ms
- ✓The tip and the pool are one request while the chain has not moveddaemon_rpc::wire_tests::the_tip_and_the_pool_are_one_request_while_the_chain_has_not_moved29 ms
- ✓The tip comes with its id when the node gives onedaemon_rpc::wire_tests::the_tip_comes_with_its_id_when_the_node_gives_one41 ms
- ✓Transactions are fetched pruned under their idsdaemon_rpc::wire_tests::transactions_are_fetched_pruned_under_their_ids62 ms
engine::daemon_rpc_replay298 ms
- ✓Scanner node client reads blocks transactions and key images from a recorded stagenet nodescanner_node_client_reads_blocks_transactions_and_key_images_from_a_recorded_stagenet_node66 ms
- ✓Scanner node client reports a node that does not answer as it expectsscanner_node_client_reports_a_node_that_does_not_answer_as_it_expects32 ms
engine::exploration::properties16376 ms
- ✓Application input boundaries handle arbitrary bytesexploration::properties::application_input_boundaries_handle_arbitrary_bytes44 ms
- ✓Cpu ranges match an independent set modelexploration::properties::cpu_ranges_match_an_independent_set_model58 ms
- ✓Event byte histories preserve scheduler invariantsexploration::properties::event_byte_histories_preserve_scheduler_invariants24 ms
- ✓Hostile cpu range lengths are rejected before allocationexploration::properties::hostile_cpu_range_lengths_are_rejected_before_allocation11 ms
- ✓Maximum cpu range is rejected without expansionexploration::properties::maximum_cpu_range_is_rejected_without_expansion11 ms
- ✓Queue byte histories preserve dispatch and drain contractsexploration::properties::queue_byte_histories_preserve_dispatch_and_drain_contracts37 ms
- ✓Sizing and retry boundaries handle all float bit patternsexploration::properties::sizing_and_retry_boundaries_handle_all_float_bit_patterns11 ms
- ✓Special float patterns are always exercisedexploration::properties::special_float_patterns_are_always_exercised10 ms
- ✓Application input boundaries handle arbitrary bytes 512 casesexploration::properties::application_input_boundaries_handle_arbitrary_bytes53 ms
- ✓Cpu ranges match an independent set model 512 casesexploration::properties::cpu_ranges_match_an_independent_set_model45 ms
- ✓Event byte histories preserve scheduler invariants 512 casesexploration::properties::event_byte_histories_preserve_scheduler_invariants20 ms
- ✓Hostile cpu range lengths are rejected before allocation 512 casesexploration::properties::hostile_cpu_range_lengths_are_rejected_before_allocation6 ms
- ✓Maximum cpu range is rejected without expansion 512 casesexploration::properties::maximum_cpu_range_is_rejected_without_expansion5 ms
- ✓Queue byte histories preserve dispatch and drain contracts 512 casesexploration::properties::queue_byte_histories_preserve_dispatch_and_drain_contracts27 ms
- ✓Sizing and retry boundaries handle all float bit patterns 512 casesexploration::properties::sizing_and_retry_boundaries_handle_all_float_bit_patterns7 ms
- ✓Special float patterns are always exercised 512 casesexploration::properties::special_float_patterns_are_always_exercised7 ms
engine::loops37.1 s
- ✓The node s announcements cut the wait between polls shortloops::tests::the_node_s_announcements_cut_the_wait_between_polls_short358 ms
- ✓Saving a node starts its networks loops and clearing it stops themloops::tests::saving_a_node_starts_its_networks_loops_and_clearing_it_stops_them1.6 s
- ✓A store whose backend was replaced is registered again within secondsloops::tests::a_store_whose_backend_was_replaced_is_registered_again_within_seconds5.1 s
engine::loops::properties86.2 s
- ✓Dropping a manager generation stops its childrenloops::properties::dropping_a_manager_generation_stops_its_children15 ms
- ✓Generations stop before replacement and recover from panicsloops::properties::generations_stop_before_replacement_and_recover_from_panics93 ms
- ✓Stopping during factory or loop restart backoff is immediateloops::properties::stopping_during_factory_or_loop_restart_backoff_is_immediate31 ms
- ✓Real network manager follows generated node configurationloops::properties::real_network_manager_follows_generated_node_configuration1.2 s
- ✓Dropping a manager generation stops its children 512 casesloops::properties::dropping_a_manager_generation_stops_its_children22 ms
- ✓Generations stop before replacement and recover from panics 512 casesloops::properties::generations_stop_before_replacement_and_recover_from_panics174 ms
- ✓Stopping during factory or loop restart backoff is immediate 512 casesloops::properties::stopping_during_factory_or_loop_restart_backoff_is_immediate68 ms
- ✓Real network manager follows generated node configuration 512 casesloops::properties::real_network_manager_follows_generated_node_configuration4.6 s
engine::node_events770 ms
- ✓A publisher still configured keeps its figures and one removed goesnode_events::tests::a_publisher_still_configured_keeps_its_figures_and_one_removed_goes9 ms
- ✓A wait runs its interval when nothing is announcednode_events::tests::a_wait_runs_its_interval_when_nothing_is_announced10 ms
- ✓An announcement during a pass is kept for the wait after itnode_events::tests::an_announcement_during_a_pass_is_kept_for_the_wait_after_it8 ms
- ✓An announcement ends the wait after the minimum gapnode_events::tests::an_announcement_ends_the_wait_after_the_minimum_gap11 ms
- ✓An interval shorter than the gap is keptnode_events::tests::an_interval_shorter_than_the_gap_is_kept11 ms
- ✓Only waits cut short are counted and only reported with a publishernode_events::tests::only_waits_cut_short_are_counted_and_only_reported_with_a_publisher11 ms
- ✓Pool and chain announcements wake only their own waitnode_events::tests::pool_and_chain_announcements_wake_only_their_own_wait10 ms
engine::node_events::properties121 min
- ✓Arbitrary topics match exact prefixesnode_events::properties::arbitrary_topics_match_exact_prefixes16 ms
- ✓Notification histories match pending permitsnode_events::properties::notification_histories_match_pending_permits18 ms
- ✓Reviewed notification histories replaynode_events::properties::reviewed_notification_histories_replay9 ms
- ✓Stale generation announcements do not wake replacementsnode_events::properties::stale_generation_announcements_do_not_wake_replacements13 ms
- ✓All polling recovery modes runnode_events::properties::all_polling_recovery_modes_run669 ms
- ✓Actual mempool loop detects payments despite missing wrong or burst notificationsnode_events::properties::actual_mempool_loop_detects_payments_despite_missing_wrong_or_burst_notifications9.8 s
- ✓All polling recovery modes run 512 casesnode_events::properties::all_polling_recovery_modes_run640 ms
- ✓Arbitrary topics match exact prefixes 512 casesnode_events::properties::arbitrary_topics_match_exact_prefixes23 ms
- ✓Notification histories match pending permits 512 casesnode_events::properties::notification_histories_match_pending_permits82 ms
- ✓Reviewed notification histories replay 512 casesnode_events::properties::reviewed_notification_histories_replay8 ms
- ✓Stale generation announcements do not wake replacements 512 casesnode_events::properties::stale_generation_announcements_do_not_wake_replacements26 ms
- ✓Actual mempool loop detects payments despite missing wrong or burst notifications 512 casesnode_events::properties::actual_mempool_loop_detects_payments_despite_missing_wrong_or_burst_notifications1 min
engine::node_events::properties::zmq427.0 s
- ✓Publisher switch disable reenable and duplicate endpointsnode_events::properties::zmq::publisher_switch_disable_reenable_and_duplicate_endpoints107 ms
- ✓Real subscriber recovers and tracks generated publisher configurationnode_events::properties::zmq::real_subscriber_recovers_and_tracks_generated_publisher_configuration3.4 s
- ✓Publisher switch disable reenable and duplicate endpoints 512 casesnode_events::properties::zmq::publisher_switch_disable_reenable_and_duplicate_endpoints86 ms
- ✓Real subscriber recovers and tracks generated publisher configuration 512 casesnode_events::properties::zmq::real_subscriber_recovers_and_tracks_generated_publisher_configuration23.4 s
engine::node_events::zmq3207 ms
- ✓A publisher s announcements wake the loopsnode_events::tests::zmq::a_publisher_s_announcements_wake_the_loops96 ms
- ✓Only the two topics are announcementsnode_events::tests::zmq::only_the_two_topics_are_announcements8 ms
- ✓The subscriber listens where the node settings saynode_events::tests::zmq::the_subscriber_listens_where_the_node_settings_say103 ms
engine::pow101.8 s
- ✓A hash meets a difficulty when their product fits in 256 bitspow::tests::a_hash_meets_a_difficulty_when_their_product_fits_in_256_bits9 ms
- ✓Difficulty edgespow::tests::difficulty_edges10 ms
- ✓A real block sent for another height or garbled is refusedpow::tests::a_real_block_sent_for_another_height_or_garbled_is_refused23 ms
- ✓Randomx starts at hard fork 12 on each networkpow::tests::randomx_starts_at_hard_fork_12_on_each_network11 ms
- ✓Real blocks difficulty is computed as monerod doespow::tests::real_blocks_difficulty_is_computed_as_monerod_does21 ms
- ✓Seed heights change 64 blocks after each 2048thpow::tests::seed_heights_change_64_blocks_after_each_2048th11 ms
- ✓The header rules each refusepow::tests::the_header_rules_each_refuse22 ms
- ✓The median of an even count is the mean of the middle twopow::tests::the_median_of_an_even_count_is_the_mean_of_the_middle_two11 ms
- ✓The window keeps the newest 735 and needs 60 for a medianpow::tests::the_window_keeps_the_newest_735_and_needs_60_for_a_median11 ms
- ✓Real blocks prove across a key change and any change failspow::tests::real_blocks_prove_across_a_key_change_and_any_change_fails1.7 s
engine::pow::hasher21.7 s
- ✓Hashes randomx s reference vectorpow::hasher::tests::hashes_randomx_s_reference_vector409 ms
- ✓At most two keys are heldpow::hasher::tests::at_most_two_keys_are_held1.3 s
engine::proof2141.8 s
- ✓A block below the difficulty floor is caughtproof::tests::a_block_below_the_difficulty_floor_is_caught1.5 s
- ✓A block from the future waits for the clock and one before the median is caughtproof::tests::a_block_from_the_future_waits_for_the_clock_and_one_before_the_median_is_caught1.6 s
- ✓A caught node stays out for a whileproof::tests::a_caught_node_stays_out_for_a_while1.6 s
- ✓A failed anchor is not retried at onceproof::tests::a_failed_anchor_is_not_retried_at_once1.7 s
- ✓A heavier valid branch replaces the proven chain and a lighter one does notproof::tests::a_heavier_valid_branch_replaces_the_proven_chain_and_a_lighter_one_does_not2.1 s
- ✓A long catch up is spread over rounds and kept as it goesproof::tests::a_long_catch_up_is_spread_over_rounds_and_kept_as_it_goes2.4 s
- ✓A lying primary among three is caught and excludedproof::tests::a_lying_primary_among_three_is_caught_and_excluded2.5 s
- ✓A node contradicting itself is caughtproof::tests::a_node_contradicting_itself_is_caught1.6 s
- ✓A made up block is caught and never provenproof::tests::a_made_up_block_is_caught_and_never_proven2.4 s
- ✓A node far behind is not held againstproof::tests::a_node_far_behind_is_not_held_against1.7 s
- ✓A tuning checking cannot run with is refusedproof::tests::a_tuning_checking_cannot_run_with_is_refused14 ms
- ✓A restart resumes from the proven chain without anchoring againproof::tests::a_restart_resumes_from_the_proven_chain_without_anchoring_again1.8 s
- ✓An anchor below the floor or with a failing proof is refusedproof::tests::an_anchor_below_the_floor_or_with_a_failing_proof_is_refused2.2 s
- ✓An anchor needs a majority of the configured nodesproof::tests::an_anchor_needs_a_majority_of_the_configured_nodes2.6 s
- ✓A reorg deeper than can be followed holds settlementproof::tests::a_reorg_deeper_than_can_be_followed_holds_settlement3.7 s
- ✓An equally heavy branch does not replace the one seen firstproof::tests::an_equally_heavy_branch_does_not_replace_the_one_seen_first1.7 s
- ✓An honest chain is anchored and followed across a key changeproof::tests::an_honest_chain_is_anchored_and_followed_across_a_key_change1.9 s
- ✓An unreachable node is reported and nothing held against itproof::tests::an_unreachable_node_is_reported_and_nothing_held_against_it1.6 s
- ✓Blocks the proven chain has are passed over unhashedproof::tests::blocks_the_proven_chain_has_are_passed_over_unhashed1.7 s
- ✓Turning checking off forgets it and lets every node backproof::tests::turning_checking_off_forgets_it_and_lets_every_node_back1.6 s
- ✓The proven chain is pruned to what reorgs and rules needproof::tests::the_proven_chain_is_pruned_to_what_reorgs_and_rules_need4.0 s
engine::proof::properties1232 min
- ✓A member failing to send sampled blocks does not block a healthy anchor majorityproof::tests::properties::a_member_failing_to_send_sampled_blocks_does_not_block_a_healthy_anchor_majority2.2 s
- ✓Malformed or wrong block samples cannot block a healthy anchor majorityproof::tests::properties::malformed_or_wrong_block_samples_cannot_block_a_healthy_anchor_majority8.6 s
- ✓Anchoring requires a configured majority even when only one node answersproof::tests::properties::anchoring_requires_a_configured_majority_even_when_only_one_node_answers8.9 s
- ✓Verifier histories never prove forged branches and recover from total outageproof::tests::properties::verifier_histories_never_prove_forged_branches_and_recover_from_total_outage12.7 s
- ✓Verifier histories with restarts never prove forged branches and recover from total outageproof::tests::properties::verifier_histories_with_restarts_never_prove_forged_branches_and_recover_from_total_outage12.7 s
- ✓Verifier rpc timeouts during anchor reads and samples use healthy peersproof::tests::properties::verifier_rpc_timeouts_during_anchor_reads_and_samples_use_healthy_peers9.7 s
- ✓A member failing to send sampled blocks does not block a healthy anchor majority 512 casesproof::tests::properties::a_member_failing_to_send_sampled_blocks_does_not_block_a_healthy_anchor_majority2.1 s
- ✓Malformed or wrong block samples cannot block a healthy anchor majority 512 casesproof::tests::properties::malformed_or_wrong_block_samples_cannot_block_a_healthy_anchor_majority4 min
- ✓Anchoring requires a configured majority even when only one node answers 512 casesproof::tests::properties::anchoring_requires_a_configured_majority_even_when_only_one_node_answers4 min
- ✓Verifier rpc timeouts during anchor reads and samples use healthy peers 512 casesproof::tests::properties::verifier_rpc_timeouts_during_anchor_reads_and_samples_use_healthy_peers4 min
- ✓Verifier histories never prove forged branches and recover from total outage 512 casesproof::tests::properties::verifier_histories_never_prove_forged_branches_and_recover_from_total_outage10 min
- ✓Verifier histories with restarts never prove forged branches and recover from total outage 512 casesproof::tests::properties::verifier_histories_with_restarts_never_prove_forged_branches_and_recover_from_total_outage10 min
engine::proof::settlement415.2 s
- ✓A lying primary is excluded and its payment reorganised awayproof::tests::settlement::a_lying_primary_is_excluded_and_its_payment_reorganised_away3.2 s
- ✓An order is paid once its confirmations are provenproof::tests::settlement::an_order_is_paid_once_its_confirmations_are_proven2.3 s
- ✓An order paid in made up blocks is never paidproof::tests::settlement::an_order_paid_in_made_up_blocks_is_never_paid2.4 s
- ✓A payment deep in a made up chain never settlesproof::tests::settlement::a_payment_deep_in_a_made_up_chain_never_settles7.3 s
engine::scaling767 ms
- ✓A block is timed from its start to its commit across roundsscaling::tests::a_block_is_timed_from_its_start_to_its_commit_across_rounds10 ms
- ✓Block sizes rising and falling are namedscaling::tests::block_sizes_rising_and_falling_are_named9 ms
- ✓Discarded bytes are reported for the last ten minutesscaling::tests::discarded_bytes_are_reported_for_the_last_ten_minutes9 ms
- ✓Finishing another block leaves the one in progressscaling::tests::finishing_another_block_leaves_the_one_in_progress9 ms
- ✓Headers come first for an hour after each signscaling::tests::headers_come_first_for_an_hour_after_each_sign10 ms
- ✓The cache peak lasts an hourscaling::tests::the_cache_peak_lasts_an_hour10 ms
- ✓Time is kept for ten minutes and gives the cost of a scanscaling::tests::time_is_kept_for_ten_minutes_and_gives_the_cost_of_a_scan10 ms
engine::scaling::properties12169 ms
- ✓Larger resources and faster links do not reduce request sizescaling::properties::larger_resources_and_faster_links_do_not_reduce_request_size9 ms
- ✓Maximum timeout and wall clock boundaries do not panicscaling::properties::maximum_timeout_and_wall_clock_boundaries_do_not_panic10 ms
- ✓Progress histories survive clock jumps and extreme countersscaling::properties::progress_histories_survive_clock_jumps_and_extreme_counters51 ms
- ✓Request sizes remain bounded across numeric inputsscaling::properties::request_sizes_remain_bounded_across_numeric_inputs8 ms
- ✓Stopped and backwards clocks cannot grow telemetry without boundscaling::properties::stopped_and_backwards_clocks_cannot_grow_telemetry_without_bound7 ms
- ✓Timeout bounds hold for extreme measurementsscaling::properties::timeout_bounds_hold_for_extreme_measurements7 ms
- ✓Larger resources and faster links do not reduce request size 512 casesscaling::properties::larger_resources_and_faster_links_do_not_reduce_request_size8 ms
- ✓Maximum timeout and wall clock boundaries do not panic 512 casesscaling::properties::maximum_timeout_and_wall_clock_boundaries_do_not_panic7 ms
- ✓Progress histories survive clock jumps and extreme counters 512 casesscaling::properties::progress_histories_survive_clock_jumps_and_extreme_counters39 ms
- ✓Request sizes remain bounded across numeric inputs 512 casesscaling::properties::request_sizes_remain_bounded_across_numeric_inputs9 ms
- ✓Stopped and backwards clocks cannot grow telemetry without bound 512 casesscaling::properties::stopped_and_backwards_clocks_cannot_grow_telemetry_without_bound7 ms
- ✓Timeout bounds hold for extreme measurements 512 casesscaling::properties::timeout_bounds_hold_for_extreme_measurements7 ms
engine::scanner14014.0 s
- ✓Every sql failure in reconcile now is recovered fromscanner::tests::every_sql_failure_in_reconcile_now_is_recovered_from1.1 s
- ✓A backend losing its wallets behind a router costs only its storesscanner::tests::a_backend_losing_its_wallets_behind_a_router_costs_only_its_stores53 ms
- ✓A block checkpoint stages matches until commit and a changed hash drops themscanner::tests::a_block_checkpoint_stages_matches_until_commit_and_a_changed_hash_drops_them54 ms
- ✓A block that cannot be read stops the range instead of leaving a gapscanner::tests::a_block_that_cannot_be_read_stops_the_range_instead_of_leaving_a_gap57 ms
- ✓A chain with no blocks at all is a harmless no op tickscanner::tests::a_chain_with_no_blocks_at_all_is_a_harmless_no_op_tick54 ms
- ✓A chunk counts the round trip and the nodes work per blockscanner::tests::a_chunk_counts_the_round_trip_and_the_nodes_work_per_block11 ms
- ✓A chunk stops at what remainsscanner::tests::a_chunk_stops_at_what_remains10 ms
- ✓A coinbase input has no key imagescanner::tests::a_coinbase_input_has_no_key_image11 ms
- ✓A copy vanishing from the pool is not voided as a double spendscanner::tests::a_copy_vanishing_from_the_pool_is_not_voided_as_a_double_spend54 ms
- ✓A daemon far behind the recorded high water mark neither rescans nor discards its windowscanner::tests::a_daemon_far_behind_the_recorded_high_water_mark_neither_rescans_nor_discards_its_window56 ms
- ✓A daemon that omits a transaction from its mempool only delays detectionscanner::tests::a_daemon_that_omits_a_transaction_from_its_mempool_only_delays_detection59 ms
- ✓A disabled tenants orders still expire and it never counts as laggingscanner::tests::a_disabled_tenants_orders_still_expire_and_it_never_counts_as_lagging59 ms
- ✓A divergence at the genesis block has no ancestor to re anchor toscanner::tests::a_divergence_at_the_genesis_block_has_no_ancestor_to_re_anchor_to51 ms
- ✓A double spend mined in a different block than the original voids it oncescanner::tests::a_double_spend_mined_in_a_different_block_than_the_original_voids_it_once57 ms
- ✓A failed fetch halves the next onescanner::tests::a_failed_fetch_halves_the_next_one11 ms
- ✓A failed mempool poll skips the vanished payment sweep rather than assuming an empty poolscanner::tests::a_failed_mempool_poll_skips_the_vanished_payment_sweep_rather_than_assuming_an_empty_pool58 ms
- ✓A failed mempool scan is retried next tickscanner::tests::a_failed_mempool_scan_is_retried_next_tick61 ms
- ✓A failed recheck leaves its payment voided and the next pass retries itscanner::tests::a_failed_recheck_leaves_its_payment_voided_and_the_next_pass_retries_it61 ms
- ✓A failed tenants mempool scans do not consume every tick before blocksscanner::tests::a_failed_tenants_mempool_scans_do_not_consume_every_tick_before_blocks79 ms
- ✓A fallback daemon still voids a real double spend every node agrees onscanner::tests::a_fallback_daemon_still_voids_a_real_double_spend_every_node_agrees_on59 ms
- ✓A fallback daemon that disagrees with the primary prevents the wrongful void a single lying node would causescanner::tests::a_fallback_daemon_that_disagrees_with_the_primary_prevents_the_wrongful_void_a_single_lying_node_would_cause60 ms
- ✓A fresh orders first scanned height is set on its very first tick not backfilled to created atscanner::tests::a_fresh_orders_first_scanned_height_is_set_on_its_very_first_tick_not_backfilled_to_created_at57 ms
- ✓A key image lookup failing mid reconciliation leaves the reorg detectablescanner::tests::a_key_image_lookup_failing_mid_reconciliation_leaves_the_reorg_detectable58 ms
- ✓A lagging tenant whose keys work is still matched in the mempoolscanner::tests::a_lagging_tenant_whose_keys_work_is_still_matched_in_the_mempool66 ms
- ✓A larger average block asks for fewer blocksscanner::tests::a_larger_average_block_asks_for_fewer_blocks11 ms
- ✓A lagging tenants order does not expire until it has caught upscanner::tests::a_lagging_tenants_order_does_not_expire_until_it_has_caught_up69 ms
- ✓A late payment in the grace period is found even if the grace period ends during the gapscanner::tests::a_late_payment_in_the_grace_period_is_found_even_if_the_grace_period_ends_during_the_gap70 ms
- ✓A mempool payment that merely disappears is never voided on that evidence alonescanner::tests::a_mempool_payment_that_merely_disappears_is_never_voided_on_that_evidence_alone65 ms
- ✓A new tenant starts at its networks scanned heightscanner::tests::a_new_tenant_starts_at_its_networks_scanned_height50 ms
- ✓A node failing the fetch of a scan chunk retries the whole chunk next tickscanner::tests::a_node_failing_the_fetch_of_a_scan_chunk_retries_the_whole_chunk_next_tick61 ms
- ✓A node that dies as a block is read has its hash and contents come from the same fallbackscanner::tests::a_node_that_dies_as_a_block_is_read_has_its_hash_and_contents_come_from_the_same_fallback56 ms
- ✓A payment a reorg dropped to the mempool can still be voided when later proven double spentscanner::tests::a_payment_a_reorg_dropped_to_the_mempool_can_still_be_voided_when_later_proven_double_spent59 ms
- ✓A payment arriving after the grace period has elapsed is genuinely not matchedscanner::tests::a_payment_arriving_after_the_grace_period_has_elapsed_is_genuinely_not_matched54 ms
- ✓A payment completing an order in the tick its deadline passes settles rather than expiringscanner::tests::a_payment_completing_an_order_in_the_tick_its_deadline_passes_settles_rather_than_expiring58 ms
- ✓A payment to a recently closed order is seen but one closed before the grace period is left to lookupscanner::tests::a_payment_to_a_recently_closed_order_is_seen_but_one_closed_before_the_grace_period_is_left_to_lookup73 ms
- ✓A pruned transaction scans to the same result as the whole onescanner::tests::a_pruned_transaction_scans_to_the_same_result_as_the_whole_one56 ms
- ✓A recently expired orders late payment is still matched within its grace periodscanner::tests::a_recently_expired_orders_late_payment_is_still_matched_within_its_grace_period57 ms
- ✓A reconciliation that fails partway leaves the reorg still detectablescanner::tests::a_reconciliation_that_fails_partway_leaves_the_reorg_still_detectable56 ms
- ✓A registration that loses the race is removedscanner::tests::a_registration_that_loses_the_race_is_removed51 ms
- ✓A reorg back to the oldest recorded block does not look like a scanner that never ranscanner::tests::a_reorg_back_to_the_oldest_recorded_block_does_not_look_like_a_scanner_that_never_ran60 ms
- ✓A reorg deeper than the window is reported at the window edge and leaves older payments alonescanner::tests::a_reorg_deeper_than_the_window_is_reported_at_the_window_edge_and_leaves_older_payments_alone58 ms
- ✓A reorg driven status change writes an order event just like a forward scan onescanner::tests::a_reorg_driven_status_change_writes_an_order_event_just_like_a_forward_scan_one57 ms
- ✓A reorg rewinds cursors to below the reorg point and the replacement block is scanned for everyonescanner::tests::a_reorg_rewinds_cursors_to_below_the_reorg_point_and_the_replacement_block_is_scanned_for_everyone80 ms
- ✓A reorg is detected at its true fork point at every depth the window coversscanner::tests::a_reorg_is_detected_at_its_true_fork_point_at_every_depth_the_window_covers103 ms
- ✓A reorg whose common ancestor hash cannot be read leaves the scanned window intactscanner::tests::a_reorg_whose_common_ancestor_hash_cannot_be_read_leaves_the_scanned_window_intact63 ms
- ✓A reorg whose fork is below every recorded block rewinds to that oldest blockscanner::tests::a_reorg_whose_fork_is_below_every_recorded_block_rewinds_to_that_oldest_block61 ms
- ✓A run of transactions is scanned for each store from where it had got toscanner::tests::a_run_of_transactions_is_scanned_for_each_store_from_where_it_had_got_to16 ms
- ✓A request that times out rather than failing fast is still just a failed tickscanner::tests::a_request_that_times_out_rather_than_failing_fast_is_still_just_a_failed_tick60 ms
- ✓A scan state runs the tuning it was givenscanner::tests::a_scan_state_runs_the_tuning_it_was_given70 ms
- ✓A slow link asks for what it delivers in a target callscanner::tests::a_slow_link_asks_for_what_it_delivers_in_a_target_call11 ms
- ✓A settled order is walked back when a reorg deeper than confirmations required orphans its paymentscanner::tests::a_settled_order_is_walked_back_when_a_reorg_deeper_than_confirmations_required_orphans_its_payment57 ms
- ✓A status change whose order event cannot be written is rolled back rather than lostscanner::tests::a_status_change_whose_order_event_cannot_be_written_is_rolled_back_rather_than_lost61 ms
- ✓A store failure marking a block scanned does not discard the ticks mempool matchesscanner::tests::a_store_failure_marking_a_block_scanned_does_not_discard_the_ticks_mempool_matches65 ms
- ✓A store failure recording a block match leaves that block unscanned for the next tickscanner::tests::a_store_failure_recording_a_block_match_leaves_that_block_unscanned_for_the_next_tick63 ms
- ✓A store whose backend lost it or was replaced is registered again by the scan loop alonescanner::tests::a_store_whose_backend_lost_it_or_was_replaced_is_registered_again_by_the_scan_loop_alone54 ms
- ✓A store whose window changed has the pool scanned again for itscanner::tests::a_store_whose_window_changed_has_the_pool_scanned_again_for_it61 ms
- ✓A store with over a million orders but few open is scanned normallyscanner::tests::a_store_with_over_a_million_orders_but_few_open_is_scanned_normally61 ms
- ✓A tenant with nothing in scope is never reported as laggingscanner::tests::a_tenant_with_nothing_in_scope_is_never_reported_as_lagging58 ms
- ✓A tenant whose backend answers slowly is left behind and holds nobody upscanner::tests::a_tenant_whose_backend_answers_slowly_is_left_behind_and_holds_nobody_up70 ms
- ✓A third transaction claiming the same inputs keeps the original voidedscanner::tests::a_third_transaction_claiming_the_same_inputs_keeps_the_original_voided60 ms
- ✓A tenant without registered keys is held back and caught up once they arescanner::tests::a_tenant_without_registered_keys_is_held_back_and_caught_up_once_they_are64 ms
- ✓A tick that detects a reorg never announces paid from the chain it is about to discardscanner::tests::a_tick_that_detects_a_reorg_never_announces_paid_from_the_chain_it_is_about_to_discard58 ms
- ✓A time locked output is not creditedscanner::tests::a_time_locked_output_is_not_credited62 ms
- ✓A transaction scanned for several stores is described only to the one it paysscanner::tests::a_transaction_scanned_for_several_stores_is_described_only_to_the_one_it_pays14 ms
- ✓A transaction that can pay nobody is no match not a failurescanner::tests::a_transaction_that_can_pay_nobody_is_no_match_not_a_failure12 ms
- ✓A transaction a daemon invents cannot become a payment unless it matches a walletscanner::tests::a_transaction_a_daemon_invents_cannot_become_a_payment_unless_it_matches_a_wallet58 ms
- ✓A void restored while rechecked is not restored twicescanner::tests::a_void_restored_while_rechecked_is_not_restored_twice63 ms
- ✓A void that lands before the node fails still updates the order it belongs toscanner::tests::a_void_that_lands_before_the_node_fails_still_updates_the_order_it_belongs_to63 ms
- ✓A void whose transaction is mined after all is restored at its blockscanner::tests::a_void_whose_transaction_is_mined_after_all_is_restored_at_its_block65 ms
- ✓A voided payment is restored when its transaction returns to the chainscanner::tests::a_voided_payment_is_restored_when_its_transaction_returns_to_the_chain59 ms
- ✓A voided payment keeps no height from the block it lostscanner::tests::a_voided_payment_keeps_no_height_from_the_block_it_lost55 ms
- ✓A zero conf order double spent out of the mempool is voided with no reorg involvedscanner::tests::a_zero_conf_order_double_spent_out_of_the_mempool_is_voided_with_no_reorg_involved64 ms
- ✓After a reorg the replacement blocks are forward scanned againscanner::tests::after_a_reorg_the_replacement_blocks_are_forward_scanned_again62 ms
- ✓An amount that only decrypts on a later tick is recorded then never unrecordedscanner::tests::an_amount_that_only_decrypts_on_a_later_tick_is_recorded_then_never_unrecorded51 ms
- ✓An inflated reported height inflates confirmations which is an accepted trust boundaryscanner::tests::an_inflated_reported_height_inflates_confirmations_which_is_an_accepted_trust_boundary61 ms
- ✓An order reaches paid as the chain advances without any new payment arrivingscanner::tests::an_order_reaches_paid_as_the_chain_advances_without_any_new_payment_arriving65 ms
- ✓An output reusing a credited one time key is not credited twicescanner::tests::an_output_reusing_a_credited_one_time_key_is_not_credited_twice63 ms
- ✓An output whose amount cannot be decrypted is skipped not recorded as zeroscanner::tests::an_output_whose_amount_cannot_be_decrypted_is_skipped_not_recorded_as_zero50 ms
- ✓An undecryptable amount is neither recorded nor stagedscanner::tests::an_undecryptable_amount_is_neither_recorded_nor_staged51 ms
- ✓An unchanged mempool is neither fetched nor scanned againscanner::tests::an_unchanged_mempool_is_neither_fetched_nor_scanned_again69 ms
- ✓An unpaid order past its deadline becomes expired on a tick that matches nothingscanner::tests::an_unpaid_order_past_its_deadline_becomes_expired_on_a_tick_that_matches_nothing54 ms
- ✓An unpaid lagging tenants order expires once it has caught upscanner::tests::an_unpaid_lagging_tenants_order_expires_once_it_has_caught_up64 ms
- ✓Cancellation after a closed orders payment is written does not lose its status or eventscanner::tests::cancellation_after_a_closed_orders_payment_is_written_does_not_lose_its_status_or_event65 ms
- ✓Catch up after a gap longer than the grace period still finds a payment to an order that closed sincescanner::tests::catch_up_after_a_gap_longer_than_the_grace_period_still_finds_a_payment_to_an_order_that_closed_since63 ms
- ✓Catch up refuses a block whose hash differs even when the reorg check cannot see itscanner::tests::catch_up_refuses_a_block_whose_hash_differs_even_when_the_reorg_check_cannot_see_it66 ms
- ✓Catch up stops at a block that differs from the one scanned earlierscanner::tests::catch_up_stops_at_a_block_that_differs_from_the_one_scanned_earlier78 ms
- ✓Every fallback node being down fails the tick cleanly without corrupting stored statescanner::tests::every_fallback_node_being_down_fails_the_tick_cleanly_without_corrupting_stored_state56 ms
- ✓Every order event carries a stable event id and a timestampscanner::tests::every_order_event_carries_a_stable_event_id_and_a_timestamp66 ms
- ✓Failed registrations are counted and logged oncescanner::tests::failed_registrations_are_counted_and_logged_once51 ms
- ✓Failing over through a real fallback client to a node serving a different chain reconciles like a reorgscanner::tests::failing_over_through_a_real_fallback_client_to_a_node_serving_a_different_chain_reconciles_like_a_reorg66 ms
- ✓Failing over to a lagging but honest fallback neither rewinds nor corrupts the windowscanner::tests::failing_over_to_a_lagging_but_honest_fallback_neither_rewinds_nor_corrupts_the_window61 ms
- ✓First run bootstrap tolerates a daemon reporting a tip it cannot yet servescanner::tests::first_run_bootstrap_tolerates_a_daemon_reporting_a_tip_it_cannot_yet_serve57 ms
- ✓Hung registrations are counted and the pass is boundedscanner::tests::hung_registrations_are_counted_and_the_pass_is_bounded51 ms
- ✓Keys that failed to register are registered by the retryscanner::tests::keys_that_failed_to_register_are_registered_by_the_retry48 ms
- ✓Malformed or empty stored key images never restore a voidscanner::tests::malformed_or_empty_stored_key_images_never_restore_a_void77 ms
- ✓Last scanned height advances tick over tick then freezes once the order leaves scopescanner::tests::last_scanned_height_advances_tick_over_tick_then_freezes_once_the_order_leaves_scope125 ms
- ✓No reorg when hashes still match is a cheap no opscanner::tests::no_reorg_when_hashes_still_match_is_a_cheap_no_op49 ms
- ✓One networks registration pass leaves another networks lost handles for that networkscanner::tests::one_networks_registration_pass_leaves_another_networks_lost_handles_for_that_network48 ms
- ✓Node disagreement never restores a voidscanner::tests::node_disagreement_never_restores_a_void70 ms
- ✓One tenants custody failure does not stall the network and it catches up laterscanner::tests::one_tenants_custody_failure_does_not_stall_the_network_and_it_catches_up_later74 ms
- ✓One tick can void a double spent payment for one order and record a new one for anotherscanner::tests::one_tick_can_void_a_double_spent_payment_for_one_order_and_record_a_new_one_for_another69 ms
- ✓One transactions outputs are routed to whichever order owns each indexscanner::tests::one_transactions_outputs_are_routed_to_whichever_order_owns_each_index50 ms
- ✓Only tenants with nothing in scope move without a scanscanner::tests::only_tenants_with_nothing_in_scope_move_without_a_scan56 ms
- ✓Rapidly alternating chain tips never lose or double count a paymentscanner::tests::rapidly_alternating_chain_tips_never_lose_or_double_count_a_payment118 ms
- ✓Registration carries on when the state check fails or hangsscanner::tests::registration_carries_on_when_the_state_check_fails_or_hangs55 ms
- ✓Registration that cannot list stores is retriedscanner::tests::registration_that_cannot_list_stores_is_retried54 ms
- ✓Reorg moving a tx to a different block updates height without voidingscanner::tests::reorg_moving_a_tx_to_a_different_block_updates_height_without_voiding63 ms
- ✓Reorg where tx vanishes and key image proven spent elsewhere voids and flags double spendscanner::tests::reorg_where_tx_vanishes_and_key_image_proven_spent_elsewhere_voids_and_flags_double_spend62 ms
- ✓Reorg where tx vanishes but key image still unspent does not voidscanner::tests::reorg_where_tx_vanishes_but_key_image_still_unspent_does_not_void64 ms
- ✓Rescanning the same mempool tx does not duplicate the paymentscanner::tests::rescanning_the_same_mempool_tx_does_not_duplicate_the_payment56 ms
- ✓Run scan tick batches a wide catchup range into far fewer daemon calls than blocksscanner::tests::run_scan_tick_batches_a_wide_catchup_range_into_far_fewer_daemon_calls_than_blocks99 ms
- ✓Run scan tick matches mempool tx recomputes status and writes an order eventscanner::tests::run_scan_tick_matches_mempool_tx_recomputes_status_and_writes_an_order_event58 ms
- ✓Run scan tick never calls key custody for a tenant with no pending ordersscanner::tests::run_scan_tick_never_calls_key_custody_for_a_tenant_with_no_pending_orders58 ms
- ✓Run scan tick never scans a tenant on a different network even if included in the input listscanner::tests::run_scan_tick_never_scans_a_tenant_on_a_different_network_even_if_included_in_the_input_list62 ms
- ✓Run scan tick on first run seeds near the current tip instead of scanning all historyscanner::tests::run_scan_tick_on_first_run_seeds_near_the_current_tip_instead_of_scanning_all_history57 ms
- ✓Run scan tick stops scanning a tenant the tick after it fully settlesscanner::tests::run_scan_tick_stops_scanning_a_tenant_the_tick_after_it_fully_settles60 ms
- ✓Run scan ticks future is sendscanner::tests::run_scan_ticks_future_is_send51 ms
- ✓Scanning a mempool tx records a payment against the right orderscanner::tests::scanning_a_mempool_tx_records_a_payment_against_the_right_order62 ms
- ✓Several transactions in one block paying one order are all recorded and summedscanner::tests::several_transactions_in_one_block_paying_one_order_are_all_recorded_and_summed68 ms
- ✓Short key image answers leave a void alonescanner::tests::short_key_image_answers_leave_a_void_alone70 ms
- ✓Stored key image evidence must be parseable and nonemptyscanner::tests::stored_key_image_evidence_must_be_parseable_and_nonempty11 ms
- ✓Staging skips unknown indices and reports write failuresscanner::tests::staging_skips_unknown_indices_and_reports_write_failures56 ms
- ✓Stores on a disabled backend are left alone and come back when it is enabled againscanner::tests::stores_on_a_disabled_backend_are_left_alone_and_come_back_when_it_is_enabled_again61 ms
- ✓Swapping to a daemon serving a different chain reconciles exactly like a reorgscanner::tests::swapping_to_a_daemon_serving_a_different_chain_reconciles_exactly_like_a_reorg71 ms
- ✓Killing the engine at any point in a tick never loses or duplicates a payment or its eventscanner::tests::killing_the_engine_at_any_point_in_a_tick_never_loses_or_duplicates_a_payment_or_its_event1.4 s
- ✓Tenants lagging at the same cursor share one block fetchscanner::tests::tenants_lagging_at_the_same_cursor_share_one_block_fetch71 ms
- ✓The entry points refuse an unknown networkscanner::tests::the_entry_points_refuse_an_unknown_network53 ms
- ✓The transaction variants these tests are built from are genuinely distinctscanner::tests::the_transaction_variants_these_tests_are_built_from_are_genuinely_distinct60 ms
- ✓The vanished payment sweep costs nothing while a transaction is where it should bescanner::tests::the_vanished_payment_sweep_costs_nothing_while_a_transaction_is_where_it_should_be74 ms
- ✓The scanned block window stays bounded as the chain growsscanner::tests::the_scanned_block_window_stays_bounded_as_the_chain_grows146 ms
- ✓The void recheck does nothing while the chain height is unreachablescanner::tests::the_void_recheck_does_nothing_while_the_chain_height_is_unreachable46 ms
- ✓The void recheck ignores a void outside the recheck windowscanner::tests::the_void_recheck_ignores_a_void_outside_the_recheck_window65 ms
- ✓The void recheck keeps the flag set while another voided payment still justifies itscanner::tests::the_void_recheck_keeps_the_flag_set_while_another_voided_payment_still_justifies_it45 ms
- ✓The void recheck leaves a still supported void alonescanner::tests::the_void_recheck_leaves_a_still_supported_void_alone49 ms
- ✓Update avg bytes per block weighs recent data by the configured alphascanner::tests::update_avg_bytes_per_block_weighs_recent_data_by_the_configured_alpha8 ms
- ✓The void recheck reverses a void no longer supported by fresh evidencescanner::tests::the_void_recheck_reverses_a_void_no_longer_supported_by_fresh_evidence65 ms
- ✓Voiding one of an orders two payments leaves the other countingscanner::tests::voiding_one_of_an_orders_two_payments_leaves_the_other_counting42 ms
- ✓When the backend loses its wallets every tenant is registered again oncescanner::tests::when_the_backend_loses_its_wallets_every_tenant_is_registered_again_once43 ms
- ✓Tenants are scanned concurrently not one after anotherscanner::tests::tenants_are_scanned_concurrently_not_one_after_another1.1 s
- ✓Random outages and reorgs never lose or duplicate a paymentscanner::tests::random_outages_and_reorgs_never_lose_or_duplicate_a_payment2.4 s
engine::scanner::paging_tests221 ms
- ✓A block is paged when too large for an answer or the linkscanner::paging_tests::a_block_is_paged_when_too_large_for_an_answer_or_the_link10 ms
- ✓A page is sized by memory link and cpuscanner::paging_tests::a_page_is_sized_by_memory_link_and_cpu11 ms
engine::scanner_status330 ms
- ✓A network that has never ticked reports the real absence of historyscanner_status::tests::a_network_that_has_never_ticked_reports_the_real_absence_of_history10 ms
- ✓Different networks are tracked independentlyscanner_status::tests::different_networks_are_tracked_independently10 ms
- ✓Record tick tracks success then failure then success correctlyscanner_status::tests::record_tick_tracks_success_then_failure_then_success_correctly10 ms
engine::status19171 ms
- ✓A later payment to a paid order never walks it back to confirmingstatus::tests::a_later_payment_to_a_paid_order_never_walks_it_back_to_confirming8 ms
- ✓A settled order is never walked back to expired by the clock alonestatus::tests::a_settled_order_is_never_walked_back_to_expired_by_the_clock_alone8 ms
- ✓A zero conf order stays paid once its transaction is minedstatus::tests::a_zero_conf_order_stays_paid_once_its_transaction_is_mined10 ms
- ✓Amounts that would overflow saturate instead of wrappingstatus::tests::amounts_that_would_overflow_saturate_instead_of_wrapping9 ms
- ✓Full amount all zero conf with a nonzero threshold is unconfirmedstatus::tests::full_amount_all_zero_conf_with_a_nonzero_threshold_is_unconfirmed8 ms
- ✓Full amount mixed zero conf and onchain below threshold is confirming not unconfirmedstatus::tests::full_amount_mixed_zero_conf_and_onchain_below_threshold_is_confirming_not_unconfirmed7 ms
- ✓Full amount all zero conf with confirmations required zero is paid immediatelystatus::tests::full_amount_all_zero_conf_with_confirmations_required_zero_is_paid_immediately9 ms
- ✓Full amount mixed zero conf and onchain with confirmations required zero is paidstatus::tests::full_amount_mixed_zero_conf_and_onchain_with_confirmations_required_zero_is_paid8 ms
- ✓Min confirmations exactly at threshold is paidstatus::tests::min_confirmations_exactly_at_threshold_is_paid10 ms
- ✓Multi payment one voided leaves partialstatus::tests::multi_payment_one_voided_leaves_partial8 ms
- ✓Min confirmations one below threshold is confirmingstatus::tests::min_confirmations_one_below_threshold_is_confirming10 ms
- ✓No payments after expiry is expiredstatus::tests::no_payments_after_expiry_is_expired10 ms
- ✓Multi payment voiding one still leaves enough stays paidstatus::tests::multi_payment_voiding_one_still_leaves_enough_stays_paid10 ms
- ✓No payments before expiry is pendingstatus::tests::no_payments_before_expiry_is_pending10 ms
- ✓Overpaid all zero conf with confirmations required zero is overpaid immediatelystatus::tests::overpaid_all_zero_conf_with_confirmations_required_zero_is_overpaid_immediately10 ms
- ✓Partial payment after expiry is expired not partialstatus::tests::partial_payment_after_expiry_is_expired_not_partial9 ms
- ✓Overpaid confirmedstatus::tests::overpaid_confirmed10 ms
- ✓Partial payment before expiry is partial regardless of confirmation depthstatus::tests::partial_payment_before_expiry_is_partial_regardless_of_confirmation_depth7 ms
- ✓The covering set is the deepest payments that reach the amountstatus::tests::the_covering_set_is_the_deepest_payments_that_reach_the_amount10 ms
engine::status::properties20439 ms
- ✓Adding payments cannot undo settlementstatus::properties::adding_payments_cannot_undo_settlement43 ms
- ✓Agrees with aggregate specificationstatus::properties::agrees_with_aggregate_specification26 ms
- ✓Expiry is strictly after the deadlinestatus::properties::expiry_is_strictly_after_the_deadline11 ms
- ✓Funded orders are independent of the clockstatus::properties::funded_orders_are_independent_of_the_clock26 ms
- ✓Increasing mined confirmations preserves settlementstatus::properties::increasing_mined_confirmations_preserves_settlement27 ms
- ✓Payment order does not change statusstatus::properties::payment_order_does_not_change_status29 ms
- ✓Reviewed status fuzz seeds replaystatus::properties::reviewed_status_fuzz_seeds_replay10 ms
- ✓Fuzz histories match status specificationstatus::properties::fuzz_histories_match_status_specification96 ms
- ✓Status decision boundaries match independent gridstatus::properties::status_decision_boundaries_match_independent_grid7 ms
- ✓Splitting a payment with the same evidence preserves statusstatus::properties::splitting_a_payment_with_the_same_evidence_preserves_status26 ms
- ✓Adding payments cannot undo settlement 512 casesstatus::properties::adding_payments_cannot_undo_settlement20 ms
- ✓Agrees with aggregate specification 512 casesstatus::properties::agrees_with_aggregate_specification14 ms
- ✓Expiry is strictly after the deadline 512 casesstatus::properties::expiry_is_strictly_after_the_deadline7 ms
- ✓Funded orders are independent of the clock 512 casesstatus::properties::funded_orders_are_independent_of_the_clock14 ms
- ✓Fuzz histories match status specification 512 casesstatus::properties::fuzz_histories_match_status_specification27 ms
- ✓Increasing mined confirmations preserves settlement 512 casesstatus::properties::increasing_mined_confirmations_preserves_settlement14 ms
- ✓Payment order does not change status 512 casesstatus::properties::payment_order_does_not_change_status14 ms
- ✓Reviewed status fuzz seeds replay 512 casesstatus::properties::reviewed_status_fuzz_seeds_replay7 ms
- ✓Splitting a payment with the same evidence preserves status 512 casesstatus::properties::splitting_a_payment_with_the_same_evidence_preserves_status15 ms
- ✓Status decision boundaries match independent grid 512 casesstatus::properties::status_decision_boundaries_match_independent_grid6 ms
engine::work861 min
- ✓Every sql failure while a payment confirms is recovered fromwork::tests::every_sql_failure_while_a_payment_confirms_is_recovered_from22.1 s
- ✓Every sql failure in a void recheck is recovered fromwork::tests::every_sql_failure_in_a_void_recheck_is_recovered_from1.3 s
- ✓Every sql failure while a double spend is found is recovered fromwork::tests::every_sql_failure_while_a_double_spend_is_found_is_recovered_from3.9 s
- ✓Every sql failure while a double spent payment is in the pool is recovered fromwork::tests::every_sql_failure_while_a_double_spent_payment_is_in_the_pool_is_recovered_from2.9 s
- ✓Every sql failure during a reorg is recovered fromwork::tests::every_sql_failure_during_a_reorg_is_recovered_from8.3 s
- ✓Every sql failure committing a checkpointed block is recovered fromwork::tests::every_sql_failure_committing_a_checkpointed_block_is_recovered_from8.9 s
- ✓Every sql failure while a payment is in the pool is recovered fromwork::tests::every_sql_failure_while_a_payment_is_in_the_pool_is_recovered_from5.9 s
- ✓Every sql failure while a payment is mined again is recovered fromwork::tests::every_sql_failure_while_a_payment_is_mined_again_is_recovered_from7.1 s
- ✓Every sql failure working a reorg job is recovered fromwork::tests::every_sql_failure_working_a_reorg_job_is_recovered_from2.5 s
- ✓Every sql failure while seeding is recovered fromwork::tests::every_sql_failure_while_seeding_is_recovered_from5.7 s
- ✓Every sql failure while a payment is mined is recovered fromwork::tests::every_sql_failure_while_a_payment_is_mined_is_recovered_from7.0 s
- ✓A block request gets the time its link needswork::tests::a_block_request_gets_the_time_its_link_needs60 ms
- ✓A call the node never answers fails at the deadlinework::tests::a_call_the_node_never_answers_fails_at_the_deadline12 ms
- ✓A candidate deleted mid page is skippedwork::tests::a_candidate_deleted_mid_page_is_skipped57 ms
- ✓A big group resumes each store from its own placework::tests::a_big_group_resumes_each_store_from_its_own_place188 ms
- ✓A candidate the node never answers about is given up onwork::tests::a_candidate_the_node_never_answers_about_is_given_up_on65 ms
- ✓A 200 mb block is scanned in pages and its payment foundwork::tests::a_200_mb_block_is_scanned_in_pages_and_its_payment_found223 ms
- ✓A cursor moved mid scan keeps what moved itwork::tests::a_cursor_moved_mid_scan_keeps_what_moved_it65 ms
- ✓A checkpoint for a replaced block is dropped and the replacement scanned wholework::tests::a_checkpoint_for_a_replaced_block_is_dropped_and_the_replacement_scanned_whole115 ms
- ✓A failing node is asked once a round about reorg candidateswork::tests::a_failing_node_is_asked_once_a_round_about_reorg_candidates73 ms
- ✓A failed page keeps the pages before itwork::tests::a_failed_page_keeps_the_pages_before_it124 ms
- ✓A block too big for one unit resumes from its checkpoint across restartswork::tests::a_block_too_big_for_one_unit_resumes_from_its_checkpoint_across_restarts368 ms
- ✓A failing store is tried once per pass then waitswork::tests::a_failing_store_is_tried_once_per_pass_then_waits52 ms
- ✓A fast pass that cannot load windows tries again next passwork::tests::a_fast_pass_that_cannot_load_windows_tries_again_next_pass65 ms
- ✓A failing tenant backs off without holding up the otherswork::tests::a_failing_tenant_backs_off_without_holding_up_the_others93 ms
- ✓A fast pass with no store in scope does nothingwork::tests::a_fast_pass_with_no_store_in_scope_does_nothing58 ms
- ✓A failed mempool body fetch retries every id without starving other sliceswork::tests::a_failed_mempool_body_fetch_retries_every_id_without_starving_other_slices269 ms
- ✓A hung node times out by its own clock and cools downwork::tests::a_hung_node_times_out_by_its_own_clock_and_cools_down11 ms
- ✓A fork not yet opened stops the frontier instead of spinningwork::tests::a_fork_not_yet_opened_stops_the_frontier_instead_of_spinning65 ms
- ✓A group with nobody to scan fetches nothingwork::tests::a_group_with_nobody_to_scan_fetches_nothing53 ms
- ✓A network with nothing to watch costs one small request a roundwork::tests::a_network_with_nothing_to_watch_costs_one_small_request_a_round60 ms
- ✓A node that returns no block is waited outwork::tests::a_node_that_returns_no_block_is_waited_out56 ms
- ✓A page of vanished payments costs two round trips and the stuck ones back offwork::tests::a_page_of_vanished_payments_costs_two_round_trips_and_the_stuck_ones_back_off64 ms
- ✓A payment whose amount cannot be read does not stop the store at its blockwork::tests::a_payment_whose_amount_cannot_be_read_does_not_stop_the_store_at_its_block69 ms
- ✓A recorded chain changed mid scan stops the commitwork::tests::a_recorded_chain_changed_mid_scan_stops_the_commit72 ms
- ✓A payment deep in a big block is found in one go and a unit at a timework::tests::a_payment_deep_in_a_big_block_is_found_in_one_go_and_a_unit_at_a_time171 ms
- ✓A recompute page fills with due orders up to its sizework::tests::a_recompute_page_fills_with_due_orders_up_to_its_size175 ms
- ✓A reorg job with every candidate waiting waitswork::tests::a_reorg_job_with_every_candidate_waiting_waits62 ms
- ✓A reorg moves a superseded payment without restoring itwork::tests::a_reorg_moves_a_superseded_payment_without_restoring_it70 ms
- ✓A reorg page with no time left does one candidatework::tests::a_reorg_page_with_no_time_left_does_one_candidate64 ms
- ✓A reorg job resumes after a restart and settlement waits for itwork::tests::a_reorg_job_resumes_after_a_restart_and_settlement_waits_for_it190 ms
- ✓A rescanned branch anchor pruned before detection is forgottenwork::tests::a_rescanned_branch_anchor_pruned_before_detection_is_forgotten62 ms
- ✓A round with a tier blocked by the node is a failed round for statuswork::tests::a_round_with_a_tier_blocked_by_the_node_is_a_failed_round_for_status15 ms
- ✓A reorged payment the node cannot find never settles its orderwork::tests::a_reorged_payment_the_node_cannot_find_never_settles_its_order90 ms
- ✓A round without the chain height reports it and scans the poolwork::tests::a_round_without_the_chain_height_reports_it_and_scans_the_pool60 ms
- ✓A second deeper fork during a reorg job ends on the final chainwork::tests::a_second_deeper_fork_during_a_reorg_job_ends_on_the_final_chain125 ms
- ✓A snapshot after the paid story shows where it endedwork::tests::a_snapshot_after_the_paid_story_shows_where_it_ended112 ms
- ✓A store failing partway through a block is left behind and not asked againwork::tests::a_store_failing_partway_through_a_block_is_left_behind_and_not_asked_again75 ms
- ✓A store far behind does not hold every catch up turnwork::tests::a_store_far_behind_does_not_hold_every_catch_up_turn81 ms
- ✓A store that gets an order while idle is scanned for from the next roundwork::tests::a_store_that_gets_an_order_while_idle_is_scanned_for_from_the_next_round71 ms
- ✓A slow link halves its requests until they arrive and the scan completeswork::tests::a_slow_link_halves_its_requests_until_they_arrive_and_the_scan_completes292 ms
- ✓A store whose orders all closed before the gap moves straight onwork::tests::a_store_whose_orders_all_closed_before_the_gap_moves_straight_on69 ms
- ✓A tip replaced after it was fetched leaves no phantom paymentwork::tests::a_tip_replaced_after_it_was_fetched_leaves_no_phantom_payment84 ms
- ✓A vanished check the node fails or stalls is retriedwork::tests::a_vanished_check_the_node_fails_or_stalls_is_retried68 ms
- ✓A vanished payment found mined gets its height and one back in the pool is leftwork::tests::a_vanished_payment_found_mined_gets_its_height_and_one_back_in_the_pool_is_left70 ms
- ✓A void restored meanwhile still gets its new heightwork::tests::a_void_restored_meanwhile_still_gets_its_new_height56 ms
- ✓A void recheck pass longer than a page carries on across roundswork::tests::a_void_recheck_pass_longer_than_a_page_carries_on_across_rounds122 ms
- ✓An open reorg pauses blocks and settlement but not the mempool or expirywork::tests::an_open_reorg_pauses_blocks_and_settlement_but_not_the_mempool_or_expiry59 ms
- ✓Backoff forgets keys that stopped failingwork::tests::backoff_forgets_keys_that_stopped_failing11 ms
- ✓Blocks are kept only for the node they came fromwork::tests::blocks_are_kept_only_for_the_node_they_came_from56 ms
- ✓An empty frontier keeps its turn when catch up cannot movework::tests::an_empty_frontier_keeps_its_turn_when_catch_up_cannot_move181 ms
- ✓A group larger than a page moves togetherwork::tests::a_group_larger_than_a_page_moves_together1.1 s
- ✓Catch up gets turns while the frontier is far behindwork::tests::catch_up_gets_turns_while_the_frontier_is_far_behind80 ms
- ✓Catching up onto a replaced recorded block waitswork::tests::catching_up_onto_a_replaced_recorded_block_waits56 ms
- ✓Catching up below the recorded history records nothing for the networkwork::tests::catching_up_below_the_recorded_history_records_nothing_for_the_network69 ms
- ✓Blocks fetched ahead are scanned in later rounds without being sent againwork::tests::blocks_fetched_ahead_are_scanned_in_later_rounds_without_being_sent_again236 ms
- ✓Catch up takes the turn of a frontier with nobody to scanwork::tests::catch_up_takes_the_turn_of_a_frontier_with_nobody_to_scan169 ms
- ✓Nothing is fetched for a store whose keys are not registeredwork::tests::nothing_is_fetched_for_a_store_whose_keys_are_not_registered67 ms
- ✓More recomputes owed than a page are all donework::tests::more_recomputes_owed_than_a_page_are_all_done119 ms
- ✓One failing recompute does not hold up the otherswork::tests::one_failing_recompute_does_not_hold_up_the_others58 ms
- ✓Nothing is kept across a rewindwork::tests::nothing_is_kept_across_a_rewind113 ms
- ✓Pool transactions gone before their bodies came are moved pastwork::tests::pool_transactions_gone_before_their_bodies_came_are_moved_past57 ms
- ✓Reorg detection costs one lookup when the chain agrees and log depth when notwork::tests::reorg_detection_costs_one_lookup_when_the_chain_agrees_and_log_depth_when_not52 ms
- ✓The activity record tells the paid story in orderwork::tests::the_activity_record_tells_the_paid_story_in_order101 ms
- ✓The fast path leaves the node alone while no store has an order in scopework::tests::the_fast_path_leaves_the_node_alone_while_no_store_has_an_order_in_scope56 ms
- ✓The fast path reports an unreadable poolwork::tests::the_fast_path_reports_an_unreadable_pool57 ms
- ✓The fast path settles a new pool payment at oncework::tests::the_fast_path_settles_a_new_pool_payment_at_once61 ms
- ✓The fast path uses the last rounds chain heightwork::tests::the_fast_path_uses_the_last_rounds_chain_height76 ms
- ✓Tiers and wait reasons display distinctlywork::tests::tiers_and_wait_reasons_display_distinctly17 ms
- ✓The next block is fetched while this one is scanned and usedwork::tests::the_next_block_is_fetched_while_this_one_is_scanned_and_used102 ms
- ✓Upkeep prunes order events older than the retentionwork::tests::upkeep_prunes_order_events_older_than_the_retention60 ms
- ✓Turns alternate while the frontier has a store to scanwork::tests::turns_alternate_while_the_frontier_has_a_store_to_scan143 ms
- ✓Vanished payments are checked one a round with no time to sparework::tests::vanished_payments_are_checked_one_a_round_with_no_time_to_spare72 ms
- ✓With no time at all every tier with work still advanceswork::tests::with_no_time_at_all_every_tier_with_work_still_advances78 ms
- ✓Every store is scanned when there are more than a pagework::tests::every_store_is_scanned_when_there_are_more_than_a_page1.3 s
- ✓The fast path defers what its budget does not coverwork::tests::the_fast_path_defers_what_its_budget_does_not_cover1.7 s
engine::work::blocks588 ms
- ✓A block near the paging size turns headers first onwork::blocks::tests::a_block_near_the_paging_size_turns_headers_first_on10 ms
- ✓A round without a paged block gets the basework::blocks::tests::a_round_without_a_paged_block_gets_the_base10 ms
- ✓The block cache evicts scanned blocks before the restwork::blocks::tests::the_block_cache_evicts_scanned_blocks_before_the_rest9 ms
- ✓The block cache keeps count and evicts the farthest firstwork::blocks::tests::the_block_cache_keeps_count_and_evicts_the_farthest_first10 ms
- ✓A round resumes the cache within todays budgetwork::blocks::tests::a_round_resumes_the_cache_within_todays_budget49 ms
engine::work::blocks::properties64.1 s
- ✓Cache histories preserve accounting and protected blockswork::blocks::properties::cache_histories_preserve_accounting_and_protected_blocks21 ms
- ✓Every late commit boundary is exercised with and without stagingwork::blocks::properties::every_late_commit_boundary_is_exercised_with_and_without_staging230 ms
- ✓Accepted block effects recheck durable prerequisiteswork::blocks::properties::accepted_block_effects_recheck_durable_prerequisites552 ms
- ✓Accepted block effects recheck durable prerequisites 512 caseswork::blocks::properties::accepted_block_effects_recheck_durable_prerequisites3.1 s
- ✓Cache histories preserve accounting and protected blocks 512 caseswork::blocks::properties::cache_histories_preserve_accounting_and_protected_blocks17 ms
- ✓Every late commit boundary is exercised with and without staging 512 caseswork::blocks::properties::every_late_commit_boundary_is_exercised_with_and_without_staging155 ms
engine::work::blocks::scale153 ms
- ✓Thousands of cached headers obey the budget and anchor exceptionwork::blocks::scale::thousands_of_cached_headers_obey_the_budget_and_anchor_exception53 ms
engine::work::chain::decide_tests110 ms
- ✓Reconciliation follows the transaction and voids only on proofwork::chain::decide_tests::reconciliation_follows_the_transaction_and_voids_only_on_proof10 ms
engine::work::mempool220 ms
- ✓Arrivals join behind waiting transactionswork::mempool::tests::arrivals_join_behind_waiting_transactions9 ms
- ✓Remembered bodies stop at the count or byte capwork::mempool::tests::remembered_bodies_stop_at_the_count_or_byte_cap11 ms
engine::work::mempool::properties3222.2 s
- ✓A completion for another window cannot publish or release its ownerwork::mempool::properties::a_completion_for_another_window_cannot_publish_or_release_its_owner9 ms
- ✓Cache accounting obeys full width budgetswork::mempool::properties::cache_accounting_obeys_full_width_budgets20 ms
- ✓Both entry points cover owner success and cancellationwork::mempool::properties::both_entry_points_cover_owner_success_and_cancellation136 ms
- ✓Competing scans release on success failure and cancellationwork::mempool::properties::competing_scans_release_on_success_failure_and_cancellation101 ms
- ✓Every mixed batch failure boundary runs in both orderswork::mempool::properties::every_mixed_batch_failure_boundary_runs_in_both_orders156 ms
- ✓Ownership survives pool eviction and serializes changed windowswork::mempool::properties::ownership_survives_pool_eviction_and_serializes_changed_windows12 ms
- ✓Partially completed batches and panics release only unfinished workwork::mempool::properties::partially_completed_batches_and_panics_release_only_unfinished_work10 ms
- ✓Overlapping thread batches have exactly one owner per keywork::mempool::properties::overlapping_thread_batches_have_exactly_one_owner_per_key125 ms
- ✓Reservation decision grid checks completed busy and changed windowswork::mempool::properties::reservation_decision_grid_checks_completed_busy_and_changed_windows11 ms
- ✓Reservation histories match independent ownershipwork::mempool::properties::reservation_histories_match_independent_ownership40 ms
- ✓Reviewed fuzz histories remain valid regressionswork::mempool::properties::reviewed_fuzz_histories_remain_valid_regressions16 ms
- ✓Simultaneous threads cannot both reserve the same scanwork::mempool::properties::simultaneous_threads_cannot_both_reserve_the_same_scan15 ms
- ✓Unrelated transactions and tenants are not serializedwork::mempool::properties::unrelated_transactions_and_tenants_are_not_serialized13 ms
- ✓Mixed tenant success failure and empty matches retry independentlywork::mempool::properties::mixed_tenant_success_failure_and_empty_matches_retry_independently838 ms
- ✓Real fast and round callers share reservationswork::mempool::properties::real_fast_and_round_callers_share_reservations1.7 s
- ✓Batch reservations and cache historieswork::mempool::properties::batch_reservations_and_cache_histories2.1 s
- ✓A completion for another window cannot publish or release its owner 512 caseswork::mempool::properties::a_completion_for_another_window_cannot_publish_or_release_its_owner9 ms
- ✓Batch reservations and cache histories 512 caseswork::mempool::properties::batch_reservations_and_cache_histories2.1 s
- ✓Both entry points cover owner success and cancellation 512 caseswork::mempool::properties::both_entry_points_cover_owner_success_and_cancellation80 ms
- ✓Cache accounting obeys full width budgets 512 caseswork::mempool::properties::cache_accounting_obeys_full_width_budgets21 ms
- ✓Competing scans release on success failure and cancellation 512 caseswork::mempool::properties::competing_scans_release_on_success_failure_and_cancellation66 ms
- ✓Every mixed batch failure boundary runs in both orders 512 caseswork::mempool::properties::every_mixed_batch_failure_boundary_runs_in_both_orders113 ms
- ✓Mixed tenant success failure and empty matches retry independently 512 caseswork::mempool::properties::mixed_tenant_success_failure_and_empty_matches_retry_independently4.5 s
- ✓Ownership survives pool eviction and serializes changed windows 512 caseswork::mempool::properties::ownership_survives_pool_eviction_and_serializes_changed_windows8 ms
- ✓Partially completed batches and panics release only unfinished work 512 caseswork::mempool::properties::partially_completed_batches_and_panics_release_only_unfinished_work8 ms
- ✓Overlapping thread batches have exactly one owner per key 512 caseswork::mempool::properties::overlapping_thread_batches_have_exactly_one_owner_per_key583 ms
- ✓Reservation decision grid checks completed busy and changed windows 512 caseswork::mempool::properties::reservation_decision_grid_checks_completed_busy_and_changed_windows11 ms
- ✓Reservation histories match independent ownership 512 caseswork::mempool::properties::reservation_histories_match_independent_ownership51 ms
- ✓Reviewed fuzz histories remain valid regressions 512 caseswork::mempool::properties::reviewed_fuzz_histories_remain_valid_regressions8 ms
- ✓Simultaneous threads cannot both reserve the same scan 512 caseswork::mempool::properties::simultaneous_threads_cannot_both_reserve_the_same_scan8 ms
- ✓Unrelated transactions and tenants are not serialized 512 caseswork::mempool::properties::unrelated_transactions_and_tenants_are_not_serialized7 ms
- ✓Real fast and round callers share reservations 512 caseswork::mempool::properties::real_fast_and_round_callers_share_reservations9.3 s
engine::work::mempool::properties::scale123 min
- ✓Arrivals cannot increase existing work waitwork::mempool::properties::scale::arrivals_cannot_increase_existing_work_wait389 ms
- ✓Expanded windows are served during continuous new transaction floodswork::mempool::properties::scale::expanded_windows_are_served_during_continuous_new_transaction_floods4.8 s
- ✓Production body caps reject overflow and reuse freed spacework::mempool::properties::scale::production_body_caps_reject_overflow_and_reuse_freed_space770 ms
- ✓Transaction cursors cannot be shared between three transactionswork::mempool::properties::scale::transaction_cursors_cannot_be_shared_between_three_transactions833 ms
- ✓Parallel pool backlogs recover and release cachework::mempool::properties::scale::parallel_pool_backlogs_recover_and_release_cache8.6 s
- ✓Each transaction visits each tenant independentlywork::mempool::properties::scale::each_transaction_visits_each_tenant_independently25.2 s
- ✓Arrivals cannot increase existing work wait 512 caseswork::mempool::properties::scale::arrivals_cannot_increase_existing_work_wait1.4 s
- ✓Each transaction visits each tenant independently 512 caseswork::mempool::properties::scale::each_transaction_visits_each_tenant_independently2 min
- ✓Expanded windows are served during continuous new transaction floods 512 caseswork::mempool::properties::scale::expanded_windows_are_served_during_continuous_new_transaction_floods1.9 s
- ✓Parallel pool backlogs recover and release cache 512 caseswork::mempool::properties::scale::parallel_pool_backlogs_recover_and_release_cache38.8 s
- ✓Production body caps reject overflow and reuse freed space 512 caseswork::mempool::properties::scale::production_body_caps_reject_overflow_and_reuse_freed_space91 ms
- ✓Transaction cursors cannot be shared between three transactions 512 caseswork::mempool::properties::scale::transaction_cursors_cannot_be_shared_between_three_transactions474 ms
engine::work::properties468 min
- ✓Every recorded ringct variant runs complete money historieswork::tests::properties::every_recorded_ringct_variant_runs_complete_money_histories21.2 s
- ✓A fork after rewind before rescanning cannot keep a discarded payment heightwork::tests::properties::a_fork_after_rewind_before_rescanning_cannot_keep_a_discarded_payment_height130 ms
- ✓A replaced payment block recorded from its header cannot settle the orderwork::tests::properties::a_replaced_payment_block_recorded_from_its_header_cannot_settle_the_order194 ms
- ✓A second fork after reconciliation cannot keep a discarded payment heightwork::tests::properties::a_second_fork_after_reconciliation_cannot_keep_a_discarded_payment_height123 ms
- ✓A shorter branch recomputes confirmations even when the payment height is unchangedwork::tests::properties::a_shorter_branch_recomputes_confirmations_even_when_the_payment_height_is_unchanged112 ms
- ✓A shorter branch reopens a settled payment below the forkwork::tests::properties::a_shorter_branch_reopens_a_settled_payment_below_the_fork133 ms
- ✓A shorter tip above scanned history recomputes depth after restartwork::tests::properties::a_shorter_tip_above_scanned_history_recomputes_depth_after_restart149 ms
- ✓A single page budget eventually serves all tenants despite a custody failurework::tests::properties::a_single_page_budget_eventually_serves_all_tenants_despite_a_custody_failure121 ms
- ✓Combined portfolio interactions have fixed positive controlswork::tests::properties::combined_portfolio_interactions_have_fixed_positive_controls2.4 s
- ✓An interrupted block replaced by a fork never leaks staged paymentswork::tests::properties::an_interrupted_block_replaced_by_a_fork_never_leaks_staged_payments4.0 s
- ✓Coverage guided histories recover with real scannerwork::tests::properties::coverage_guided_histories_recover_with_real_scanner10.5 s
- ✓Failing tenants do not starve healthy tenants and catch up after restartwork::tests::properties::failing_tenants_do_not_starve_healthy_tenants_and_catch_up_after_restart8.3 s
- ✓Portfolio composes arrival extension reorg proof expiry and faultswork::tests::properties::portfolio_composes_arrival_extension_reorg_proof_expiry_and_faults681 ms
- ✓Portfolio reorg retains pending settlement until branch is provenwork::tests::properties::portfolio_reorg_retains_pending_settlement_until_branch_is_proven891 ms
- ✓Portfolio reports selected applied and skipped commands separatelywork::tests::properties::portfolio_reports_selected_applied_and_skipped_commands_separately213 ms
- ✓Recorded ringct shapes and recipient expectations are frozenwork::tests::properties::recorded_ringct_shapes_and_recipient_expectations_are_frozen50 ms
- ✓Portfolio selects every sql operation class and positionwork::tests::properties::portfolio_selects_every_sql_operation_class_and_position1.6 s
- ✓Reviewed engine history seeds replaywork::tests::properties::reviewed_engine_history_seeds_replay1.2 s
- ✓Reviewed portfolio seeds are the encoded reviewed scenarioswork::tests::properties::reviewed_portfolio_seeds_are_the_encoded_reviewed_scenarios12 ms
- ✓Replacement chains of different lengths recompute payment depthwork::tests::properties::replacement_chains_of_different_lengths_recompute_payment_depth6.3 s
- ✓Reorg jobs survive outages and restore payments when evidence changeswork::tests::properties::reorg_jobs_survive_outages_and_restore_payments_when_evidence_changes7.9 s
- ✓Scanner histories converge after reorgs failures and restartswork::tests::properties::scanner_histories_converge_after_reorgs_failures_and_restarts10.1 s
- ✓Portfolio histories match independent ledgerwork::tests::properties::portfolio_histories_match_independent_ledger21.1 s
- ✓Every recorded ringct variant runs complete money histories 512 caseswork::tests::properties::every_recorded_ringct_variant_runs_complete_money_histories10.5 s
- ✓A fork after rewind before rescanning cannot keep a discarded payment height 512 caseswork::tests::properties::a_fork_after_rewind_before_rescanning_cannot_keep_a_discarded_payment_height77 ms
- ✓A replaced payment block recorded from its header cannot settle the order 512 caseswork::tests::properties::a_replaced_payment_block_recorded_from_its_header_cannot_settle_the_order102 ms
- ✓A second fork after reconciliation cannot keep a discarded payment height 512 caseswork::tests::properties::a_second_fork_after_reconciliation_cannot_keep_a_discarded_payment_height69 ms
- ✓A shorter branch recomputes confirmations even when the payment height is unchanged 512 caseswork::tests::properties::a_shorter_branch_recomputes_confirmations_even_when_the_payment_height_is_unchanged62 ms
- ✓A shorter branch reopens a settled payment below the fork 512 caseswork::tests::properties::a_shorter_branch_reopens_a_settled_payment_below_the_fork112 ms
- ✓A shorter tip above scanned history recomputes depth after restart 512 caseswork::tests::properties::a_shorter_tip_above_scanned_history_recomputes_depth_after_restart87 ms
- ✓A single page budget eventually serves all tenants despite a custody failure 512 caseswork::tests::properties::a_single_page_budget_eventually_serves_all_tenants_despite_a_custody_failure68 ms
- ✓Combined portfolio interactions have fixed positive controls 512 caseswork::tests::properties::combined_portfolio_interactions_have_fixed_positive_controls1.6 s
- ✓An interrupted block replaced by a fork never leaks staged payments 512 caseswork::tests::properties::an_interrupted_block_replaced_by_a_fork_never_leaks_staged_payments20.2 s
- ✓Failing tenants do not starve healthy tenants and catch up after restart 512 caseswork::tests::properties::failing_tenants_do_not_starve_healthy_tenants_and_catch_up_after_restart49.0 s
- ✓Coverage guided histories recover with real scanner 512 caseswork::tests::properties::coverage_guided_histories_recover_with_real_scanner58.5 s
- ✓Portfolio composes arrival extension reorg proof expiry and faults 512 caseswork::tests::properties::portfolio_composes_arrival_extension_reorg_proof_expiry_and_faults366 ms
- ✓Portfolio reorg retains pending settlement until branch is proven 512 caseswork::tests::properties::portfolio_reorg_retains_pending_settlement_until_branch_is_proven529 ms
- ✓Portfolio reports selected applied and skipped commands separately 512 caseswork::tests::properties::portfolio_reports_selected_applied_and_skipped_commands_separately168 ms
- ✓Portfolio selects every sql operation class and position 512 caseswork::tests::properties::portfolio_selects_every_sql_operation_class_and_position1.6 s
- ✓Recorded ringct shapes and recipient expectations are frozen 512 caseswork::tests::properties::recorded_ringct_shapes_and_recipient_expectations_are_frozen41 ms
- ✓Reorg jobs survive outages and restore payments when evidence changes 512 caseswork::tests::properties::reorg_jobs_survive_outages_and_restore_payments_when_evidence_changes39.0 s
- ✓Portfolio histories match independent ledger 512 caseswork::tests::properties::portfolio_histories_match_independent_ledger2 min
- ✓Reviewed engine history seeds replay 512 caseswork::tests::properties::reviewed_engine_history_seeds_replay650 ms
- ✓Reviewed portfolio seeds are the encoded reviewed scenarios 512 caseswork::tests::properties::reviewed_portfolio_seeds_are_the_encoded_reviewed_scenarios9 ms
- ✓Replacement chains of different lengths recompute payment depth 512 caseswork::tests::properties::replacement_chains_of_different_lengths_recompute_payment_depth31.8 s
- ✓Scanner histories converge after reorgs failures and restarts 512 caseswork::tests::properties::scanner_histories_converge_after_reorgs_failures_and_restarts49.9 s
engine::work::properties::concurrency82 min
- ✓Every overlap admission order and abandoned caller recoverswork::tests::properties::concurrency::every_overlap_admission_order_and_abandoned_caller_recovers1.6 s
- ✓Proof config and generation histories preserve settlementwork::tests::properties::concurrency::proof_config_and_generation_histories_preserve_settlement3.6 s
- ✓Combined worker histories preserve moneywork::tests::properties::concurrency::combined_worker_histories_preserve_money8.1 s
- ✓Every proof config shutdown admission schedule recoverswork::tests::properties::concurrency::every_proof_config_shutdown_admission_schedule_recovers8.0 s
- ✓Every overlap admission order and abandoned caller recovers 512 caseswork::tests::properties::concurrency::every_overlap_admission_order_and_abandoned_caller_recovers896 ms
- ✓Every proof config shutdown admission schedule recovers 512 caseswork::tests::properties::concurrency::every_proof_config_shutdown_admission_schedule_recovers4.9 s
- ✓Proof config and generation histories preserve settlement 512 caseswork::tests::properties::concurrency::proof_config_and_generation_histories_preserve_settlement24.5 s
- ✓Combined worker histories preserve money 512 caseswork::tests::properties::concurrency::combined_worker_histories_preserve_money49.7 s
engine::work::properties::lifecycle62 min
- ✓Bootstrap histories recover from empty short and unservable chainswork::tests::properties::lifecycle::bootstrap_histories_recover_from_empty_short_and_unservable_chains5.1 s
- ✓Forks at and beyond retention edges preserve the documented evidence limitwork::tests::properties::lifecycle::forks_at_and_beyond_retention_edges_preserve_the_documented_evidence_limit5.6 s
- ✓Genesis divergence recovers through generated failures and restartswork::tests::properties::lifecycle::genesis_divergence_recovers_through_generated_failures_and_restarts5.0 s
- ✓Bootstrap histories recover from empty short and unservable chains 512 caseswork::tests::properties::lifecycle::bootstrap_histories_recover_from_empty_short_and_unservable_chains28.6 s
- ✓Forks at and beyond retention edges preserve the documented evidence limit 512 caseswork::tests::properties::lifecycle::forks_at_and_beyond_retention_edges_preserve_the_documented_evidence_limit31.4 s
- ✓Genesis divergence recovers through generated failures and restarts 512 caseswork::tests::properties::lifecycle::genesis_divergence_recovers_through_generated_failures_and_restarts29.2 s
engine::work::properties::money347 min
- ✓A zero confirmation settlement reopens when its output key conflict loses its winnerwork::tests::properties::money::a_zero_confirmation_settlement_reopens_when_its_output_key_conflict_loses_its_winner144 ms
- ✓An unregistered tenant cannot hide a healthy tenant in the next catch up pagework::tests::properties::money::an_unregistered_tenant_cannot_hide_a_healthy_tenant_in_the_next_catch_up_page115 ms
- ✓A new order is found in an already cached pool transactionwork::tests::properties::money::a_new_order_is_found_in_an_already_cached_pool_transaction2.1 s
- ✓Closed order grace boundary controls late pool scanningwork::tests::properties::money::closed_order_grace_boundary_controls_late_pool_scanning2.2 s
- ✓Deadlines wait for backlogged scans and do not hide a paymentwork::tests::properties::money::deadlines_wait_for_backlogged_scans_and_do_not_hide_a_payment3.3 s
- ✓Distinct wallets cannot credit each others outputswork::tests::properties::money::distinct_wallets_cannot_credit_each_others_outputs3.4 s
- ✓Concurrent fast scans rounds and order creation preserve exactly once creditwork::tests::properties::money::concurrent_fast_scans_rounds_and_order_creation_preserve_exactly_once_credit6.9 s
- ✓Every output in a transaction is routed once and uses its orders policywork::tests::properties::money::every_output_in_a_transaction_is_routed_once_and_uses_its_orders_policy4.3 s
- ✓Fast pool passes and rounds share exactly once credit across restartswork::tests::properties::money::fast_pool_passes_and_rounds_share_exactly_once_credit_across_restarts5.3 s
- ✓Late payments do not unsettle an order already covered by confirmed fundswork::tests::properties::money::late_payments_do_not_unsettle_an_order_already_covered_by_confirmed_funds3.0 s
- ✓Missing or ambiguous evidence cannot void moneywork::tests::properties::money::missing_or_ambiguous_evidence_cannot_void_money2.8 s
- ✓Independent payments are routed and credited once across reorgswork::tests::properties::money::independent_payments_are_routed_and_credited_once_across_reorgs9.0 s
- ✓One networks rounds cannot scan or credit another networks orderswork::tests::properties::money::one_networks_rounds_cannot_scan_or_credit_another_networks_orders4.1 s
- ✓Late key registration cannot starve healthy catch up tenantswork::tests::properties::money::late_key_registration_cannot_starve_healthy_catch_up_tenants8.7 s
- ✓Settlement waits for verified depth and the payments attested blockwork::tests::properties::money::settlement_waits_for_verified_depth_and_the_payments_attested_block3.3 s
- ✓Reused output keys never create extra spendable money and winners follow reorgswork::tests::properties::money::reused_output_keys_never_create_extra_spendable_money_and_winners_follow_reorgs7.2 s
- ✓Transaction paging and fetch failures cannot credit unfinished blockswork::tests::properties::money::transaction_paging_and_fetch_failures_cannot_credit_unfinished_blocks5.2 s
- ✓A new order is found in an already cached pool transaction 512 caseswork::tests::properties::money::a_new_order_is_found_in_an_already_cached_pool_transaction12.6 s
- ✓A zero confirmation settlement reopens when its output key conflict loses its winner 512 caseswork::tests::properties::money::a_zero_confirmation_settlement_reopens_when_its_output_key_conflict_loses_its_winner91 ms
- ✓An unregistered tenant cannot hide a healthy tenant in the next catch up page 512 caseswork::tests::properties::money::an_unregistered_tenant_cannot_hide_a_healthy_tenant_in_the_next_catch_up_page61 ms
- ✓Closed order grace boundary controls late pool scanning 512 caseswork::tests::properties::money::closed_order_grace_boundary_controls_late_pool_scanning14.1 s
- ✓Deadlines wait for backlogged scans and do not hide a payment 512 caseswork::tests::properties::money::deadlines_wait_for_backlogged_scans_and_do_not_hide_a_payment15.6 s
- ✓Concurrent fast scans rounds and order creation preserve exactly once credit 512 caseswork::tests::properties::money::concurrent_fast_scans_rounds_and_order_creation_preserve_exactly_once_credit35.3 s
- ✓Distinct wallets cannot credit each others outputs 512 caseswork::tests::properties::money::distinct_wallets_cannot_credit_each_others_outputs22.5 s
- ✓Every output in a transaction is routed once and uses its orders policy 512 caseswork::tests::properties::money::every_output_in_a_transaction_is_routed_once_and_uses_its_orders_policy22.8 s
- ✓Fast pool passes and rounds share exactly once credit across restarts 512 caseswork::tests::properties::money::fast_pool_passes_and_rounds_share_exactly_once_credit_across_restarts29.1 s
- ✓Independent payments are routed and credited once across reorgs 512 caseswork::tests::properties::money::independent_payments_are_routed_and_credited_once_across_reorgs49.1 s
- ✓Late key registration cannot starve healthy catch up tenants 512 caseswork::tests::properties::money::late_key_registration_cannot_starve_healthy_catch_up_tenants43.8 s
- ✓Late payments do not unsettle an order already covered by confirmed funds 512 caseswork::tests::properties::money::late_payments_do_not_unsettle_an_order_already_covered_by_confirmed_funds16.0 s
- ✓Missing or ambiguous evidence cannot void money 512 caseswork::tests::properties::money::missing_or_ambiguous_evidence_cannot_void_money13.7 s
- ✓One networks rounds cannot scan or credit another networks orders 512 caseswork::tests::properties::money::one_networks_rounds_cannot_scan_or_credit_another_networks_orders21.9 s
- ✓Reused output keys never create extra spendable money and winners follow reorgs 512 caseswork::tests::properties::money::reused_output_keys_never_create_extra_spendable_money_and_winners_follow_reorgs34.9 s
- ✓Settlement waits for verified depth and the payments attested block 512 caseswork::tests::properties::money::settlement_waits_for_verified_depth_and_the_payments_attested_block15.5 s
- ✓Transaction paging and fetch failures cannot credit unfinished blocks 512 caseswork::tests::properties::money::transaction_paging_and_fetch_failures_cannot_credit_unfinished_blocks22.6 s
engine::work::properties::money::expansions3017 min
- ✓An aggregate one piconero above the storage limit rolls backwork::tests::properties::money::expansions::an_aggregate_one_piconero_above_the_storage_limit_rolls_back64 ms
- ✓Crash process childwork::tests::properties::money::expansions::crash_process_child10 ms
- ✓Every worker crash boundary and the full recovery pipeline runwork::tests::properties::money::expansions::every_worker_crash_boundary_and_the_full_recovery_pipeline_run1.2 s
- ✓Named money durability boundaries recover after process deathwork::tests::properties::money::expansions::named_money_durability_boundaries_recover_after_process_death657 ms
- ✓Oversized invoices do not consume an address or idempotency keywork::tests::properties::money::expansions::oversized_invoices_do_not_consume_an_address_or_idempotency_key943 ms
- ✓Process death during sqlite work recovers exactly once moneywork::tests::properties::money::expansions::process_death_during_sqlite_work_recovers_exactly_once_money4.3 s
- ✓Reorg collection of a 255 output pool payment faulted at oncework::tests::properties::money::expansions::reorg_collection_of_a_255_output_pool_payment_faulted_at_once616 ms
- ✓Production worker crashes preserve atomic moneywork::tests::properties::money::expansions::production_worker_crashes_preserve_atomic_money6.5 s
- ✓Repeated recovery process deaths preserve obligationswork::tests::properties::money::expansions::repeated_recovery_process_deaths_preserve_obligations12.8 s
- ✓Reorg collection of pool outputs crosses full queue pages without losing outputswork::tests::properties::money::expansions::reorg_collection_of_pool_outputs_crosses_full_queue_pages_without_losing_outputs21.6 s
- ✓Reorg collection of mined outputs crosses full queue pages without losing outputswork::tests::properties::money::expansions::reorg_collection_of_mined_outputs_crosses_full_queue_pages_without_losing_outputs25.9 s
- ✓Unrepresentable amounts fail without corrupting stored moneywork::tests::properties::money::expansions::unrepresentable_amounts_fail_without_corrupting_stored_money875 ms
- ✓Stored amount boundaries survive scanning mining and restartswork::tests::properties::money::expansions::stored_amount_boundaries_survive_scanning_mining_and_restarts3.2 s
- ✓Repeated multi order forks faults and restarts preserve moneywork::tests::properties::money::expansions::repeated_multi_order_forks_faults_and_restarts_preserve_money26.4 s
- ✓Settlement queue wraparound recomputes every order oncework::tests::properties::money::expansions::settlement_queue_wraparound_recomputes_every_order_once18.4 s
- ✓An aggregate one piconero above the storage limit rolls back 512 caseswork::tests::properties::money::expansions::an_aggregate_one_piconero_above_the_storage_limit_rolls_back38 ms
- ✓Crash process child 512 caseswork::tests::properties::money::expansions::crash_process_child7 ms
- ✓Every worker crash boundary and the full recovery pipeline run 512 caseswork::tests::properties::money::expansions::every_worker_crash_boundary_and_the_full_recovery_pipeline_run621 ms
- ✓Named money durability boundaries recover after process death 512 caseswork::tests::properties::money::expansions::named_money_durability_boundaries_recover_after_process_death335 ms
- ✓Oversized invoices do not consume an address or idempotency key 512 caseswork::tests::properties::money::expansions::oversized_invoices_do_not_consume_an_address_or_idempotency_key5.5 s
- ✓Process death during sqlite work recovers exactly once money 512 caseswork::tests::properties::money::expansions::process_death_during_sqlite_work_recovers_exactly_once_money19.8 s
- ✓Reorg collection of a 255 output pool payment faulted at once 512 caseswork::tests::properties::money::expansions::reorg_collection_of_a_255_output_pool_payment_faulted_at_once447 ms
- ✓Production worker crashes preserve atomic money 512 caseswork::tests::properties::money::expansions::production_worker_crashes_preserve_atomic_money34.7 s
- ✓Reorg collection of pool outputs crosses full queue pages without losing outputs 512 caseswork::tests::properties::money::expansions::reorg_collection_of_pool_outputs_crosses_full_queue_pages_without_losing_outputs3 min
- ✓Reorg collection of mined outputs crosses full queue pages without losing outputs 512 caseswork::tests::properties::money::expansions::reorg_collection_of_mined_outputs_crosses_full_queue_pages_without_losing_outputs4 min
- ✓Repeated recovery process deaths preserve obligations 512 caseswork::tests::properties::money::expansions::repeated_recovery_process_deaths_preserve_obligations1 min
- ✓Unrepresentable amounts fail without corrupting stored money 512 caseswork::tests::properties::money::expansions::unrepresentable_amounts_fail_without_corrupting_stored_money12.2 s
- ✓Stored amount boundaries survive scanning mining and restarts 512 caseswork::tests::properties::money::expansions::stored_amount_boundaries_survive_scanning_mining_and_restarts35.9 s
- ✓Repeated multi order forks faults and restarts preserve money 512 caseswork::tests::properties::money::expansions::repeated_multi_order_forks_faults_and_restarts_preserve_money3 min
- ✓Settlement queue wraparound recomputes every order once 512 caseswork::tests::properties::money::expansions::settlement_queue_wraparound_recomputes_every_order_once2 min
engine::work::properties::money::nodes4234 min
- ✓An outer timeout cools the pinned node and the next money round uses a fallbackwork::tests::properties::money::nodes::an_outer_timeout_cools_the_pinned_node_and_the_next_money_round_uses_a_fallback72 ms
- ✓Cancellation of any pinned rpc records failure without mixing node answerswork::tests::properties::money::nodes::cancellation_of_any_pinned_rpc_records_failure_without_mixing_node_answers909 ms
- ✓Corroborated key images match an independent vote model even with hangswork::tests::properties::money::nodes::corroborated_key_images_match_an_independent_vote_model_even_with_hangs17 ms
- ✓Corroborated locations preserve positive evidence and bound unreachable nodeswork::tests::properties::money::nodes::corroborated_locations_preserve_positive_evidence_and_bound_unreachable_nodes18 ms
- ✓Every malformed response shape is checked with a restartwork::tests::properties::money::nodes::every_malformed_response_shape_is_checked_with_a_restart525 ms
- ✓Failover histories bound hangs and recover the highest priority eligible nodework::tests::properties::money::nodes::failover_histories_bound_hangs_and_recover_the_highest_priority_eligible_node18 ms
- ✓All node outages preserve money and recover once one node returnswork::tests::properties::money::nodes::all_node_outages_preserve_money_and_recover_once_one_node_returns2.9 s
- ✓Hanging peers do not discard healthy location or spent answerswork::tests::properties::money::nodes::hanging_peers_do_not_discard_healthy_location_or_spent_answers10 ms
- ✓False mining locations without block membership cannot unlock verified settlementwork::tests::properties::money::nodes::false_mining_locations_without_block_membership_cannot_unlock_verified_settlement3.5 s
- ✓False spent votes and last reachable node policy preserve payment identity on recoverywork::tests::properties::money::nodes::false_spent_votes_and_last_reachable_node_policy_preserve_payment_identity_on_recovery3.0 s
- ✓Hanging secondary retracts double spends within the settlement budgetwork::tests::properties::money::nodes::hanging_secondary_retracts_double_spends_within_the_settlement_budget1.9 s
- ✓Malformed missing and reordered bodies never publish an unfinished blockwork::tests::properties::money::nodes::malformed_missing_and_reordered_bodies_never_publish_an_unfinished_block2.6 s
- ✓Inflated tips and false attestations cannot bypass enabled verificationwork::tests::properties::money::nodes::inflated_tips_and_false_attestations_cannot_bypass_enabled_verification3.4 s
- ✓Omitted pool transactions delay detection without creating false paymentswork::tests::properties::money::nodes::omitted_pool_transactions_delay_detection_without_creating_false_payments1.9 s
- ✓Responses at transport deadline boundaries preserve failover and recoverywork::tests::properties::money::nodes::responses_at_transport_deadline_boundaries_preserve_failover_and_recovery17 ms
- ✓Sole configured and sole reachable votes have the same explicit trust limitwork::tests::properties::money::nodes::sole_configured_and_sole_reachable_votes_have_the_same_explicit_trust_limit187 ms
- ✓Multi node money histories survive conflicting branches hangs outages and restartswork::tests::properties::money::nodes::multi_node_money_histories_survive_conflicting_branches_hangs_outages_and_restarts7.1 s
- ✓Tenant pages yield to other tiers and resume without losing moneywork::tests::properties::money::nodes::tenant_pages_yield_to_other_tiers_and_resume_without_losing_money4.5 s
- ✓Zero confirmation and unverified height trust boundaries are explicitwork::tests::properties::money::nodes::zero_confirmation_and_unverified_height_trust_boundaries_are_explicit2.2 s
- ✓Real verifier and scanner reconcile verified payments across forks and restartswork::tests::properties::money::nodes::real_verifier_and_scanner_reconcile_verified_payments_across_forks_and_restarts14.0 s
- ✓Real verifier and scanner reconcile verified payments across forks and restarts with a forged primarywork::tests::properties::money::nodes::real_verifier_and_scanner_reconcile_verified_payments_across_forks_and_restarts_with_a_forged_primary14.2 s
- ✓An outer timeout cools the pinned node and the next money round uses a fallback 512 caseswork::tests::properties::money::nodes::an_outer_timeout_cools_the_pinned_node_and_the_next_money_round_uses_a_fallback48 ms
- ✓Cancellation of any pinned rpc records failure without mixing node answers 512 caseswork::tests::properties::money::nodes::cancellation_of_any_pinned_rpc_records_failure_without_mixing_node_answers7.5 s
- ✓Corroborated key images match an independent vote model even with hangs 512 caseswork::tests::properties::money::nodes::corroborated_key_images_match_an_independent_vote_model_even_with_hangs19 ms
- ✓Corroborated locations preserve positive evidence and bound unreachable nodes 512 caseswork::tests::properties::money::nodes::corroborated_locations_preserve_positive_evidence_and_bound_unreachable_nodes19 ms
- ✓Every malformed response shape is checked with a restart 512 caseswork::tests::properties::money::nodes::every_malformed_response_shape_is_checked_with_a_restart383 ms
- ✓Failover histories bound hangs and recover the highest priority eligible node 512 caseswork::tests::properties::money::nodes::failover_histories_bound_hangs_and_recover_the_highest_priority_eligible_node20 ms
- ✓All node outages preserve money and recover once one node returns 512 caseswork::tests::properties::money::nodes::all_node_outages_preserve_money_and_recover_once_one_node_returns22.6 s
- ✓Hanging peers do not discard healthy location or spent answers 512 caseswork::tests::properties::money::nodes::hanging_peers_do_not_discard_healthy_location_or_spent_answers8 ms
- ✓False mining locations without block membership cannot unlock verified settlement 512 caseswork::tests::properties::money::nodes::false_mining_locations_without_block_membership_cannot_unlock_verified_settlement26.6 s
- ✓False spent votes and last reachable node policy preserve payment identity on recovery 512 caseswork::tests::properties::money::nodes::false_spent_votes_and_last_reachable_node_policy_preserve_payment_identity_on_recovery21.8 s
- ✓Hanging secondary retracts double spends within the settlement budget 512 caseswork::tests::properties::money::nodes::hanging_secondary_retracts_double_spends_within_the_settlement_budget14.7 s
- ✓Malformed missing and reordered bodies never publish an unfinished block 512 caseswork::tests::properties::money::nodes::malformed_missing_and_reordered_bodies_never_publish_an_unfinished_block17.4 s
- ✓Inflated tips and false attestations cannot bypass enabled verification 512 caseswork::tests::properties::money::nodes::inflated_tips_and_false_attestations_cannot_bypass_enabled_verification21.6 s
- ✓Omitted pool transactions delay detection without creating false payments 512 caseswork::tests::properties::money::nodes::omitted_pool_transactions_delay_detection_without_creating_false_payments13.0 s
- ✓Responses at transport deadline boundaries preserve failover and recovery 512 caseswork::tests::properties::money::nodes::responses_at_transport_deadline_boundaries_preserve_failover_and_recovery21 ms
- ✓Sole configured and sole reachable votes have the same explicit trust limit 512 caseswork::tests::properties::money::nodes::sole_configured_and_sole_reachable_votes_have_the_same_explicit_trust_limit107 ms
- ✓Multi node money histories survive conflicting branches hangs outages and restarts 512 caseswork::tests::properties::money::nodes::multi_node_money_histories_survive_conflicting_branches_hangs_outages_and_restarts43.0 s
- ✓Zero confirmation and unverified height trust boundaries are explicit 512 caseswork::tests::properties::money::nodes::zero_confirmation_and_unverified_height_trust_boundaries_are_explicit13.4 s
- ✓Tenant pages yield to other tiers and resume without losing money 512 caseswork::tests::properties::money::nodes::tenant_pages_yield_to_other_tiers_and_resume_without_losing_money27.9 s
- ✓Real verifier and scanner reconcile verified payments across forks and restarts 512 caseswork::tests::properties::money::nodes::real_verifier_and_scanner_reconcile_verified_payments_across_forks_and_restarts14 min
- ✓Real verifier and scanner reconcile verified payments across forks and restarts with a forged primary 512 caseswork::tests::properties::money::nodes::real_verifier_and_scanner_reconcile_verified_payments_across_forks_and_restarts_with_a_forged_primary16 min
engine::work::scale117.6 s
- ✓Tenant groups recover without cross creditwork::tests::scale::tenant_groups_recover_without_cross_credit17.6 s
engine::work::scheduler::properties22325 ms
- ✓Backwards clock observations cannot extend an expired sharework::scheduler::properties::backwards_clock_observations_cannot_extend_an_expired_share10 ms
- ✓Every combination of tier results preserves the progress floorwork::scheduler::properties::every_combination_of_tier_results_preserves_the_progress_floor17 ms
- ✓Full width round budgets preserve share deadlineswork::scheduler::properties::full_width_round_budgets_preserve_share_deadlines11 ms
- ✓Late completions from another round are rejectedwork::scheduler::properties::late_completions_from_another_round_are_rejected11 ms
- ✓Outstanding and duplicate completions cannot change progresswork::scheduler::properties::outstanding_and_duplicate_completions_cannot_change_progress12 ms
- ✓Retry boundaries saturate and never wrapwork::scheduler::properties::retry_boundaries_saturate_and_never_wrap11 ms
- ✓Retry count at u32 max stays cappedwork::scheduler::properties::retry_count_at_u32_max_stays_capped10 ms
- ✓Retry expiry boundaries use production upkeepwork::scheduler::properties::retry_expiry_boundaries_use_production_upkeep12 ms
- ✓Retry histories reset and expire independentlywork::scheduler::properties::retry_histories_reset_and_expire_independently48 ms
- ✓Retry policy decision grid checks free attempts and deadlineswork::scheduler::properties::retry_policy_decision_grid_checks_free_attempts_and_deadlines12 ms
- ✓Scheduler matches the two pass contractwork::scheduler::properties::scheduler_matches_the_two_pass_contract15 ms
- ✓Backwards clock observations cannot extend an expired share 512 caseswork::scheduler::properties::backwards_clock_observations_cannot_extend_an_expired_share6 ms
- ✓Every combination of tier results preserves the progress floor 512 caseswork::scheduler::properties::every_combination_of_tier_results_preserves_the_progress_floor8 ms
- ✓Full width round budgets preserve share deadlines 512 caseswork::scheduler::properties::full_width_round_budgets_preserve_share_deadlines8 ms
- ✓Late completions from another round are rejected 512 caseswork::scheduler::properties::late_completions_from_another_round_are_rejected7 ms
- ✓Outstanding and duplicate completions cannot change progress 512 caseswork::scheduler::properties::outstanding_and_duplicate_completions_cannot_change_progress7 ms
- ✓Retry boundaries saturate and never wrap 512 caseswork::scheduler::properties::retry_boundaries_saturate_and_never_wrap7 ms
- ✓Retry count at u32 max stays capped 512 caseswork::scheduler::properties::retry_count_at_u32_max_stays_capped7 ms
- ✓Retry expiry boundaries use production upkeep 512 caseswork::scheduler::properties::retry_expiry_boundaries_use_production_upkeep7 ms
- ✓Retry histories reset and expire independently 512 caseswork::scheduler::properties::retry_histories_reset_and_expire_independently79 ms
- ✓Retry policy decision grid checks free attempts and deadlines 512 caseswork::scheduler::properties::retry_policy_decision_grid_checks_free_attempts_and_deadlines9 ms
- ✓Scheduler matches the two pass contract 512 caseswork::scheduler::properties::scheduler_matches_the_two_pass_contract11 ms
engine::work::tuning454 ms
- ✓A tuning that breaks a relation is refusedwork::tuning::tests::a_tuning_that_breaks_a_relation_is_refused15 ms
- ✓Response caps follow the budget and the groupswork::tuning::tests::response_caps_follow_the_budget_and_the_groups13 ms
- ✓The default shares out a ten second roundwork::tuning::tests::the_default_shares_out_a_ten_second_round12 ms
- ✓The round grows only for a page that cannot fit its sharework::tuning::tests::the_round_grows_only_for_a_page_that_cannot_fit_its_share14 ms
Webhooks 10 groups941 min
WebhookReceiverTest10941 ms
- ✓Correctly signed known event returns 200 and processes itWebhookReceiverTest::test_correctly_signed_known_event_returns_200_and_processes_it248 ms
- ✓Missing signature is rejected and the order is left untouchedWebhookReceiverTest::test_missing_signature_is_rejected_and_the_order_is_left_untouched52 ms
- ✓Invalid signature is rejected and the order is left untouchedWebhookReceiverTest::test_invalid_signature_is_rejected_and_the_order_is_left_untouched51 ms
- ✓Signature valid under a different secret is rejectedWebhookReceiverTest::test_signature_valid_under_a_different_secret_is_rejected51 ms
- ✓A delivery signed too long ago is rejected as a replayWebhookReceiverTest::test_a_delivery_signed_too_long_ago_is_rejected_as_a_replay51 ms
- ✓Correctly signed but malformed body is rejected as bad requestWebhookReceiverTest::test_correctly_signed_but_malformed_body_is_rejected_as_bad_request3 ms
- ✓Correctly signed body missing required envelope fields is rejected as bad requestWebhookReceiverTest::test_correctly_signed_body_missing_required_envelope_fields_is_rejected_as_bad_request3 ms
- ✓Unknown order id is rejected cleanly as not found with no fatalWebhookReceiverTest::test_unknown_order_id_is_rejected_cleanly_as_not_found_with_no_fatal5 ms
- ✓A repeated event id is skipped and not double processedWebhookReceiverTest::test_a_repeated_event_id_is_skipped_and_not_double_processed197 ms
- ✓Two different events for the same order are both appliedWebhookReceiverTest::test_two_different_events_for_the_same_order_are_both_applied280 ms
WebhookSignatureTest718 ms
- ✓Php hmac matches the known vector from shared webhook sign rsWebhookSignatureTest::test_php_hmac_matches_the_known_vector_from_shared_webhook_sign_rs3 ms
- ✓Verification rejects a tampered payloadWebhookSignatureTest::test_verification_rejects_a_tampered_payload3 ms
- ✓Verification rejects a moved timestampWebhookSignatureTest::test_verification_rejects_a_moved_timestamp3 ms
- ✓Verification accepts only within the tolerance of nowWebhookSignatureTest::test_verification_accepts_only_within_the_tolerance_of_now3 ms
- ✓Verification rejects the wrong secretWebhookSignatureTest::test_verification_rejects_the_wrong_secret3 ms
- ✓Verification rejects a missing or malformed signatureWebhookSignatureTest::test_verification_rejects_a_missing_or_malformed_signature3 ms
- ✓Verification rejects when no secret is configuredWebhookSignatureTest::test_verification_rejects_when_no_secret_is_configured2 ms
WebhookStatusMappingTest122.5 s
- ✓Status mapping with data set "order.pending -> pending"WebhookStatusMappingTest::test_status_mapping with data set "order.pending -> pending"79 ms
- ✓Status mapping with data set "order.unconfirmed -> on-hold"WebhookStatusMappingTest::test_status_mapping with data set "order.unconfirmed -> on-hold"208 ms
- ✓Status mapping with data set "order.confirming -> on-hold"WebhookStatusMappingTest::test_status_mapping with data set "order.confirming -> on-hold"223 ms
- ✓Status mapping with data set "order.partial -> on-hold"WebhookStatusMappingTest::test_status_mapping with data set "order.partial -> on-hold"223 ms
- ✓Status mapping with data set "order.paid -> processing/completed"WebhookStatusMappingTest::test_status_mapping with data set "order.paid -> processing/completed"234 ms
- ✓Status mapping with data set "order.overpaid -> processing/completed"WebhookStatusMappingTest::test_status_mapping with data set "order.overpaid -> processing/completed"235 ms
- ✓Status mapping with data set "order.expired -> cancelled"WebhookStatusMappingTest::test_status_mapping with data set "order.expired -> cancelled"201 ms
- ✓Order pending after a double spend void wipes out the only payment is a real reachable regressionWebhookStatusMappingTest::test_order_pending_after_a_double_spend_void_wipes_out_the_only_payment_is_a_real_reachable_regression213 ms
- ✓Overpaid adds an explicit manual refund note beyond the payment complete noteWebhookStatusMappingTest::test_overpaid_adds_an_explicit_manual_refund_note_beyond_the_payment_complete_note221 ms
- ✓Expired note explains manual handling is required for any partial fundsWebhookStatusMappingTest::test_expired_note_explains_manual_handling_is_required_for_any_partial_funds198 ms
- ✓Double spend detected adds a prominent note without changing status by itselfWebhookStatusMappingTest::test_double_spend_detected_adds_a_prominent_note_without_changing_status_by_itself206 ms
- ✓Double spend reversed adds a note with the txid without changing status by itselfWebhookStatusMappingTest::test_double_spend_reversed_adds_a_note_with_the_txid_without_changing_status_by_itself210 ms
monokulo::http::webhooks192.7 s
- ✓A deliverys detail is a page without javascripthttp::webhooks::tests::a_deliverys_detail_is_a_page_without_javascript154 ms
- ✓A different user cannot create or delete webhooks on someone elses connectionhttp::webhooks::tests::a_different_user_cannot_create_or_delete_webhooks_on_someone_elses_connection203 ms
- ✓A healthy webhooks deliveries stay folded and an empty card offers to add onehttp::webhooks::tests::a_healthy_webhooks_deliveries_stay_folded_and_an_empty_card_offers_to_add_one228 ms
- ✓A webhooks deliveries page twenty at a timehttp::webhooks::tests::a_webhooks_deliveries_page_twenty_at_a_time195 ms
- ✓A merchants webhook endpoint receives the paid notification with its custom header and a valid signaturehttp::webhooks::tests::a_merchants_webhook_endpoint_receives_the_paid_notification_with_its_custom_header_and_a_valid_signature262 ms
- ✓Another accounts webhooks and deliveries are not foundhttp::webhooks::tests::another_accounts_webhooks_and_deliveries_are_not_found205 ms
- ✓Creating a webhook shows its signing secret once and lists it afterwardhttp::webhooks::tests::creating_a_webhook_shows_its_signing_secret_once_and_lists_it_afterward154 ms
- ✓Creating a webhook with a malformed header line shows a clear error and registers nothinghttp::webhooks::tests::creating_a_webhook_with_a_malformed_header_line_shows_a_clear_error_and_registers_nothing162 ms
- ✓Creating a webhook with an empty url shows a clear errorhttp::webhooks::tests::creating_a_webhook_with_an_empty_url_shows_a_clear_error157 ms
- ✓Creating a webhook with an invalid url says whyhttp::webhooks::tests::creating_a_webhook_with_an_invalid_url_says_why152 ms
- ✓Parse extra headers on empty input returns an empty map not an errorhttp::webhooks::tests::parse_extra_headers_on_empty_input_returns_an_empty_map_not_an_error13 ms
- ✓Parse extra headers reads one header name value pair per linehttp::webhooks::tests::parse_extra_headers_reads_one_header_name_value_pair_per_line13 ms
- ✓Parse extra headers rejects a line with no colonhttp::webhooks::tests::parse_extra_headers_rejects_a_line_with_no_colon13 ms
- ✓Parse extra headers rejects an empty header namehttp::webhooks::tests::parse_extra_headers_rejects_an_empty_header_name11 ms
- ✓Creating a webhook with custom headers keeps themhttp::webhooks::tests::creating_a_webhook_with_custom_headers_keeps_them150 ms
- ✓Deleting a webhook is asked on a page then removes its deliverieshttp::webhooks::tests::deleting_a_webhook_is_asked_on_a_page_then_removes_its_deliveries159 ms
- ✓Deleting a webhook removes it from the listhttp::webhooks::tests::deleting_a_webhook_removes_it_from_the_list174 ms
- ✓Send again and retry failed work as plain form postshttp::webhooks::tests::send_again_and_retry_failed_work_as_plain_form_posts165 ms
- ✓The card shows each webhooks health and its deliverieshttp::webhooks::tests::the_card_shows_each_webhooks_health_and_its_deliveries164 ms
monokulo::views::webhooks111 ms
- ✓A body is laid out in the order it was sentviews::webhooks::tests::a_body_is_laid_out_in_the_order_it_was_sent11 ms
monokulo::webhooks121.1 s
- ✓A delivery to a private address is refused unless allowedwebhooks::tests::a_delivery_to_a_private_address_is_refused_unless_allowed38 ms
- ✓A delivery is signed with the webhooks secret and names its eventwebhooks::tests::a_delivery_is_signed_with_the_webhooks_secret_and_names_its_event53 ms
- ✓A failing delivery follows the schedule then gives upwebhooks::tests::a_failing_delivery_follows_the_schedule_then_gives_up56 ms
- ✓A webhook is refused a reserved header or a url that isnt httpwebhooks::tests::a_webhook_is_refused_a_reserved_header_or_a_url_that_isnt_http25 ms
- ✓A redirect is not followedwebhooks::tests::a_redirect_is_not_followed48 ms
- ✓Deliveries go one per order oldest first and fairly across storeswebhooks::tests::deliveries_go_one_per_order_oldest_first_and_fairly_across_stores28 ms
- ✓Events without webhooks move the position and old events are ignoredwebhooks::tests::events_without_webhooks_move_the_position_and_old_events_are_ignored29 ms
- ✓Old deliveries are pruned delivered after 30 days given up after 90webhooks::tests::old_deliveries_are_pruned_delivered_after_30_days_given_up_after_9030 ms
- ✓Send again and retry failed start the schedule overwebhooks::tests::send_again_and_retry_failed_start_the_schedule_over58 ms
- ✓An engine event reaches the endpoint oncewebhooks::tests::an_engine_event_reaches_the_endpoint_once205 ms
- ✓The subscriber skips events the engine no longer haswebhooks::tests::the_subscriber_skips_events_the_engine_no_longer_has150 ms
- ✓The subscriber queues each event once across a restartwebhooks::tests::the_subscriber_queues_each_event_once_across_a_restart340 ms
monokulo::webhooks::body441 ms
- ✓A fiat orders body carries its price its rate and its storewebhooks::body::tests::a_fiat_orders_body_carries_its_price_its_rate_and_its_store9 ms
- ✓The rate is one xmr in the currency rounded to eight placeswebhooks::body::tests::the_rate_is_one_xmr_in_the_currency_rounded_to_eight_places8 ms
- ✓An order monokulo has no record of still gets a bodywebhooks::body::tests::an_order_monokulo_has_no_record_of_still_gets_a_body12 ms
- ✓An xmr orders body has no exchange ratewebhooks::body::tests::an_xmr_orders_body_has_no_exchange_rate12 ms
monokulo::webhooks::delivery439 ms
- ✓An ip literal url is classified before the requestwebhooks::delivery::tests::an_ip_literal_url_is_classified_before_the_request8 ms
- ✓Monokulos own headers are reservedwebhooks::delivery::tests::monokulos_own_headers_are_reserved11 ms
- ✓The resolver refuses a name with a private address and answers otherwisewebhooks::delivery::tests::the_resolver_refuses_a_name_with_a_private_address_and_answers_otherwise12 ms
- ✓The wait doubles from a minute to 64 minuteswebhooks::delivery::tests::the_wait_doubles_from_a_minute_to_64_minutes8 ms
shared::webhook_sign17105 ms
- ✓Cloud metadata address is rejectedwebhook_sign::tests::cloud_metadata_address_is_rejected5 ms
- ✓Cgnat shared address space is rejectedwebhook_sign::tests::cgnat_shared_address_space_is_rejected7 ms
- ✓Ipv4 compatible ipv6 is unmapped exactly like the ipv4 mapped formwebhook_sign::tests::ipv4_compatible_ipv6_is_unmapped_exactly_like_the_ipv4_mapped_form7 ms
- ✓Ipv4 mapped ipv6 loopback is rejectedwebhook_sign::tests::ipv4_mapped_ipv6_loopback_is_rejected6 ms
- ✓Known vector for cross language php verificationwebhook_sign::tests::known_vector_for_cross_language_php_verification5 ms
- ✓Ipv6 link local is rejectedwebhook_sign::tests::ipv6_link_local_is_rejected6 ms
- ✓Loopback resolved address is rejectedwebhook_sign::tests::loopback_resolved_address_is_rejected5 ms
- ✓Multicast and reserved ranges are rejected in both familieswebhook_sign::tests::multicast_and_reserved_ranges_are_rejected_in_both_families6 ms
- ✓Private lan resolved address is rejectedwebhook_sign::tests::private_lan_resolved_address_is_rejected7 ms
- ✓Public https url with a public ip is allowedwebhook_sign::tests::public_https_url_with_a_public_ip_is_allowed6 ms
- ✓Signature is sensitive to the secret the payload and the timewebhook_sign::tests::signature_is_sensitive_to_the_secret_the_payload_and_the_time6 ms
- ✓Signature matches a fixed test vectorwebhook_sign::tests::signature_matches_a_fixed_test_vector6 ms
- ✓The whole zero network is rejected not just the unspecified addresswebhook_sign::tests::the_whole_zero_network_is_rejected_not_just_the_unspecified_address7 ms
- ✓Translation prefixes are classified by the ipv4 address they embedwebhook_sign::tests::translation_prefixes_are_classified_by_the_ipv4_address_they_embed6 ms
- ✓Verify refuses a delivery signed too long ago or too far aheadwebhook_sign::tests::verify_refuses_a_delivery_signed_too_long_ago_or_too_far_ahead6 ms
- ✓Verify compares the decoded tag in constant time and refuses every near misswebhook_sign::tests::verify_compares_the_decoded_tag_in_constant_time_and_refuses_every_near_miss7 ms
- ✓Verify rejects a tampered payload or timestampwebhook_sign::tests::verify_rejects_a_tampered_payload_or_timestamp7 ms
store-webhooks856.7 s
- ✓Each webhook says how it is doing; the deliveries of one that needs you are openstore-webhooks.spec.js24.3 s
- ✓The All deliveries page keeps Details and Send again in fixed columns, wide and on a phonestore-webhooks.spec.js945 ms
- ✓Retry failed queues the given-up deliveries again and says sostore-webhooks.spec.js977 ms
- ✓A delivery's details open as a dialog, with its attempts, request and last responsestore-webhooks.spec.js9.7 s
- ✓A webhook with many deliveries pages through them in place, 20 at a timestore-webhooks.spec.js9.4 s
- ✓Without JavaScript the deliveries page through the All deliveries pagestore-webhooks.spec.js1.1 s
- ✓A store with no webhooks offers to add onestore-webhooks.spec.js7.0 s
- ✓Without JavaScript, Details and Delete are pages and Send again is a formstore-webhooks.spec.js3.2 s
Checkout and POS 16 groups21711 min
checkout281 min
- ✓Real checkout saves a QR refund address and restores a saved address after editingcheckout.spec.js4.1 s
- ✓Real checkout validates, shows saving, rejects a response, and retriescheckout.spec.js5.0 s
- ✓Real checkout live update preserves a focused partial refund addresscheckout.spec.js691 ms
- ✓Real checkout keeps retry and camera upload paths after failurescheckout.spec.js4.0 s
- ✓Real checkout copies and selects payment address at narrow and wide widthscheckout.spec.js962 ms
- ✓Real compact checkout keeps the refund controls inside a full width fieldcheckout.spec.js2.8 s
- ✓Real tall checkout keeps one background and a readable progress barcheckout.spec.js631 ms
- ✓Real checkout renders a paid order without opening a live streamcheckout.spec.js3.5 s
- ✓Real checkout retains manual refund entry without JavaScriptcheckout.spec.js2.9 s
- ✓Client refund option frames the real checkout and retains its status streamcheckout.spec.js799 ms
- ✓Client falls back to status polling when its stream is refusedcheckout.spec.js878 ms
- ✓Real restricted checkout permits its own origin and blocks another origincheckout.spec.js698 ms
- ✓Real frame-only checkout refuses a top-level navigationcheckout.spec.js914 ms
- ✓Real checkout open while the customer pays shows paid and stops following the ordercheckout.spec.js767 ms
- ✓Real checkout keeps retrying a refused live stream with backoff and then follows the ordercheckout.spec.js1.0 s
- ✓Real checkout copies the payment address without the Clipboard API, as over plain-HTTP onion, or leaves it selected to copy by handcheckout.spec.js799 ms
- ✓Real checkout saves the address the customer ends with when they change it mid-savecheckout.spec.js2.0 s
- ✓Real checkout saves on Enter without leaving the pagecheckout.spec.js694 ms
- ✓Real checkout reads a wallet payment-URI QR and explains images it cannot usecheckout.spec.js839 ms
- ✓Real checkout follows the customer payment from the mempool to confirmed and lists itcheckout.spec.js2.9 s
- ✓Real checkout guides a customer who underpays and then sends too muchcheckout.spec.js615 ms
- ✓Real checkout says so when the chosen refund QR photo cannot be readcheckout.spec.js727 ms
- ✓Real checkout keeps the amount and XMR on one line and shows a fiat equivalent only for fiat orderscheckout.spec.js3.7 s
- ✓Real checkout takes its theme from ?theme=, the embed option, and the signed-in viewer on the share pagecheckout.spec.js3.0 s
- ✓Real share page grows its frame to the whole checkout, so nothing scrolls inside itcheckout.spec.js1.3 s
- ✓Real checkout payment problems as the customer sees them (UI stages)checkout.spec.js9.1 s
- ✓Real checkout leads with the stage in one column and fades the code once paidcheckout.spec.js4.0 s
- ✓Real checkout shows times in the customer's own zone, or the one ?timezone= namescheckout.spec.js1.1 s
live-view1357.1 s
- ✓The engine page follows the engine live, scrubs, replays and moves its windowlive-view.spec.js22.5 s
- ✓The chain strip shows more blocks when wider, never wider blockslive-view.spec.js1.7 s
- ✓The round lanes use the width, their chips on their own row at the rightlive-view.spec.js1.4 s
- ✓The network picker goes at once with JavaScript, with Go withoutlive-view.spec.js2.8 s
- ✓The machine strip and the Scanning panel follow the engine livelive-view.spec.js14.2 s
- ✓The chain strip labels its blocks from above, at the right blockslive-view.spec.js2.6 s
- ✓The round card has room: inset bars, its end marker, chips apartlive-view.spec.js1.3 s
- ✓On a phone a gap between the thresholds is joinedlive-view.spec.js1.1 s
- ✓The script stacks labels by the same rule as the serverlive-view.spec.js4 ms
- ✓The chain strip labels take as few levels as they can, with 1px leaderslive-view.spec.js3.6 s
- ✓The timeline scrub bar reaches the playback controllive-view.spec.js2.9 s
- ✓Without JavaScript the engine page is the network as of nowlive-view.spec.js2.9 s
- ✓The engine page is for admins onlylive-view.spec.js163 ms
live-view-performance12.8 s
- ✓Live view remains responsive and bounded through sustained activity and stream recoverylive-view-performance.spec.js2.8 s
merchant-client74.1 s
- ✓Merchant site creates an order, mounts the checkout, and is told once when it is paidmerchant-client.spec.js670 ms
- ✓Merchant site is told when an unpaid order expiresmerchant-client.spec.js600 ms
- ✓Merchant site gets the server's reason when an order cannot be createdmerchant-client.spec.js379 ms
- ✓Merchant single-page app re-rendering the payment widget keeps one live checkoutmerchant-client.spec.js672 ms
- ✓Merchant site keeps following an order through a status outage when its stream is refusedmerchant-client.spec.js805 ms
- ✓A visitor past the rate limit, or asked for proof on a plain-HTTP shop, gets a clear failuremerchant-client.spec.js471 ms
- ✓A merchant wiring up the library wrongly gets an error saying what to fixmerchant-client.spec.js514 ms
pos-responsive-layout1538.5 s
- ✓Real POS fits iPhone SE portrait (375x667)pos-responsive-layout.spec.js2.3 s
- ✓Real POS fits iPhone SE landscape (667x375)pos-responsive-layout.spec.js3.5 s
- ✓Real POS fits iPhone 14 portrait (390x844)pos-responsive-layout.spec.js2.7 s
- ✓Real POS fits iPhone 14 landscape (844x390)pos-responsive-layout.spec.js2.4 s
- ✓Real POS fits iPad portrait (768x1024)pos-responsive-layout.spec.js2.5 s
- ✓Real POS fits iPad landscape (1024x768)pos-responsive-layout.spec.js2.8 s
- ✓Real POS fits iPad Pro portrait (1024x1366)pos-responsive-layout.spec.js2.6 s
- ✓Real POS fits iPad Pro landscape (1366x1024)pos-responsive-layout.spec.js2.4 s
- ✓Real POS fits Pixel 7 portrait (412x915)pos-responsive-layout.spec.js2.6 s
- ✓Real POS fits Pixel 7 landscape (915x412)pos-responsive-layout.spec.js2.5 s
- ✓Real POS fits Galaxy S8 portrait (360x740)pos-responsive-layout.spec.js2.3 s
- ✓Real POS fits Galaxy S8 landscape (740x360)pos-responsive-layout.spec.js2.5 s
- ✓Real POS fits Galaxy Tab portrait (800x1280)pos-responsive-layout.spec.js2.3 s
- ✓Real POS fits Galaxy Tab landscape (1280x800)pos-responsive-layout.spec.js2.7 s
- ✓Real POS retains its fit after five viewport changespos-responsive-layout.spec.js2.3 s
pos-responsive-layout (Firefox)1554.8 s
- ✓Real POS fits iPhone SE portrait (375x667)pos-responsive-layout.spec.js4.6 s
- ✓Real POS fits iPhone SE landscape (667x375)pos-responsive-layout.spec.js3.3 s
- ✓Real POS fits iPhone 14 portrait (390x844)pos-responsive-layout.spec.js3.4 s
- ✓Real POS fits iPhone 14 landscape (844x390)pos-responsive-layout.spec.js3.6 s
- ✓Real POS fits iPad portrait (768x1024)pos-responsive-layout.spec.js3.6 s
- ✓Real POS fits iPad landscape (1024x768)pos-responsive-layout.spec.js3.7 s
- ✓Real POS fits iPad Pro portrait (1024x1366)pos-responsive-layout.spec.js4.9 s
- ✓Real POS fits iPad Pro landscape (1366x1024)pos-responsive-layout.spec.js4.6 s
- ✓Real POS fits Pixel 7 portrait (412x915)pos-responsive-layout.spec.js3.0 s
- ✓Real POS fits Pixel 7 landscape (915x412)pos-responsive-layout.spec.js3.7 s
- ✓Real POS fits Galaxy S8 portrait (360x740)pos-responsive-layout.spec.js3.1 s
- ✓Real POS fits Galaxy S8 landscape (740x360)pos-responsive-layout.spec.js3.2 s
- ✓Real POS fits Galaxy Tab portrait (800x1280)pos-responsive-layout.spec.js2.7 s
- ✓Real POS fits Galaxy Tab landscape (1280x800)pos-responsive-layout.spec.js3.4 s
- ✓Real POS retains its fit after five viewport changespos-responsive-layout.spec.js4.0 s
pos-responsive-layout (WebKit)1554.7 s
- ✓Real POS fits iPhone SE portrait (375x667)pos-responsive-layout.spec.js6.7 s
- ✓Real POS fits iPhone SE landscape (667x375)pos-responsive-layout.spec.js5.3 s
- ✓Real POS fits iPhone 14 portrait (390x844)pos-responsive-layout.spec.js2.8 s
- ✓Real POS fits iPhone 14 landscape (844x390)pos-responsive-layout.spec.js3.1 s
- ✓Real POS fits iPad portrait (768x1024)pos-responsive-layout.spec.js3.0 s
- ✓Real POS fits iPad landscape (1024x768)pos-responsive-layout.spec.js3.7 s
- ✓Real POS fits iPad Pro portrait (1024x1366)pos-responsive-layout.spec.js3.8 s
- ✓Real POS fits iPad Pro landscape (1366x1024)pos-responsive-layout.spec.js4.7 s
- ✓Real POS fits Pixel 7 portrait (412x915)pos-responsive-layout.spec.js2.7 s
- ✓Real POS fits Pixel 7 landscape (915x412)pos-responsive-layout.spec.js3.4 s
- ✓Real POS fits Galaxy S8 portrait (360x740)pos-responsive-layout.spec.js2.9 s
- ✓Real POS fits Galaxy S8 landscape (740x360)pos-responsive-layout.spec.js3.1 s
- ✓Real POS fits Galaxy Tab portrait (800x1280)pos-responsive-layout.spec.js3.3 s
- ✓Real POS fits Galaxy Tab landscape (1280x800)pos-responsive-layout.spec.js3.8 s
- ✓Real POS retains its fit after five viewport changespos-responsive-layout.spec.js2.3 s
pos-session-diagnostics (real binaries)220.0 s
- ✓A POS session reads as one timeline, from opting in to the last eventpos-session-diagnostics.spec.js19.8 s
- ✓Log reports past their limit are dropped with a 429, never a challenge, and nothing else is held uppos-session-diagnostics.spec.js234 ms
pos-session-diagnostics (real binaries, Firefox)218.4 s
- ✓A POS session reads as one timeline, from opting in to the last eventpos-session-diagnostics.spec.js18.2 s
- ✓Log reports past their limit are dropped with a 429, never a challenge, and nothing else is held uppos-session-diagnostics.spec.js214 ms
pos-session-diagnostics (real binaries, WebKit)27.7 s
- ✓A POS session reads as one timeline, from opting in to the last eventpos-session-diagnostics.spec.js7.6 s
- ✓Log reports past their limit are dropped with a 429, never a challenge, and nothing else is held uppos-session-diagnostics.spec.js83 ms
pos-terminal352 min
- ✓Real POS backgrounds, reloads, reopens, cancels, and searches an orderpos-terminal.spec.js7.9 s
- ✓Real POS header stays above its payment card and its actions stay reachablepos-terminal.spec.js2.0 s
- ✓Real POS displays a shortened ID for an order without a referencepos-terminal.spec.js2.0 s
- ✓Real POS opens an empty keypad when its order list is emptypos-terminal.spec.js1.5 s
- ✓Real POS shows pending, partial, confirming, and terminal badge symbolspos-terminal.spec.js2.2 s
- ✓Real POS payment card copies the address and saves a refund addresspos-terminal.spec.js3.2 s
- ✓Real POS copies the address from a selection where the clipboard API is missing, and says when it could not copypos-terminal.spec.js2.0 s
- ✓Real POS uses the site theme toggle, applies it in place and remembers itpos-terminal.spec.js2.9 s
- ✓Real POS header is the site app bar: the mark, the store, a POS label, the status indicator and the account menupos-terminal.spec.js2.4 s
- ✓Real dashboard health indicator follows healthy and unavailable pollspos-terminal.spec.js1.2 s
- ✓Merchant rings up a sale on a physical keyboardpos-terminal.spec.js6.8 s
- ✓Customer pays while the order is on screen and the merchant starts the next salepos-terminal.spec.js6.7 s
- ✓A delayed order read cannot undo a live payment, but a later reorg canpos-terminal.spec.js2.1 s
- ✓Customer underpays: the card asks for the rest and the order cannot be cancelledpos-terminal.spec.js4.1 s
- ✓Customer walks away: the order on screen expirespos-terminal.spec.js3.7 s
- ✓Counter loses its connection: the order shows connection lost, then recovers by itselfpos-terminal.spec.js4.9 s
- ✓The server refuses the counter's update stream: the POS opens another itself, and the payment comes inpos-terminal.spec.js1.4 s
- ✓Merchant opens Cancel order then keeps the order: nothing happens until they confirmpos-terminal.spec.js2.3 s
- ✓Payment lands just before the merchant confirms a cancel: the server refuses and says whypos-terminal.spec.js1.9 s
- ✓Busy store sees every open order at once and narrows them by searchpos-terminal.spec.js2.2 s
- ✓An order list that failed to load when the POS opened comes back with Retrypos-terminal.spec.js1.6 s
- ✓Merchant records the customer refund address from a QR image, with clear failurespos-terminal.spec.js3.9 s
- ✓Charge whose response is lost is retried without creating a second orderpos-terminal.spec.js2.4 s
- ✓Payment waiting on the store's confirmations shows its progresspos-terminal.spec.js4.3 s
- ✓Double spend on the order on screen warns the merchant not to hand over goodspos-terminal.spec.js3.8 s
- ✓Store priced in AUD: the merchant keys in dollars and cents and sees both amounts throughoutpos-terminal.spec.js1.9 s
- ✓Payment countdown keeps ticking down while the customer finds their walletpos-terminal.spec.js3.1 s
- ✓Merchant moves between the keypad, the stack and the order listpos-terminal.spec.js2.5 s
- ✓Merchant denies the camera or picks a broken photo: the card says what to do insteadpos-terminal.spec.js1.9 s
- ✓Clearing a search brings the whole order list backpos-terminal.spec.js1.8 s
- ✓An order finished at the counter moves to Finished for this session onlypos-terminal.spec.js5.3 s
- ✓A backgrounded order that is paid while the merchant serves someone else moves to Finishedpos-terminal.spec.js2.0 s
- ✓Finished orders drop off the tab 24 hours after they finishedpos-terminal.spec.js2.2 s
- ✓A search with no match in this session links to searching all orderspos-terminal.spec.js2.1 s
- ✓On a tablet or desktop the POS uses the whole screen, with the open orders beside the keypad and a one-column paymentpos-terminal.spec.js4.9 s
pos-terminal (Firefox)352 min
- ✓Real POS backgrounds, reloads, reopens, cancels, and searches an orderpos-terminal.spec.js3.9 s
- ✓Real POS header stays above its payment card and its actions stay reachablepos-terminal.spec.js2.3 s
- ✓Real POS displays a shortened ID for an order without a referencepos-terminal.spec.js2.8 s
- ✓Real POS opens an empty keypad when its order list is emptypos-terminal.spec.js2.2 s
- ✓Real POS shows pending, partial, confirming, and terminal badge symbolspos-terminal.spec.js2.3 s
- ✓Real POS payment card copies the address and saves a refund addresspos-terminal.spec.js3.6 s
- ✓Real POS copies the address from a selection where the clipboard API is missing, and says when it could not copypos-terminal.spec.js2.1 s
- ✓Real POS uses the site theme toggle, applies it in place and remembers itpos-terminal.spec.js3.7 s
- ✓Real POS header is the site app bar: the mark, the store, a POS label, the status indicator and the account menupos-terminal.spec.js2.6 s
- ✓Real dashboard health indicator follows healthy and unavailable pollspos-terminal.spec.js1.5 s
- ✓Merchant rings up a sale on a physical keyboardpos-terminal.spec.js3.0 s
- ✓Customer pays while the order is on screen and the merchant starts the next salepos-terminal.spec.js2.3 s
- ✓A delayed order read cannot undo a live payment, but a later reorg canpos-terminal.spec.js2.2 s
- ✓Customer underpays: the card asks for the rest and the order cannot be cancelledpos-terminal.spec.js2.1 s
- ✓Customer walks away: the order on screen expirespos-terminal.spec.js2.2 s
- ✓Counter loses its connection: the order shows connection lost, then recovers by itselfpos-terminal.spec.js10.5 s
- ✓The server refuses the counter's update stream: the POS opens another itself, and the payment comes inpos-terminal.spec.js1.7 s
- ✓Merchant opens Cancel order then keeps the order: nothing happens until they confirmpos-terminal.spec.js2.1 s
- ✓Payment lands just before the merchant confirms a cancel: the server refuses and says whypos-terminal.spec.js2.9 s
- ✓Busy store sees every open order at once and narrows them by searchpos-terminal.spec.js2.3 s
- ✓An order list that failed to load when the POS opened comes back with Retrypos-terminal.spec.js1.8 s
- ✓Merchant records the customer refund address from a QR image, with clear failurespos-terminal.spec.js4.0 s
- ✓Charge whose response is lost is retried without creating a second orderpos-terminal.spec.js1.9 s
- ✓Payment waiting on the store's confirmations shows its progresspos-terminal.spec.js3.6 s
- ✓Double spend on the order on screen warns the merchant not to hand over goodspos-terminal.spec.js2.1 s
- ✓Store priced in AUD: the merchant keys in dollars and cents and sees both amounts throughoutpos-terminal.spec.js3.0 s
- ✓Payment countdown keeps ticking down while the customer finds their walletpos-terminal.spec.js4.6 s
- ✓Merchant moves between the keypad, the stack and the order listpos-terminal.spec.js2.8 s
- ✓Merchant denies the camera or picks a broken photo: the card says what to do insteadpos-terminal.spec.js2.0 s
- ✓Clearing a search brings the whole order list backpos-terminal.spec.js2.3 s
- ✓An order finished at the counter moves to Finished for this session onlypos-terminal.spec.js3.7 s
- ✓A backgrounded order that is paid while the merchant serves someone else moves to Finishedpos-terminal.spec.js2.5 s
- ✓Finished orders drop off the tab 24 hours after they finishedpos-terminal.spec.js2.4 s
- ✓A search with no match in this session links to searching all orderspos-terminal.spec.js2.5 s
- ✓On a tablet or desktop the POS uses the whole screen, with the open orders beside the keypad and a one-column paymentpos-terminal.spec.js4.2 s
pos-terminal (WebKit)352 min
- ✓Real POS backgrounds, reloads, reopens, cancels, and searches an orderpos-terminal.spec.js4.6 s
- ✓Real POS header stays above its payment card and its actions stay reachablepos-terminal.spec.js2.4 s
- ✓Real POS displays a shortened ID for an order without a referencepos-terminal.spec.js3.1 s
- ✓Real POS opens an empty keypad when its order list is emptypos-terminal.spec.js2.1 s
- ✓Real POS shows pending, partial, confirming, and terminal badge symbolspos-terminal.spec.js3.9 s
- ✓Real POS payment card copies the address and saves a refund addresspos-terminal.spec.js4.1 s
- ✓Real POS copies the address from a selection where the clipboard API is missing, and says when it could not copypos-terminal.spec.js2.4 s
- ✓Real POS uses the site theme toggle, applies it in place and remembers itpos-terminal.spec.js4.9 s
- ✓Real POS header is the site app bar: the mark, the store, a POS label, the status indicator and the account menupos-terminal.spec.js3.0 s
- ✓Real dashboard health indicator follows healthy and unavailable pollspos-terminal.spec.js1.8 s
- ✓Merchant rings up a sale on a physical keyboardpos-terminal.spec.js3.1 s
- ✓Customer pays while the order is on screen and the merchant starts the next salepos-terminal.spec.js2.7 s
- ✓A delayed order read cannot undo a live payment, but a later reorg canpos-terminal.spec.js2.4 s
- ✓Customer underpays: the card asks for the rest and the order cannot be cancelledpos-terminal.spec.js2.3 s
- ✓Customer walks away: the order on screen expirespos-terminal.spec.js2.3 s
- ✓Counter loses its connection: the order shows connection lost, then recovers by itselfpos-terminal.spec.js5.9 s
- ✓The server refuses the counter's update stream: the POS opens another itself, and the payment comes inpos-terminal.spec.js2.4 s
- ✓Merchant opens Cancel order then keeps the order: nothing happens until they confirmpos-terminal.spec.js2.7 s
- ✓Payment lands just before the merchant confirms a cancel: the server refuses and says whypos-terminal.spec.js2.5 s
- ✓Busy store sees every open order at once and narrows them by searchpos-terminal.spec.js3.3 s
- ✓An order list that failed to load when the POS opened comes back with Retrypos-terminal.spec.js2.0 s
- ✓Merchant records the customer refund address from a QR image, with clear failurespos-terminal.spec.js5.1 s
- ✓Charge whose response is lost is retried without creating a second orderpos-terminal.spec.js3.2 s
- ✓Payment waiting on the store's confirmations shows its progresspos-terminal.spec.js3.1 s
- ✓Double spend on the order on screen warns the merchant not to hand over goodspos-terminal.spec.js2.2 s
- ✓Store priced in AUD: the merchant keys in dollars and cents and sees both amounts throughoutpos-terminal.spec.js2.9 s
- ✓Payment countdown keeps ticking down while the customer finds their walletpos-terminal.spec.js4.6 s
- ✓Merchant moves between the keypad, the stack and the order listpos-terminal.spec.js3.3 s
- ✓Merchant denies the camera or picks a broken photo: the card says what to do insteadpos-terminal.spec.js2.6 s
- ✓Clearing a search brings the whole order list backpos-terminal.spec.js2.7 s
- ✓An order finished at the counter moves to Finished for this session onlypos-terminal.spec.js3.7 s
- ✓A backgrounded order that is paid while the merchant serves someone else moves to Finishedpos-terminal.spec.js2.5 s
- ✓Finished orders drop off the tab 24 hours after they finishedpos-terminal.spec.js3.2 s
- ✓A search with no match in this session links to searching all orderspos-terminal.spec.js2.8 s
- ✓On a tablet or desktop the POS uses the whole screen, with the open orders beside the keypad and a one-column paymentpos-terminal.spec.js4.7 s
refund-camera44.9 s
- ✓Real checkout scans a refund QR with the camera, then stops the camerarefund-camera.spec.js1.0 s
- ✓Real checkout camera can be stopped by the customer before it finds a coderefund-camera.spec.js948 ms
- ✓Merchant scans the customer refund QR with the POS tablet camerarefund-camera.spec.js1.5 s
- ✓POS tablet camera stopped before it finds a code leaves the field as it wasrefund-camera.spec.js1.4 s
refund-camera (Firefox)411.6 s
- ✓Real checkout scans a refund QR with the camera, then stops the camerarefund-camera.spec.js3.0 s
- ✓Real checkout camera can be stopped by the customer before it finds a coderefund-camera.spec.js3.2 s
- ✓Merchant scans the customer refund QR with the POS tablet camerarefund-camera.spec.js3.5 s
- ✓POS tablet camera stopped before it finds a code leaves the field as it wasrefund-camera.spec.js1.9 s
refund-camera (WebKit)47.9 s
- ✓Real checkout scans a refund QR with the camera, then stops the camerarefund-camera.spec.js2.0 s
- ✓Real checkout camera can be stopped by the customer before it finds a coderefund-camera.spec.js2.0 s
- ✓Merchant scans the customer refund QR with the POS tablet camerarefund-camera.spec.js2.4 s
- ✓POS tablet camera stopped before it finds a code leaves the field as it wasrefund-camera.spec.js1.5 s
Dashboard and settings 77 groups8684 min
admin-settings-and-nodes (real binaries)101 min
- ✓The tab bar switches tabs, and Back returns to the one before (with JavaScript)admin-settings-and-nodes.spec.js2.5 s
- ✓A node is added, moved up to primary and removed (with JavaScript)admin-settings-and-nodes.spec.js5.2 s
- ✓A node on another network is refused and nothing changes (with JavaScript)admin-settings-and-nodes.spec.js3.8 s
- ✓The tab bar switches tabs, and Back returns to the one before (without JavaScript)admin-settings-and-nodes.spec.js2.1 s
- ✓A node is added, moved up to primary and removed (without JavaScript)admin-settings-and-nodes.spec.js3.2 s
- ✓A node on another network is refused and nothing changes (without JavaScript)admin-settings-and-nodes.spec.js2.8 s
- ✓Use TLS shows and hides its row's self-signed boxadmin-settings-and-nodes.spec.js1.7 s
- ✓Saving without the last node of a network stores use asks firstadmin-settings-and-nodes.spec.js5.8 s
- ✓The Monero nodes tab is marked while the only node of a network stores use is downadmin-settings-and-nodes.spec.js17.8 s
- ✓Every tab, for the galleryadmin-settings-and-nodes.spec.js18.5 s
admin-settings-layout (real binaries)1148.4 s
- ✓Every setting is described, with examples, and nothing scrolls sideways (small phone)admin-settings-layout.spec.js4.7 s
- ✓Every setting is described, with examples, and nothing scrolls sideways (phone)admin-settings-layout.spec.js3.8 s
- ✓Every setting is described, with examples, and nothing scrolls sideways (desktop)admin-settings-layout.spec.js4.6 s
- ✓Clearing a network stores use asks first; one no store uses does notadmin-settings-layout.spec.js7.0 s
- ✓Banners fit and the red one uses the error colour (light, small phone)admin-settings-layout.spec.js3.9 s
- ✓Banners fit and the red one uses the error colour (light, phone)admin-settings-layout.spec.js3.9 s
- ✓Banners fit and the red one uses the error colour (light, desktop)admin-settings-layout.spec.js4.1 s
- ✓Banners fit and the red one uses the error colour (dark, small phone)admin-settings-layout.spec.js3.8 s
- ✓Banners fit and the red one uses the error colour (dark, phone)admin-settings-layout.spec.js4.0 s
- ✓Banners fit and the red one uses the error colour (dark, desktop)admin-settings-layout.spec.js5.0 s
- ✓An on/off setting is a switch: on and off both saveadmin-settings-layout.spec.js3.7 s
live-settings::nested_options743 ms
- ✓Each handle reads only its own keystests::nested_options::each_handle_reads_only_its_own_keys5 ms
- ✓A mistake in a nested table names the whole keytests::nested_options::a_mistake_in_a_nested_table_names_the_whole_key6 ms
- ✓A first nested save writes only the table it needstests::nested_options::a_first_nested_save_writes_only_the_table_it_needs7 ms
- ✓Init lists nested settings under their tabletests::nested_options::init_lists_nested_settings_under_their_table5 ms
- ✓Nested settings get their own options and keep their own keystests::nested_options::nested_settings_get_their_own_options_and_keep_their_own_keys6 ms
- ✓Nested tables with nobody to read them are refused with the hinttests::nested_options::nested_tables_with_nobody_to_read_them_are_refused_with_the_hint7 ms
- ✓Saves through both handles keep each others keystests::nested_options::saves_through_both_handles_keep_each_others_keys7 ms
live-settings::paths16 ms
- ✓A missing directory that cannot be made falls back to the working directorypaths::tests::a_missing_directory_that_cannot_be_made_falls_back_to_the_working_directory6 ms
live-settings::sources18121 ms
- ✓A database row for a setting the file holds is ignoredtests::sources::a_database_row_for_a_setting_the_file_holds_is_ignored6 ms
- ✓A file deleted while running is reloaded as empty not silently recreatedtests::sources::a_file_deleted_while_running_is_reloaded_as_empty_not_silently_recreated7 ms
- ✓A file the process cannot write refuses saves and stays as it wastests::sources::a_file_the_process_cannot_write_refuses_saves_and_stays_as_it_was8 ms
- ✓A missing file starts on the defaults and the first save creates ittests::sources::a_missing_file_starts_on_the_defaults_and_the_first_save_creates_it6 ms
- ✓A save writes through a symlink and keeps the files permissionstests::sources::a_save_writes_through_a_symlink_and_keeps_the_files_permissions7 ms
- ✓A save of the values already in effect writes nothingtests::sources::a_save_of_the_values_already_in_effect_writes_nothing8 ms
- ✓A secret is read without the store at starttests::sources::a_secret_is_read_without_the_store_at_start5 ms
- ✓An invalid value anywhere stops the starttests::sources::an_invalid_value_anywhere_stops_the_start7 ms
- ✓A value saved empty is kept in the file not turned back into the defaulttests::sources::a_value_saved_empty_is_kept_in_the_file_not_turned_back_into_the_default8 ms
- ✓An unreadable file stops the start and is never half appliedtests::sources::an_unreadable_file_stops_the_start_and_is_never_half_applied7 ms
- ✓Declarations keep each source to its kind of settingtests::sources::declarations_keep_each_source_to_its_kind_of_setting5 ms
- ✓Every setting is a command line option with help from its declarationtests::sources::every_setting_is_a_command_line_option_with_help_from_its_declaration7 ms
- ✓Each source wins over the ones below ittests::sources::each_source_wins_over_the_ones_below_it7 ms
- ✓Init writes a commented file that changes nothingtests::sources::init_writes_a_commented_file_that_changes_nothing7 ms
- ✓The options file refuses what it may not holdtests::sources::the_options_file_refuses_what_it_may_not_hold5 ms
- ✓Saves write the file in place and reloads apply editstests::sources::saves_write_the_file_in_place_and_reloads_apply_edits9 ms
- ✓The page cannot change what is given at starttests::sources::the_page_cannot_change_what_is_given_at_start6 ms
- ✓Two settings with one option are refusedtests::sources::two_settings_with_one_option_are_refused6 ms
live-settings::tests36222 ms
- ✓A blank environment variable is unsettests::a_blank_environment_variable_is_unset5 ms
- ✓A check of the values in effect has no changes and prepares nothingtests::a_check_of_the_values_in_effect_has_no_changes_and_prepares_nothing6 ms
- ✓A check refuses what a save would with the same errorstests::a_check_refuses_what_a_save_would_with_the_same_errors6 ms
- ✓A check reports what a save would do and stores installs and publishes nothingtests::a_check_reports_what_a_save_would_do_and_stores_installs_and_publishes_nothing7 ms
- ✓A cross field rule refuses the savetests::a_cross_field_rule_refuses_the_save7 ms
- ✓A failing prepare refuses the save writes nothing and drops what was preparedtests::a_failing_prepare_refuses_the_save_writes_nothing_and_drops_what_was_prepared7 ms
- ✓A failing write installs nothingtests::a_failing_write_installs_nothing6 ms
- ✓A key submitted twice is refusedtests::a_key_submitted_twice_is_refused6 ms
- ✓A restart setting is stored not installed and pending until a new registrytests::a_restart_setting_is_stored_not_installed_and_pending_until_a_new_registry7 ms
- ✓A save before boot is refusedtests::a_save_before_boot_is_refused6 ms
- ✓A save with one bad value changes nothing including the valid valuestests::a_save_with_one_bad_value_changes_nothing_including_the_valid_values6 ms
- ✓A setting given on the command line is locked and a save of it refusedtests::a_setting_given_on_the_command_line_is_locked_and_a_save_of_it_refused5 ms
- ✓A setting applies its range and check on top of its typetests::a_setting_applies_its_range_and_check_on_top_of_its_type6 ms
- ✓A secret comes from the environment and is never saved or showntests::a_secret_comes_from_the_environment_and_is_never_saved_or_shown7 ms
- ✓An install finishes even if the caller stops waitingtests::an_install_finishes_even_if_the_caller_stops_waiting5 ms
- ✓A successful save installs and readers see the new valuetests::a_successful_save_installs_and_readers_see_the_new_value7 ms
- ✓A value resolves the command line over stored over default and reports its sourcetests::a_value_resolves_the_command_line_over_stored_over_default_and_reports_its_source7 ms
- ✓Bind addr round trips and refuses an address without a porttests::bind_addr_round_trips_and_refuses_an_address_without_a_port5 ms
- ✓At boot a section whose values break a rule stops the starttests::at_boot_a_section_whose_values_break_a_rule_stops_the_start7 ms
- ✓At boot any invalid value stops the starttests::at_boot_any_invalid_value_stops_the_start6 ms
- ✓Build fails if a declared setting is in no sectiontests::build_fails_if_a_declared_setting_is_in_no_section5 ms
- ✓Boot follows each reloadables boot policytests::boot_follows_each_reloadables_boot_policy7 ms
- ✓Build fails if the store cannot be readtests::build_fails_if_the_store_cannot_be_read7 ms
- ✓Build fails on mistakes in the declarationstests::build_fails_on_mistakes_in_the_declarations5 ms
- ✓Comma list round trips and names the bad itemtests::comma_list_round_trips_and_names_the_bad_item6 ms
- ✓Deleting a stored value goes back to the defaulttests::deleting_a_stored_value_goes_back_to_the_default6 ms
- ✓Describe reports metadata and masks secretstests::describe_reports_metadata_and_masks_secrets7 ms
- ✓Http url round trips and refuses other schemestests::http_url_round_trips_and_refuses_other_schemes6 ms
- ✓Install is awaited under the save mutextests::install_is_awaited_under_the_save_mutex6 ms
- ✓Integers and bools parse render and refuse bad inputtests::integers_and_bools_parse_render_and_refuse_bad_input6 ms
- ✓Json round trips and refuses invalid documentstests::json_round_trips_and_refuses_invalid_documents6 ms
- ✓Live new holds a fixed valuetests::live_new_holds_a_fixed_value5 ms
- ✓Read sync returns the same section value the registry wouldtests::read_sync_returns_the_same_section_value_the_registry_would7 ms
- ✓Secret masks itself everywhere but the storetests::secret_masks_itself_everywhere_but_the_store6 ms
- ✓Two concurrent saves run one after the othertests::two_concurrent_saves_run_one_after_the_other7 ms
- ✓Unknown keys are refusedtests::unknown_keys_are_refused6 ms
monokulo::admin_nodes1196 ms
- ✓A bad address says what to fixadmin_nodes::tests::a_bad_address_says_what_to_fix9 ms
- ✓A button value round tripsadmin_nodes::tests::a_button_value_round_trips8 ms
- ✓A row s announcement address is kept and needs a zmq schemeadmin_nodes::tests::a_row_s_announcement_address_is_kept_and_needs_a_zmq_scheme9 ms
- ✓A saved node uses the engines defaults and its labeladmin_nodes::tests::a_saved_node_uses_the_engines_defaults_and_its_label8 ms
- ✓Addresses are host and port with an optional schemeadmin_nodes::tests::addresses_are_host_and_port_with_an_optional_scheme8 ms
- ✓Bad and repeated addresses are marked on their own rowadmin_nodes::tests::bad_and_repeated_addresses_are_marked_on_their_own_row9 ms
- ✓Every row button including at the edgesadmin_nodes::tests::every_row_button_including_at_the_edges9 ms
- ✓Only node form fields are node fieldsadmin_nodes::tests::only_node_form_fields_are_node_fields9 ms
- ✓Rows are ordered by their index not the forms orderadmin_nodes::tests::rows_are_ordered_by_their_index_not_the_forms_order9 ms
- ✓Rows become the engines json and back with every field in orderadmin_nodes::tests::rows_become_the_engines_json_and_back_with_every_field_in_order9 ms
- ✓Submitted rows keep their order and boxes and the blank row is ignoredadmin_nodes::tests::submitted_rows_keep_their_order_and_boxes_and_the_blank_row_is_ignored9 ms
monokulo::confirmation_thresholds14121 ms
- ✓A malformed stored unit amount fails closedconfirmation_thresholds::tests::a_malformed_stored_unit_amount_fails_closed8 ms
- ✓A policy guard covers only its own storeconfirmation_thresholds::tests::a_policy_guard_covers_only_its_own_store9 ms
- ✓Amount spellings canonicalize without floating pointconfirmation_thresholds::tests::amount_spellings_canonicalize_without_floating_point9 ms
- ✓An amount above the largest threshold uses that largest thresholds own countconfirmation_thresholds::tests::an_amount_above_the_largest_threshold_uses_that_largest_thresholds_own_count9 ms
- ✓An amount below every threshold uses the defaultconfirmation_thresholds::tests::an_amount_below_every_threshold_uses_the_default9 ms
- ✓An amount between two thresholds uses the lower ones countconfirmation_thresholds::tests::an_amount_between_two_thresholds_uses_the_lower_ones_count9 ms
- ✓An amount exactly at a thresholds boundary uses that thresholdconfirmation_thresholds::tests::an_amount_exactly_at_a_thresholds_boundary_uses_that_threshold9 ms
- ✓Duplicate decimal spellings are rejected even in stored rowsconfirmation_thresholds::tests::duplicate_decimal_spellings_are_rejected_even_in_stored_rows9 ms
- ✓Concurrent lookups share one tenants lockconfirmation_thresholds::tests::concurrent_lookups_share_one_tenants_lock10 ms
- ✓No custom thresholds at all always uses the defaultconfirmation_thresholds::tests::no_custom_thresholds_at_all_always_uses_the_default8 ms
- ✓One piconero below a twelve decimal boundary does not enter the tierconfirmation_thresholds::tests::one_piconero_below_a_twelve_decimal_boundary_does_not_enter_the_tier8 ms
- ✓Policy lock serializes one tenant without blocking anotherconfirmation_thresholds::tests::policy_lock_serializes_one_tenant_without_blocking_another8 ms
- ✓Thresholds out of order in the slice are still resolved correctlyconfirmation_thresholds::tests::thresholds_out_of_order_in_the_slice_are_still_resolved_correctly8 ms
- ✓Zero amount thresholds and zero order amounts are handledconfirmation_thresholds::tests::zero_amount_thresholds_and_zero_order_amounts_are_handled8 ms
monokulo::currencies10220 ms
- ✓A known ticker alias resolves to its canonical codecurrencies::tests::a_known_ticker_alias_resolves_to_its_canonical_code21 ms
- ✓A browsers first language with a known region names the currencycurrencies::tests::a_browsers_first_language_with_a_known_region_names_the_currency22 ms
- ✓Currency options marks exactly one option selected by canonical codecurrencies::tests::currency_options_marks_exactly_one_option_selected_by_canonical_code22 ms
- ✓An unknown input resolves to nonecurrencies::tests::an_unknown_input_resolves_to_none22 ms
- ✓Currency options selects nothing for an unknown inputcurrencies::tests::currency_options_selects_nothing_for_an_unknown_input22 ms
- ✓Currency options marks the matching option selected from a ticker aliascurrencies::tests::currency_options_marks_the_matching_option_selected_from_a_ticker_alias23 ms
- ✓Is known currency mirrors resolve currencys own answercurrencies::tests::is_known_currency_mirrors_resolve_currencys_own_answer22 ms
- ✓Every seeded currency is individually resolvable by its own canonical codecurrencies::tests::every_seeded_currency_is_individually_resolvable_by_its_own_canonical_code23 ms
- ✓The canonical code itself resolves case insensitivelycurrencies::tests::the_canonical_code_itself_resolves_case_insensitively22 ms
- ✓Xmr is itself a selectable currencycurrencies::tests::xmr_is_itself_a_selectable_currency21 ms
monokulo::db702.0 s
- ✓A bare provider name in the column still reads as a one element listdb::tests::a_bare_provider_name_in_the_column_still_reads_as_a_one_element_list9 ms
- ✓A connection that cannot announce pos order changes cannot make themdb::tests::a_connection_that_cannot_announce_pos_order_changes_cannot_make_them22 ms
- ✓A corrupt settings cell reads as the defaults not a failed lookupdb::tests::a_corrupt_settings_cell_reads_as_the_defaults_not_a_failed_lookup22 ms
- ✓A created confirmation threshold round tripsdb::tests::a_created_confirmation_threshold_round_trips21 ms
- ✓A created session can be found by its token hash and resolves to its userdb::tests::a_created_session_can_be_found_by_its_token_hash_and_resolves_to_its_user26 ms
- ✓A duplicate email is rejected as a unique violationdb::tests::a_duplicate_email_is_rejected_as_a_unique_violation28 ms
- ✓A duplicate email leaves the invite unclaimed for another trydb::tests::a_duplicate_email_leaves_the_invite_unclaimed_for_another_try25 ms
- ✓A failed threshold replacement rolls back deletionsdb::tests::a_failed_threshold_replacement_rolls_back_deletions29 ms
- ✓A new store has default provider settingsdb::tests::a_new_store_has_default_provider_settings26 ms
- ✓A request invite submission creates a row only the admin can see and it carries no link until one is madedb::tests::a_request_invite_submission_creates_a_row_only_the_admin_can_see_and_it_carries_no_link_until_one_is_made28 ms
- ✓A request linked invite link is visible on the request row once createddb::tests::a_request_linked_invite_link_is_visible_on_the_request_row_once_created31 ms
- ✓A saved setting round trips and a second save overwrites rather than erroringdb::tests::a_saved_setting_round_trips_and_a_second_save_overwrites_rather_than_erroring29 ms
- ✓A session expires and its row is dropped by the next logindb::tests::a_session_expires_and_its_row_is_dropped_by_the_next_login25 ms
- ✓A setting that was never saved reads as nonedb::tests::a_setting_that_was_never_saved_reads_as_none26 ms
- ✓A valid invite token redeems exactly oncedb::tests::a_valid_invite_token_redeems_exactly_once31 ms
- ✓A site belongs to one store on the instance and stores without one are manydb::tests::a_site_belongs_to_one_store_on_the_instance_and_stores_without_one_are_many34 ms
- ✓An inline read cannot write eitherdb::tests::an_inline_read_cannot_write_either26 ms
- ✓An out of range rate is refused not panicked ondb::tests::an_out_of_range_rate_is_refused_not_panicked_on25 ms
- ✓An invite link expiresdb::tests::an_invite_link_expires28 ms
- ✓An unknown token is rejected without creating an accountdb::tests::an_unknown_token_is_rejected_without_creating_an_account30 ms
- ✓Changing a stores base currency deletes every one of its custom thresholdsdb::tests::changing_a_stores_base_currency_deletes_every_one_of_its_custom_thresholds29 ms
- ✓Client logging is off until the store opts indb::tests::client_logging_is_off_until_the_store_opts_in35 ms
- ✓Concurrent threshold adds never exceed fivedb::tests::concurrent_threshold_adds_never_exceed_five26 ms
- ✓Confirmation thresholds list in ascending numeric order not lexicographicdb::tests::confirmation_thresholds_list_in_ascending_numeric_order_not_lexicographic28 ms
- ✓Confirmation thresholds preserve adjacent twelve decimal orderdb::tests::confirmation_thresholds_preserve_adjacent_twelve_decimal_order28 ms
- ✓Consuming an expired connect token fails as if it never existeddb::tests::consuming_an_expired_connect_token_fails_as_if_it_never_existed34 ms
- ✓Consuming an unknown connect token returns nonedb::tests::consuming_an_unknown_connect_token_returns_none25 ms
- ✓Consuming the same connect token twice only succeeds oncedb::tests::consuming_the_same_connect_token_twice_only_succeeds_once26 ms
- ✓Count confirmation thresholds reflects the real countdb::tests::count_confirmation_thresholds_reflects_the_real_count28 ms
- ✓Creating a connect token then consuming it returns its connection iddb::tests::creating_a_connect_token_then_consuming_it_returns_its_connection_id33 ms
- ✓Creating a second threshold at the same amount is a unique violationdb::tests::creating_a_second_threshold_at_the_same_amount_is_a_unique_violation26 ms
- ✓Creating a store connection then reading it back by public key round tripsdb::tests::creating_a_store_connection_then_reading_it_back_by_public_key_round_trips29 ms
- ✓Creating a store connection then reading it back round tripsdb::tests::creating_a_store_connection_then_reading_it_back_round_trips32 ms
- ✓Creating a user then reading it back round tripsdb::tests::creating_a_user_then_reading_it_back_round_trips32 ms
- ✓Creating a user with is admin true persists and round trips the flagdb::tests::creating_a_user_with_is_admin_true_persists_and_round_trips_the_flag28 ms
- ✓Creating order fiat metadata then reading it back round tripsdb::tests::creating_order_fiat_metadata_then_reading_it_back_round_trips31 ms
- ✓Delete all clears every unactioned request and revokes every unused link but leaves actioned ones alonedb::tests::delete_all_clears_every_unactioned_request_and_revokes_every_unused_link_but_leaves_actioned_ones_alone33 ms
- ✓Deleting a confirmation threshold is scoped to the owning connectiondb::tests::deleting_a_confirmation_threshold_is_scoped_to_the_owning_connection23 ms
- ✓Deleting a session removes it and reports whether a row was actually deleteddb::tests::deleting_a_session_removes_it_and_reports_whether_a_row_was_actually_deleted23 ms
- ✓Deleting a request does not touch a link that was already useddb::tests::deleting_a_request_does_not_touch_a_link_that_was_already_used31 ms
- ✓Deleting a request hides it and revokes its own unused linkdb::tests::deleting_a_request_hides_it_and_revokes_its_own_unused_link33 ms
- ✓Deleting a setting removes its row entirelydb::tests::deleting_a_setting_removes_its_row_entirely26 ms
- ✓Fiat metadata is scoped by connection id even for the same order iddb::tests::fiat_metadata_is_scoped_by_connection_id_even_for_the_same_order_id28 ms
- ✓First run setup creates one admin and completes setup atomicallydb::tests::first_run_setup_creates_one_admin_and_completes_setup_atomically30 ms
- ✓Get invite request finds a row even after it has been actioneddb::tests::get_invite_request_finds_a_row_even_after_it_has_been_actioned31 ms
- ✓List currencies returns the seeded reference data in alphabetical orderdb::tests::list_currencies_returns_the_seeded_reference_data_in_alphabetical_order30 ms
- ✓Listing fiat metadata for a connection returns a map keyed by order iddb::tests::listing_fiat_metadata_for_a_connection_returns_a_map_keyed_by_order_id24 ms
- ✓Looking up an unknown public key returns none rather than an errordb::tests::looking_up_an_unknown_public_key_returns_none_rather_than_an_error25 ms
- ✓Listing fiat metadata for a connection with none recorded is an empty map not an errordb::tests::listing_fiat_metadata_for_a_connection_with_none_recorded_is_an_empty_map_not_an_error30 ms
- ✓Looking up an unknown email returns none rather than an errordb::tests::looking_up_an_unknown_email_returns_none_rather_than_an_error29 ms
- ✓Looking up an unknown session token returns none rather than an errordb::tests::looking_up_an_unknown_session_token_returns_none_rather_than_an_error25 ms
- ✓Looking up an unknown store connection id returns none rather than an errordb::tests::looking_up_an_unknown_store_connection_id_returns_none_rather_than_an_error34 ms
- ✓Looking up fiat metadata for an unknown order id returns nonedb::tests::looking_up_fiat_metadata_for_an_unknown_order_id_returns_none31 ms
- ✓Migration 0008 backfills a stale fixed fx provider to coingeckodb::tests::migration_0008_backfills_a_stale_fixed_fx_provider_to_coingecko26 ms
- ✓Migration 0027 turns the single provider into a one element listdb::tests::migration_0027_turns_the_single_provider_into_a_one_element_list30 ms
- ✓Migration 0028 gives existing stores the default settingsdb::tests::migration_0028_gives_existing_stores_the_default_settings33 ms
- ✓Only committed changes to what a pos orders stream shows wake itdb::tests::only_committed_changes_to_what_a_pos_orders_stream_shows_wake_it28 ms
- ✓Pagination helpers respect limit offset and orderingdb::tests::pagination_helpers_respect_limit_offset_and_ordering29 ms
- ✓Provider settings are saved with the order and read back on every lookupdb::tests::provider_settings_are_saved_with_the_order_and_read_back_on_every_lookup23 ms
- ✓Pos orders are store scoped persist background and cancel statedb::tests::pos_orders_are_store_scoped_persist_background_and_cancel_state36 ms
- ✓Redeeming a request linked token auto actions its requestdb::tests::redeeming_a_request_linked_token_auto_actions_its_request25 ms
- ✓Readers see the writers commits and cannot writedb::tests::readers_see_the_writers_commits_and_cannot_write40 ms
- ✓Reopening an existing database file does not reapply migrationsdb::tests::reopening_an_existing_database_file_does_not_reapply_migrations37 ms
- ✓Replacing confirmation thresholds at the cap is atomicdb::tests::replacing_confirmation_thresholds_at_the_cap_is_atomic30 ms
- ✓Saving one stores settings leaves every other store untoucheddb::tests::saving_one_stores_settings_leaves_every_other_store_untouched28 ms
- ✓Setup is not complete until explicitly markeddb::tests::setup_is_not_complete_until_explicitly_marked33 ms
- ✓The same amount is allowed again on a different connectiondb::tests::the_same_amount_is_allowed_again_on_a_different_connection30 ms
- ✓The test admin hash matches the test admin passworddb::tests::the_test_admin_hash_matches_the_test_admin_password33 ms
- ✓Updating a store connections fx providers only touches that fielddb::tests::updating_a_store_connections_fx_providers_only_touches_that_field33 ms
- ✓Wallets list mainnet first then each test network by namedb::tests::wallets_list_mainnet_first_then_each_test_network_by_name26 ms
monokulo::engine_client11330 ms
- ✓A call to a non admin route is refused before it is sentengine_client::tests::a_call_to_a_non_admin_route_is_refused_before_it_is_sent10 ms
- ✓A second call over http within the cache window never reaches the serverengine_client::tests::a_second_call_over_http_within_the_cache_window_never_reaches_the_server17 ms
- ✓A status parses with and without each nodes networkengine_client::tests::a_status_parses_with_and_without_each_nodes_network9 ms
- ✓An id that could name another engine route is refusedengine_client::tests::an_id_that_could_name_another_engine_route_is_refused9 ms
- ✓Create order with no confirmations required override leaves the real engines stored order unsetengine_client::tests::create_order_with_no_confirmations_required_override_leaves_the_real_engines_stored_order_unset38 ms
- ✓Create order with a confirmations required override reaches the real engines stored orderengine_client::tests::create_order_with_a_confirmations_required_override_reaches_the_real_engines_stored_order55 ms
- ✓Get order detail is never cached over httpengine_client::tests::get_order_detail_is_never_cached_over_http17 ms
- ✓Create tenant then get tenant round trips against a real engineengine_client::tests::create_tenant_then_get_tenant_round_trips_against_a_real_engine53 ms
- ✓Get status round trips against a real engineengine_client::tests::get_status_round_trips_against_a_real_engine43 ms
- ✓The same cache size changes nothing and a new one makes a new clientengine_client::tests::the_same_cache_size_changes_nothing_and_a_new_one_makes_a_new_client32 ms
- ✓Lookup payment round trips against a real engineengine_client::tests::lookup_payment_round_trips_against_a_real_engine47 ms
monokulo::engine_client::contract_tests2195 ms
- ✓A watched order is woken over the embedded transportengine_client::contract_tests::a_watched_order_is_woken_over_the_embedded_transport56 ms
- ✓Every call has the same outcome over http and in processengine_client::contract_tests::every_call_has_the_same_outcome_over_http_and_in_process139 ms
monokulo::engine_view::history7193 ms
- ✓A restart or a gap starts the history overengine_view::history::tests::a_restart_or_a_gap_starts_the_history_over12 ms
- ✓A past round is rebuilt as it endedengine_view::history::tests::a_past_round_is_rebuilt_as_it_ended30 ms
- ✓Any moment asked for is answeredengine_view::history::tests::any_moment_asked_for_is_answered12 ms
- ✓New events make a frame and old ones nothingengine_view::history::tests::new_events_make_a_frame_and_old_ones_nothing14 ms
- ✓Replay frames carry their events and end on the right stateengine_view::history::tests::replay_frames_carry_their_events_and_end_on_the_right_state30 ms
- ✓What is older than the history keeps is let go of and the rest still rebuildsengine_view::history::tests::what_is_older_than_the_history_keeps_is_let_go_of_and_the_rest_still_rebuilds38 ms
- ✓The state at any moment is what the events giveengine_view::history::tests::the_state_at_any_moment_is_what_the_events_give57 ms
monokulo::engine_view::machine301.6 s
- ✓A big group moves a page at a timeengine_view::machine::tests::a_big_group_moves_a_page_at_a_time13 ms
- ✓A catch up commit moves scanned stores and sends idle ones aheadengine_view::machine::tests::a_catch_up_commit_moves_scanned_stores_and_sends_idle_ones_ahead11 ms
- ✓A diverged block is marked replacedengine_view::machine::tests::a_diverged_block_is_marked_replaced10 ms
- ✓A frontier commit moves its group and the high water markengine_view::machine::tests::a_frontier_commit_moves_its_group_and_the_high_water_mark11 ms
- ✓A header only commit reads as recorded from its headerengine_view::machine::tests::a_header_only_commit_reads_as_recorded_from_its_header10 ms
- ✓A later snapshot corrects the page but keeps identitiesengine_view::machine::tests::a_later_snapshot_corrects_the_page_but_keeps_identities9 ms
- ✓A one block rewind reads in the singularengine_view::machine::tests::a_one_block_rewind_reads_in_the_singular11 ms
- ✓A paying pool transaction flies to order statusengine_view::machine::tests::a_paying_pool_transaction_flies_to_order_status10 ms
- ✓A reorg check probes the high water markengine_view::machine::tests::a_reorg_check_probes_the_high_water_mark11 ms
- ✓A reorg runs from detection to rewindengine_view::machine::tests::a_reorg_runs_from_detection_to_rewind11 ms
- ✓A round collects its units and ends on the ribbonengine_view::machine::tests::a_round_collects_its_units_and_ends_on_the_ribbon9 ms
- ✓A round is drawn to its budget while stores catch up or a reorg is openengine_view::machine::tests::a_round_is_drawn_to_its_budget_while_stores_catch_up_or_a_reorg_is_open10 ms
- ✓A scan follows its block and a checkpoint saves itengine_view::machine::tests::a_scan_follows_its_block_and_a_checkpoint_saves_it11 ms
- ✓A sleep goes on the ribbon and names what woke the next roundengine_view::machine::tests::a_sleep_goes_on_the_ribbon_and_names_what_woke_the_next_round10 ms
- ✓A snapshot sets what the page drawsengine_view::machine::tests::a_snapshot_sets_what_the_page_draws10 ms
- ✓Failing units are key events and strays are ignoredengine_view::machine::tests::failing_units_are_key_events_and_strays_are_ignored8 ms
- ✓Catching up onto the frontier is a key eventengine_view::machine::tests::catching_up_onto_the_frontier_is_a_key_event11 ms
- ✓Fetched blocks are held and the packet lands mid runengine_view::machine::tests::fetched_blocks_are_held_and_the_packet_lands_mid_run11 ms
- ✓Idle stores fly to where they landengine_view::machine::tests::idle_stores_fly_to_where_they_land10 ms
- ✓New blocks arrive when a round reads a higher tipengine_view::machine::tests::new_blocks_arrive_when_a_round_reads_a_higher_tip11 ms
- ✓Pool passes flash count and callengine_view::machine::tests::pool_passes_flash_count_and_call9 ms
- ✓Payments found in a block fly to order statusengine_view::machine::tests::payments_found_in_a_block_fly_to_order_status11 ms
- ✓Recomputes list their changesengine_view::machine::tests::recomputes_list_their_changes12 ms
- ✓Saves are counted for a minute and marks carry their placeengine_view::machine::tests::saves_are_counted_for_a_minute_and_marks_carry_their_place12 ms
- ✓Snapshots during and after a reorgengine_view::machine::tests::snapshots_during_and_after_a_reorg9 ms
- ✓The first run s seed is a key eventengine_view::machine::tests::the_first_run_s_seed_is_a_key_event12 ms
- ✓The node s pool fills the next blockengine_view::machine::tests::the_node_s_pool_fills_the_next_block11 ms
- ✓The ribbon keeps its last entriesengine_view::machine::tests::the_ribbon_keeps_its_last_entries11 ms
- ✓The vanished check and upkeep are notedengine_view::machine::tests::the_vanished_check_and_upkeep_are_noted10 ms
- ✓No sequence of events breaks the page s invariantsengine_view::machine::tests::no_sequence_of_events_breaks_the_page_s_invariants1.3 s
monokulo::engine_view::present16199 ms
- ✓A gap is joined or crossed by a thread by its share of the scaleengine_view::present::tests::a_gap_is_joined_or_crossed_by_a_thread_by_its_share_of_the_scale15 ms
- ✓A round s lanes are drawn to scaleengine_view::present::tests::a_round_s_lanes_are_drawn_to_scale19 ms
- ✓A very short round is drawn to a 10ms scaleengine_view::present::tests::a_very_short_round_is_drawn_to_a_10ms_scale15 ms
- ✓A caught up network reads as caught upengine_view::present::tests::a_caught_up_network_reads_as_caught_up12 ms
- ✓A round s parts add up to itengine_view::present::tests::a_round_s_parts_add_up_to_it9 ms
- ✓A round s state line says what woke it and how it endedengine_view::present::tests::a_round_s_state_line_says_what_woke_it_and_how_it_ended12 ms
- ✓An empty state reads as not yet knownengine_view::present::tests::an_empty_state_reads_as_not_yet_known10 ms
- ✓Joined work merges into one outline and a segment can be split after a joinengine_view::present::tests::joined_work_merges_into_one_outline_and_a_segment_can_be_split_after_a_join9 ms
- ✓An open reorg draws attentionengine_view::present::tests::an_open_reorg_draws_attention12 ms
- ✓Seconds read to two places under one and one overengine_view::present::tests::seconds_read_to_two_places_under_one_and_one_over10 ms
- ✓Many short round operations have a compact tooltip and aggregated detailsengine_view::present::tests::many_short_round_operations_have_a_compact_tooltip_and_aggregated_details18 ms
- ✓Stores catching up read as catching upengine_view::present::tests::stores_catching_up_read_as_catching_up10 ms
- ✓The next block fills with the node s poolengine_view::present::tests::the_next_block_fills_with_the_node_s_pool11 ms
- ✓The pool panel says whether the engine looksengine_view::present::tests::the_pool_panel_says_whether_the_engine_looks12 ms
- ✓The ribbon shows rounds by length and sleeps by what ended themengine_view::present::tests::the_ribbon_shows_rounds_by_length_and_sleeps_by_what_ended_them13 ms
- ✓The side summarises the pool orders upkeep and savesengine_view::present::tests::the_side_summarises_the_pool_orders_upkeep_and_saves12 ms
monokulo::engine_view::relay3644 ms
- ✓Viewers get the engine s history then its new eventsengine_view::relay::tests::viewers_get_the_engine_s_history_then_its_new_events75 ms
- ✓A network nobody watches is let go ofengine_view::relay::tests::a_network_nobody_watches_is_let_go_of151 ms
- ✓Reads alone keep the history current then let it goengine_view::relay::tests::reads_alone_keep_the_history_current_then_let_it_go418 ms
monokulo::http454.1 s
- ✓A store catching up gets a gentler alert and it goes away once it hashttp::tests::a_store_catching_up_gets_a_gentler_alert_and_it_goes_away_once_it_has44 ms
- ✓A signed out browser is sent to log in and back while the api gets 401http::tests::a_signed_out_browser_is_sent_to_log_in_and_back_while_the_api_gets_40176 ms
- ✓A correct login returns a non empty session tokenhttp::tests::a_correct_login_returns_a_non_empty_session_token102 ms
- ✓A store is owned only by the user it belongs tohttp::tests::a_store_is_owned_only_by_the_user_it_belongs_to45 ms
- ✓A store whose key storage is off or down gets an alert saying sohttp::tests::a_store_whose_key_storage_is_off_or_down_gets_an_alert_saying_so45 ms
- ✓A store can use a wallet already added but only your ownhttp::tests::a_store_can_use_a_wallet_already_added_but_only_your_own147 ms
- ✓A store with no site has a name onlyhttp::tests::a_store_with_no_site_has_a_name_only164 ms
- ✓A valid session token reaches the protected test route as the right userhttp::tests::a_valid_session_token_reaches_the_protected_test_route_as_the_right_user111 ms
- ✓A successful login with a malicious next falls back to the default confirmation not a redirecthttp::tests::a_successful_login_with_a_malicious_next_falls_back_to_the_default_confirmation_not_a_redirect164 ms
- ✓A stores name and site are changed in its settingshttp::tests::a_stores_name_and_site_are_changed_in_its_settings184 ms
- ✓A valid signup succeeds and does not return the password or hashhttp::tests::a_valid_signup_succeeds_and_does_not_return_the_password_or_hash82 ms
- ✓A wrong password returns unauthorizedhttp::tests::a_wrong_password_returns_unauthorized109 ms
- ✓After logging out the same session token no longer reaches a protected routehttp::tests::after_logging_out_the_same_session_token_no_longer_reaches_a_protected_route103 ms
- ✓Browser reports are accepted up to a small size and only the sites own pages send themhttp::tests::browser_reports_are_accepted_up_to_a_small_size_and_only_the_sites_own_pages_send_them49 ms
- ✓An invalid view key is refused on the keys screen and nothing is madehttp::tests::an_invalid_view_key_is_refused_on_the_keys_screen_and_nothing_is_made153 ms
- ✓An unknown email at dashboard login gets the same generic error as a wrong passwordhttp::tests::an_unknown_email_at_dashboard_login_gets_the_same_generic_error_as_a_wrong_password108 ms
- ✓Cross site posts to the sites own routes are refusedhttp::tests::cross_site_posts_to_the_sites_own_routes_are_refused49 ms
- ✓Get dashboard login returns htmlhttp::tests::get_dashboard_login_returns_html51 ms
- ✓Get dashboard signup returns htmlhttp::tests::get_dashboard_signup_returns_html47 ms
- ✓An unknown email returns the same unauthorized response as a wrong passwordhttp::tests::an_unknown_email_returns_the_same_unauthorized_response_as_a_wrong_password151 ms
- ✓Invite only mode rejects a signup with no tokenhttp::tests::invite_only_mode_rejects_a_signup_with_no_token49 ms
- ✓Invite only mode accepts a valid token exactly oncehttp::tests::invite_only_mode_accepts_a_valid_token_exactly_once105 ms
- ✓Logout rejects a missing authorization headerhttp::tests::logout_rejects_a_missing_authorization_header48 ms
- ✓Logging out a valid session returns no contenthttp::tests::logging_out_a_valid_session_returns_no_content110 ms
- ✓Logging out via the dashboard nav form clears the session and goes to log inhttp::tests::logging_out_via_the_dashboard_nav_form_clears_the_session_and_goes_to_log_in102 ms
- ✓Logout rejects an unknown bearer tokenhttp::tests::logout_rejects_an_unknown_bearer_token49 ms
- ✓Public embed routes allow any origin and the dashboard does nothttp::tests::public_embed_routes_allow_any_origin_and_the_dashboard_does_not51 ms
- ✓Posting a duplicate email to dashboard signup rerenders the form with an errorhttp::tests::posting_a_duplicate_email_to_dashboard_signup_rerenders_the_form_with_an_error102 ms
- ✓Posting a wrong password to dashboard login rerenders the form with a generic errorhttp::tests::posting_a_wrong_password_to_dashboard_login_rerenders_the_form_with_a_generic_error108 ms
- ✓Posting valid form encoded login data sets a session cookiehttp::tests::posting_valid_form_encoded_login_data_sets_a_session_cookie107 ms
- ✓Public mode signup needs no invite token at allhttp::tests::public_mode_signup_needs_no_invite_token_at_all78 ms
- ✓Setup without a session sends a page load to log inhttp::tests::setup_without_a_session_sends_a_page_load_to_log_in91 ms
- ✓Signing up logs in and goes on to set up a wallethttp::tests::signing_up_logs_in_and_goes_on_to_set_up_a_wallet76 ms
- ✓Store pages load browser reports only once the store opted in but admin pages always dohttp::tests::store_pages_load_browser_reports_only_once_the_store_opted_in_but_admin_pages_always_do45 ms
- ✓Setting up a website store brings a wallet in and ends on donehttp::tests::setting_up_a_website_store_brings_a_wallet_in_and_ends_on_done160 ms
- ✓The owner of a store on a network without a node is alerted on every page but nobody else ishttp::tests::the_owner_of_a_store_on_a_network_without_a_node_is_alerted_on_every_page_but_nobody_else_is45 ms
- ✓Signing up the same email twice returns conflict on the second attempthttp::tests::signing_up_the_same_email_twice_returns_conflict_on_the_second_attempt106 ms
- ✓The plugins forwarded errors are refused until the store opted inhttp::tests::the_plugins_forwarded_errors_are_refused_until_the_store_opted_in50 ms
- ✓The pos timeline is taken only from the stores owner once it opted inhttp::tests::the_pos_timeline_is_taken_only_from_the_stores_owner_once_it_opted_in51 ms
- ✓The protected test route rejects a missing authorization headerhttp::tests::the_protected_test_route_rejects_a_missing_authorization_header50 ms
- ✓The protected test route rejects an unknown bearer tokenhttp::tests::the_protected_test_route_rejects_an_unknown_bearer_token50 ms
- ✓The status page names its stream and the stream sends the page contenthttp::tests::the_status_page_names_its_stream_and_the_stream_sends_the_page_content52 ms
- ✓The session cookie from dashboard login authenticates against a protected routehttp::tests::the_session_cookie_from_dashboard_login_authenticates_against_a_protected_route105 ms
- ✓The stored password hash is a real argon2 hash not the plaintext passwordhttp::tests::the_stored_password_hash_is_a_real_argon2_hash_not_the_plaintext_password111 ms
- ✓The store step refuses a missing name a bad site and a site already usedhttp::tests::the_store_step_refuses_a_missing_name_a_bad_site_and_a_site_already_used204 ms
monokulo::http::abuse11529 ms
- ✓A client flooding log reports loses only its reports and is never challengedhttp::abuse::tests::a_client_flooding_log_reports_loses_only_its_reports_and_is_never_challenged45 ms
- ✓Log routes are classed as logshttp::abuse::tests::log_routes_are_classed_as_logs12 ms
- ✓Clients behind a trusted proxy get their own budgets and untrusted forwarding is ignoredhttp::abuse::tests::clients_behind_a_trusted_proxy_get_their_own_budgets_and_untrusted_forwarding_is_ignored58 ms
- ✓Cors lets any site send a proof and read the challengehttp::abuse::tests::cors_lets_any_site_send_a_proof_and_read_the_challenge49 ms
- ✓Only operators see challenge activity on the status pagehttp::abuse::tests::only_operators_see_challenge_activity_on_the_status_page54 ms
- ✓Past the hard limit everything gets 429 with retry afterhttp::abuse::tests::past_the_hard_limit_everything_gets_429_with_retry_after50 ms
- ✓Past the soft limit a page gets the interstitial and a solved proof continueshttp::abuse::tests::past_the_soft_limit_a_page_gets_the_interstitial_and_a_solved_proof_continues51 ms
- ✓The json api answers 429 with a challenge and accepts the proof headerhttp::abuse::tests::the_json_api_answers_429_with_a_challenge_and_accepts_the_proof_header54 ms
- ✓Signed in merchants are never challengedhttp::abuse::tests::signed_in_merchants_are_never_challenged56 ms
- ✓Under attack challenges every anonymous page and api request but not streams or static fileshttp::abuse::tests::under_attack_challenges_every_anonymous_page_and_api_request_but_not_streams_or_static_files51 ms
- ✓Under attack never challenges log reportshttp::abuse::tests::under_attack_never_challenges_log_reports49 ms
monokulo::http::account81.4 s
- ✓An email another account has or one that isnt an address is refusedhttp::account::tests::an_email_another_account_has_or_one_that_isnt_an_address_is_refused194 ms
- ✓A merchant picks a theme and a time zone and every page followshttp::account::tests::a_merchant_picks_a_theme_and_a_time_zone_and_every_page_follows251 ms
- ✓Signed out the account page sends a browser to log inhttp::account::tests::signed_out_the_account_page_sends_a_browser_to_log_in48 ms
- ✓A password change needs the current one and logs out every other sessionhttp::account::tests::a_password_change_needs_the_current_one_and_logs_out_every_other_session303 ms
- ✓The wallets tab lists the merchants wallets and a way to add onehttp::account::tests::the_wallets_tab_lists_the_merchants_wallets_and_a_way_to_add_one110 ms
- ✓The theme picked at sign up is the new accountshttp::account::tests::the_theme_picked_at_sign_up_is_the_new_accounts164 ms
- ✓An email change is confirmed by typing it again then used to log inhttp::account::tests::an_email_change_is_confirmed_by_typing_it_again_then_used_to_log_in232 ms
- ✓Times follow the zone a merchant picks or else their browsershttp::account::tests::times_follow_the_zone_a_merchant_picks_or_else_their_browsers128 ms
monokulo::http::admin_settings538.8 s
- ✓A backend that cannot run after a save is a bannerhttp::admin_settings::tests::a_backend_that_cannot_run_after_a_save_is_a_banner13 ms
- ✓A bad address is shown on its row and nothing is savedhttp::admin_settings::tests::a_bad_address_is_shown_on_its_row_and_nothing_is_saved178 ms
- ✓A fixi save answers with the panel and the banners and tab bar out of bandhttp::admin_settings::tests::a_fixi_save_answers_with_the_panel_and_the_banners_and_tab_bar_out_of_band197 ms
- ✓A fixi tab link shows a remote engine it cannot reach over http in the panelhttp::admin_settings::tests::a_fixi_tab_link_shows_a_remote_engine_it_cannot_reach_over_http_in_the_panel131 ms
- ✓A mismatch from the options file is a red alert and snp is not offeredhttp::admin_settings::tests::a_mismatch_from_the_options_file_is_a_red_alert_and_snp_is_not_offered168 ms
- ✓A missing options file is created by the first savehttp::admin_settings::tests::a_missing_options_file_is_created_by_the_first_save178 ms
- ✓A monokulo refusal after the engine saved says it was partly savedhttp::admin_settings::tests::a_monokulo_refusal_after_the_engine_saved_says_it_was_partly_saved133 ms
- ✓A mixed tab saves both halveshttp::admin_settings::tests::a_mixed_tab_saves_both_halves225 ms
- ✓A mixed tab writes both halves into the one options filehttp::admin_settings::tests::a_mixed_tab_writes_both_halves_into_the_one_options_file253 ms
- ✓A non admin session is forbidden from the settings pagehttp::admin_settings::tests::a_non_admin_session_is_forbidden_from_the_settings_page149 ms
- ✓A node on another network is refused on its blockhttp::admin_settings::tests::a_node_on_another_network_is_refused_on_its_block175 ms
- ✓A node is added through the blank row and ordered by its buttonshttp::admin_settings::tests::a_node_is_added_through_the_blank_row_and_ordered_by_its_buttons241 ms
- ✓A read only options file locks what it holdshttp::admin_settings::tests::a_read_only_options_file_locks_what_it_holds204 ms
- ✓A save saves only the cards whose settings changedhttp::admin_settings::tests::a_save_saves_only_the_cards_whose_settings_changed136 ms
- ✓A refused save keeps every networks rows as senthttp::admin_settings::tests::a_refused_save_keeps_every_networks_rows_as_sent186 ms
- ✓A remote engines token shows locked and is never saved and its url is saved for a restart over httphttp::admin_settings::tests::a_remote_engines_token_shows_locked_and_is_never_saved_and_its_url_is_saved_for_a_restart_over_http184 ms
- ✓A saved banner is shown oncehttp::admin_settings::tests::a_saved_banner_is_shown_once132 ms
- ✓A saved monokulo setting round trips on the next loadhttp::admin_settings::tests::a_saved_monokulo_setting_round_trips_on_the_next_load154 ms
- ✓A saved public url applies to the next plugin connectionhttp::admin_settings::tests::a_saved_public_url_applies_to_the_next_plugin_connection131 ms
- ✓A switch left off is sent as falsehttp::admin_settings::tests::a_switch_left_off_is_sent_as_false12 ms
- ✓A saved node shows its statushttp::admin_settings::tests::a_saved_node_shows_its_status179 ms
- ✓A saved signup mode applies to the next signuphttp::admin_settings::tests::a_saved_signup_mode_applies_to_the_next_signup175 ms
- ✓A secret is shown locked and a form sending one is refusedhttp::admin_settings::tests::a_secret_is_shown_locked_and_a_form_sending_one_is_refused134 ms
- ✓A tab with only monokulo settings saves only monokulohttp::admin_settings::tests::a_tab_with_only_monokulo_settings_saves_only_monokulo137 ms
- ✓A tab with only engine settings saves only the enginehttp::admin_settings::tests::a_tab_with_only_engine_settings_saves_only_the_engine173 ms
- ✓A value a check refuses saves nothing on the tabhttp::admin_settings::tests::a_value_a_check_refuses_saves_nothing_on_the_tab179 ms
- ✓After a save the page shows what was storedhttp::admin_settings::tests::after_a_save_the_page_shows_what_was_stored128 ms
- ✓An engine refusal shows beside the engines setting not monokulos namesake over httphttp::admin_settings::tests::an_engine_refusal_shows_beside_the_engines_setting_not_monokulos_namesake_over_http178 ms
- ✓An invalid engine setting is rejected by the engine and surfaced as an errorhttp::admin_settings::tests::an_invalid_engine_setting_is_rejected_by_the_engine_and_surfaced_as_an_error160 ms
- ✓An engine refusal shows the engines own messagehttp::admin_settings::tests::an_engine_refusal_shows_the_engines_own_message170 ms
- ✓An embedded engines standalone only settings are not offered and a form sending them saves nothinghttp::admin_settings::tests::an_embedded_engines_standalone_only_settings_are_not_offered_and_a_form_sending_them_saves_nothing243 ms
- ✓An unreadable engine save reply is reported not droppedhttp::admin_settings::tests::an_unreadable_engine_save_reply_is_reported_not_dropped86 ms
- ✓Development logging ends in the admins own zonehttp::admin_settings::tests::development_logging_ends_in_the_admins_own_zone14 ms
- ✓An invalid monokulo setting is rejected and nothing is savedhttp::admin_settings::tests::an_invalid_monokulo_setting_is_rejected_and_nothing_is_saved158 ms
- ✓An operators typical mistakes are each refused with what the setting needshttp::admin_settings::tests::an_operators_typical_mistakes_are_each_refused_with_what_the_setting_needs170 ms
- ✓Clearing a network stores use is saved and says sohttp::admin_settings::tests::clearing_a_network_stores_use_is_saved_and_says_so188 ms
- ✓Every embedded engine setting saves from the admin page into monokulos options filehttp::admin_settings::tests::every_embedded_engine_setting_saves_from_the_admin_page_into_monokulos_options_file257 ms
- ✓Only a restart makes the toast amberhttp::admin_settings::tests::only_a_restart_makes_the_toast_amber12 ms
- ✓Every monokulo setting on the admin page saves correctlyhttp::admin_settings::tests::every_monokulo_setting_on_the_admin_page_saves_correctly270 ms
- ✓Every tab openshttp::admin_settings::tests::every_tab_opens206 ms
- ✓Every remote engine setting on the admin page saves correctly over httphttp::admin_settings::tests::every_remote_engine_setting_on_the_admin_page_saves_correctly_over_http298 ms
- ✓Saving an engine setting forwards it and the change is visible on the next loadhttp::admin_settings::tests::saving_an_engine_setting_forwards_it_and_the_change_is_visible_on_the_next_load201 ms
- ✓Saving a tab as shown leaves the options file as it washttp::admin_settings::tests::saving_a_tab_as_shown_leaves_the_options_file_as_it_was217 ms
- ✓Restart and unserved network notices still showhttp::admin_settings::tests::restart_and_unserved_network_notices_still_show269 ms
- ✓Sev snp key entry settings are saved only when they match the engineshttp::admin_settings::tests::sev_snp_key_entry_settings_are_saved_only_when_they_match_the_engines196 ms
- ✓Taking a new proof anchor is for the admin and asks the enginehttp::admin_settings::tests::taking_a_new_proof_anchor_is_for_the_admin_and_asks_the_engine164 ms
- ✓The engines options file is reloaded through its apihttp::admin_settings::tests::the_engines_options_file_is_reloaded_through_its_api164 ms
- ✓The admin can reach the settings page and see the reachable engine settingshttp::admin_settings::tests::the_admin_can_reach_the_settings_page_and_see_the_reachable_engine_settings206 ms
- ✓Ticked choices are joined and ticking none still sends the namehttp::admin_settings::tests::ticked_choices_are_joined_and_ticking_none_still_sends_the_name12 ms
- ✓The logging tab keeps monokulos and a remote engines settings apart over httphttp::admin_settings::tests::the_logging_tab_keeps_monokulos_and_a_remote_engines_settings_apart_over_http180 ms
- ✓The settings page is unreachable without a session at allhttp::admin_settings::tests::the_settings_page_is_unreachable_without_a_session_at_all97 ms
- ✓The options file is named saved to and reloaded from the pagehttp::admin_settings::tests::the_options_file_is_named_saved_to_and_reloaded_from_the_page200 ms
- ✓With the engine inside monokulo its address is locked and never savedhttp::admin_settings::tests::with_the_engine_inside_monokulo_its_address_is_locked_and_never_saved172 ms
monokulo::http::admin_setup6414 ms
- ✓A fresh install redirects the landing page to the setup wizardhttp::admin_setup::tests::a_fresh_install_redirects_the_landing_page_to_the_setup_wizard51 ms
- ✓A too short password is rejectedhttp::admin_setup::tests::a_too_short_password_is_rejected50 ms
- ✓A successful submission creates an admin marks setup complete logs in and lands on the settings pagehttp::admin_setup::tests::a_successful_submission_creates_an_admin_marks_setup_complete_logs_in_and_lands_on_the_settings_page107 ms
- ✓Mismatched passwords are rejected and no account is createdhttp::admin_setup::tests::mismatched_passwords_are_rejected_and_no_account_is_created51 ms
- ✓The setup wizard form itself is reachable on a fresh installhttp::admin_setup::tests::the_setup_wizard_form_itself_is_reachable_on_a_fresh_install50 ms
- ✓Revisiting the wizard after setup is complete redirects away instead of re renderinghttp::admin_setup::tests::revisiting_the_wizard_after_setup_is_complete_redirects_away_instead_of_re_rendering105 ms
monokulo::http::checkout161.9 s
- ✓A known timezone is kept in the pages own links and an unknown one is droppedhttp::checkout::tests::a_known_timezone_is_kept_in_the_pages_own_links_and_an_unknown_one_is_dropped14 ms
- ✓Checkout amount messages use exact received remaining and extra xmrhttp::checkout::tests::checkout_amount_messages_use_exact_received_remaining_and_extra_xmr13 ms
- ✓An unknown public key is also a real not found not a 500http::checkout::tests::an_unknown_public_key_is_also_a_real_not_found_not_a_50090 ms
- ✓An unknown order id shows a real not found pagehttp::checkout::tests::an_unknown_order_id_shows_a_real_not_found_page144 ms
- ✓The auto refresh toggle flips only the refresh parameterhttp::checkout::tests::the_auto_refresh_toggle_flips_only_the_refresh_parameter13 ms
- ✓One source may hold only so many open streams per storehttp::checkout::tests::one_source_may_hold_only_so_many_open_streams_per_store157 ms
- ✓Setting a refund address through the checkout pages own form persists it on the enginehttp::checkout::tests::setting_a_refund_address_through_the_checkout_pages_own_form_persists_it_on_the_engine176 ms
- ✓Submitting an empty refund address shows a clear error not a bare error pagehttp::checkout::tests::submitting_an_empty_refund_address_shows_a_clear_error_not_a_bare_error_page160 ms
- ✓The checkout events stream 404s for an unknown orderhttp::checkout::tests::the_checkout_events_stream_404s_for_an_unknown_order150 ms
- ✓The qr code asks for the amount due and only while one is duehttp::checkout::tests::the_qr_code_asks_for_the_amount_due_and_only_while_one_is_due12 ms
- ✓The checkout events stream pushes a change made on the enginehttp::checkout::tests::the_checkout_events_stream_pushes_a_change_made_on_the_engine166 ms
- ✓The checkout page shows the real address amount and fiat quotehttp::checkout::tests::the_checkout_page_shows_the_real_address_amount_and_fiat_quote173 ms
- ✓The checkout status endpoint returns real status and confirmationshttp::checkout::tests::the_checkout_status_endpoint_returns_real_status_and_confirmations155 ms
- ✓The routed checkout stream sends only changed parts to their elementshttp::checkout::tests::the_routed_checkout_stream_sends_only_changed_parts_to_their_elements160 ms
- ✓The share page shows a real not found state with the site nav for an unknown orderhttp::checkout::tests::the_share_page_shows_a_real_not_found_state_with_the_site_nav_for_an_unknown_order143 ms
- ✓The share page wraps the real checkout page with the site navhttp::checkout::tests::the_share_page_wraps_the_real_checkout_page_with_the_site_nav147 ms
monokulo::http::connect152.3 s
- ✓A connect target must send credentials back to the shop itselfhttp::connect::tests::a_connect_target_must_send_credentials_back_to_the_shop_itself13 ms
- ✓A connect link returning to another site sends no credentials anywherehttp::connect::tests::a_connect_link_returning_to_another_site_sends_no_credentials_anywhere174 ms
- ✓A refused store step from the plugin shows why and keeps the plugins requesthttp::connect::tests::a_refused_store_step_from_the_plugin_shows_why_and_keeps_the_plugins_request158 ms
- ✓A plugin connects locks the site and is disconnected with a new keyhttp::connect::tests::a_plugin_connects_locks_the_site_and_is_disconnected_with_a_new_key201 ms
- ✓A shop your store already has connects to it instead of making anotherhttp::connect::tests::a_shop_your_store_already_has_connects_to_it_instead_of_making_another162 ms
- ✓A shop another account has is refused with no formhttp::connect::tests::a_shop_another_account_has_is_refused_with_no_form201 ms
- ✓A store that isnt yours or isnt the shops gets no tokenhttp::connect::tests::a_store_that_isnt_yours_or_isnt_the_shops_gets_no_token200 ms
- ✓Finish with a garbage token returns unauthorizedhttp::connect::tests::finish_with_a_garbage_token_returns_unauthorized131 ms
- ✓An unauthenticated connect start redirects through login and back to the original urlhttp::connect::tests::an_unauthenticated_connect_start_redirects_through_login_and_back_to_the_original_url189 ms
- ✓Finish with a rejected webhook url fails the whole callhttp::connect::tests::finish_with_a_rejected_webhook_url_fails_the_whole_call170 ms
- ✓Finish with a webhook url registers a real webhook and carries the signing secrethttp::connect::tests::finish_with_a_webhook_url_registers_a_real_webhook_and_carries_the_signing_secret166 ms
- ✓Finishing the same token twice only succeeds oncehttp::connect::tests::finishing_the_same_token_twice_only_succeeds_once166 ms
- ✓The connecting site is read from a connect link onlyhttp::connect::tests::the_connecting_site_is_read_from_a_connect_link_only11 ms
- ✓Full round trip through setup then redirect then finish yields real working credentialshttp::connect::tests::full_round_trip_through_setup_then_redirect_then_finish_yields_real_working_credentials174 ms
- ✓Plugins cannot connect until the public url is set and are told whyhttp::connect::tests::plugins_cannot_connect_until_the_public_url_is_set_and_are_told_why165 ms
monokulo::http::connections4542 ms
- ✓Creating a connection without a session is rejected before reaching the enginehttp::connections::tests::creating_a_connection_without_a_session_is_rejected_before_reaching_the_engine85 ms
- ✓A known currency with no enabled rate provider is still accepted as a base currencyhttp::connections::tests::a_known_currency_with_no_enabled_rate_provider_is_still_accepted_as_a_base_currency149 ms
- ✓An unknown base currency is rejected before ever provisioning a real tenanthttp::connections::tests::an_unknown_base_currency_is_rejected_before_ever_provisioning_a_real_tenant150 ms
- ✓A logged in user posting valid wallet fields creates a real tenant and a store connections rowhttp::connections::tests::a_logged_in_user_posting_valid_wallet_fields_creates_a_real_tenant_and_a_store_connections_row158 ms
monokulo::http::csrf227 ms
- ✓A browser saying cross site is refused and the sites own requests passhttp::csrf::tests::a_browser_saying_cross_site_is_refused_and_the_sites_own_requests_pass13 ms
- ✓Only state changing methods are checkedhttp::csrf::tests::only_state_changing_methods_are_checked14 ms
monokulo::http::dashboard8237 ms
- ✓A backslash smuggled next is rejectedhttp::dashboard::tests::a_backslash_smuggled_next_is_rejected12 ms
- ✓A genuine relative path is acceptedhttp::dashboard::tests::a_genuine_relative_path_is_accepted12 ms
- ✓A next with no leading slash is rejectedhttp::dashboard::tests::a_next_with_no_leading_slash_is_rejected12 ms
- ✓A javascript scheme next is rejectedhttp::dashboard::tests::a_javascript_scheme_next_is_rejected12 ms
- ✓A protocol relative next is rejectedhttp::dashboard::tests::a_protocol_relative_next_is_rejected11 ms
- ✓A safe path is made only from a path on this sitehttp::dashboard::tests::a_safe_path_is_made_only_from_a_path_on_this_site11 ms
- ✓An absolute url next is rejectedhttp::dashboard::tests::an_absolute_url_next_is_rejected11 ms
- ✓The theme a merchant picks is kept and they return to their pagehttp::dashboard::tests::the_theme_a_merchant_picks_is_kept_and_they_return_to_their_page156 ms
monokulo::http::dashboard::theme_selector_tests111 ms
- ✓Named theme options select directlyhttp::dashboard::theme_selector_tests::named_theme_options_select_directly11 ms
monokulo::http::embed_domains81.5 s
- ✓A dns outage is reported as such and a verified domain recovers by itselfhttp::embed_domains::tests::a_dns_outage_is_reported_as_such_and_a_verified_domain_recovers_by_itself169 ms
- ✓A restricted store only works on its verified domainshttp::embed_domains::tests::a_restricted_store_only_works_on_its_verified_domains192 ms
- ✓A domain is added verified by its dns record and warned about once it goes missinghttp::embed_domains::tests::a_domain_is_added_verified_by_its_dns_record_and_warned_about_once_it_goes_missing246 ms
- ✓Api domains join the store and existing stores get their site imported oncehttp::embed_domains::tests::api_domains_join_the_store_and_existing_stores_get_their_site_imported_once150 ms
- ✓A restricted stores browser created orders only open inside a framehttp::embed_domains::tests::a_restricted_stores_browser_created_orders_only_open_inside_a_frame194 ms
- ✓Secret key orders are accepted and recorded and restricted stores need a key or a verified pagehttp::embed_domains::tests::secret_key_orders_are_accepted_and_recorded_and_restricted_stores_need_a_key_or_a_verified_page160 ms
- ✓Diagnostics turn on the checkouts problem reportshttp::embed_domains::tests::diagnostics_turn_on_the_checkouts_problem_reports228 ms
- ✓The old allowed origins field is accepted as an alias for domainshttp::embed_domains::tests::the_old_allowed_origins_field_is_accepted_as_an_alias_for_domains149 ms
monokulo::http::engine_page96.1 s
- ✓A past round is shown on requesthttp::engine_page::tests::a_past_round_is_shown_on_request136 ms
- ✓An unreachable remote engine is said so over httphttp::engine_page::tests::an_unreachable_remote_engine_is_said_so_over_http93 ms
- ✓The link tiles follow the node in use a fallback toohttp::engine_page::tests::the_link_tiles_follow_the_node_in_use_a_fallback_too24 ms
- ✓Scrubbing and replay answer from the historyhttp::engine_page::tests::scrubbing_and_replay_answer_from_the_history131 ms
- ✓Only admins see the engine pagehttp::engine_page::tests::only_admins_see_the_engine_page174 ms
- ✓The page reads top down in one columnhttp::engine_page::tests::the_page_reads_top_down_in_one_column140 ms
- ✓The page shows the network as of nowhttp::engine_page::tests::the_page_shows_the_network_as_of_now120 ms
- ✓The stream opens with the historyhttp::engine_page::tests::the_stream_opens_with_the_history128 ms
- ✓The machine event comes at once then at most every few secondshttp::engine_page::tests::the_machine_event_comes_at_once_then_at_most_every_few_seconds5.1 s
monokulo::http::fx218 ms
- ✓A fixi post gets the fragment and any other post the redirecthttp::fx::tests::a_fixi_post_gets_the_fragment_and_any_other_post_the_redirect9 ms
- ✓Only a plausible time zone is believedhttp::fx::tests::only_a_plausible_time_zone_is_believed9 ms
monokulo::http::home334 ms
- ✓Formats a fractional amount trimming trailing zeroshttp::home::tests::formats_a_fractional_amount_trimming_trailing_zeros10 ms
- ✓Formats a whole xmr amount with no trailing decimalhttp::home::tests::formats_a_whole_xmr_amount_with_no_trailing_decimal12 ms
- ✓Formats sub piconero precision without losing the last digithttp::home::tests::formats_sub_piconero_precision_without_losing_the_last_digit12 ms
monokulo::http::home::http_tests3367 ms
- ✓Signed out the home page sends you to log in and dashboard moved to ithttp::home::tests::http_tests::signed_out_the_home_page_sends_you_to_log_in_and_dashboard_moved_to_it88 ms
- ✓Dashboard with a connected store and a real order shows the real total receivedhttp::home::tests::http_tests::dashboard_with_a_connected_store_and_a_real_order_shows_the_real_total_received140 ms
- ✓Dashboard with no stores shows the empty state ctahttp::home::tests::http_tests::dashboard_with_no_stores_shows_the_empty_state_cta139 ms
monokulo::http::invites9702 ms
- ✓Delete all clears every pending request and shows a count bannerhttp::invites::tests::delete_all_clears_every_pending_request_and_shows_a_count_banner68 ms
- ✓Deleting a request soft deletes it and shows it struck through once then never againhttp::invites::tests::deleting_a_request_soft_deletes_it_and_shows_it_struck_through_once_then_never_again69 ms
- ✓A standalone invite link is shown once and actually works for signuphttp::invites::tests::a_standalone_invite_link_is_shown_once_and_actually_works_for_signup148 ms
- ✓Invites buttons answer fixi with the sectionhttp::invites::tests::invites_buttons_answer_fixi_with_the_section73 ms
- ✓Pagination shows the right page and clamps after deleting the last row on the last pagehttp::invites::tests::pagination_shows_the_right_page_and_clamps_after_deleting_the_last_row_on_the_last_page69 ms
- ✓Submitting a request invite form saves it and an admin can see it with a real mailto linkhttp::invites::tests::submitting_a_request_invite_form_saves_it_and_an_admin_can_see_it_with_a_real_mailto_link75 ms
- ✓Submitting an empty request invite form is rejected and creates nothinghttp::invites::tests::submitting_an_empty_request_invite_form_is_rejected_and_creates_nothing70 ms
- ✓The invites page is unauthorized without a session and forbidden for a non adminhttp::invites::tests::the_invites_page_is_unauthorized_without_a_session_and_forbidden_for_a_non_admin86 ms
- ✓The request invite form is reachable without a sessionhttp::invites::tests::the_request_invite_form_is_reachable_without_a_session44 ms
monokulo::http::key_entry10247 ms
- ✓A bundle is served while it lastshttp::key_entry::tests::a_bundle_is_served_while_it_lasts10 ms
- ✓An account past its open forms loses only its own oldesthttp::key_entry::tests::an_account_past_its_open_forms_loses_only_its_own_oldest11 ms
- ✓Command words are quoted unless plainly safehttp::key_entry::tests::command_words_are_quoted_unless_plainly_safe11 ms
- ✓Download links name this version and each computerhttp::key_entry::tests::download_links_name_this_version_and_each_computer8 ms
- ✓Required encrypted entry never sends typed keyshttp::key_entry::tests::required_encrypted_entry_never_sends_typed_keys32 ms
- ✓An account opening too many forms gets an alerthttp::key_entry::tests::an_account_opening_too_many_forms_gets_an_alert74 ms
- ✓The source link follows the release then the commithttp::key_entry::tests::the_source_link_follows_the_release_then_the_commit11 ms
- ✓Snp is not offered while the engine trusts other imageshttp::key_entry::tests::snp_is_not_offered_while_the_engine_trusts_other_images38 ms
- ✓The status alert names what differshttp::key_entry::tests::the_status_alert_names_what_differs11 ms
- ✓Typed keys are sent only where the default takes themhttp::key_entry::tests::typed_keys_are_sent_only_where_the_default_takes_them41 ms
monokulo::http::logs_page131.2 s
- ✓A custom range that does not parse is refusedhttp::logs_page::tests::a_custom_range_that_does_not_parse_is_refused9 ms
- ✓A query that does not parse is shown with the problem markedhttp::logs_page::tests::a_query_that_does_not_parse_is_shown_with_the_problem_marked77 ms
- ✓A search downloads as ndjson or csvhttp::logs_page::tests::a_search_downloads_as_ndjson_or_csv65 ms
- ✓A search filters and a fixi search gets only the resultshttp::logs_page::tests::a_search_filters_and_a_fixi_search_gets_only_the_results66 ms
- ✓A trace shows its spans and lineshttp::logs_page::tests::a_trace_shows_its_spans_and_lines60 ms
- ✓Lines say who they were for and a session is one link awayhttp::logs_page::tests::lines_say_who_they_were_for_and_a_session_is_one_link_away82 ms
- ✓Live streams new lines to the top of the listhttp::logs_page::tests::live_streams_new_lines_to_the_top_of_the_list76 ms
- ✓A pos session reads as one timeline in the tablets orderhttp::logs_page::tests::a_pos_session_reads_as_one_timeline_in_the_tablets_order305 ms
- ✓Older pages follow as links or appended by fixihttp::logs_page::tests::older_pages_follow_as_links_or_appended_by_fixi87 ms
- ✓Only admins see the logshttp::logs_page::tests::only_admins_see_the_logs128 ms
- ✓Searches are saved and removed with or without fixihttp::logs_page::tests::searches_are_saved_and_removed_with_or_without_fixi93 ms
- ✓The page works without javascript and says why engine lines are missinghttp::logs_page::tests::the_page_works_without_javascript_and_says_why_engine_lines_are_missing76 ms
- ✓The logs pages own requests are hidden unless asked forhttp::logs_page::tests::the_logs_pages_own_requests_are_hidden_unless_asked_for124 ms
monokulo::http::orders597.8 s
- ✓A different user cannot create an order on someone elses connectionhttp::orders::tests::a_different_user_cannot_create_an_order_on_someone_elses_connection168 ms
- ✓A different user cannot update confirmations on someone elses connectionhttp::orders::tests::a_different_user_cannot_update_confirmations_on_someone_elses_connection205 ms
- ✓A different user hitting the first users connection gets 404 not their datahttp::orders::tests::a_different_user_hitting_the_first_users_connection_gets_404_not_their_data205 ms
- ✓A duplicate unit amount is rejectedhttp::orders::tests::a_duplicate_unit_amount_is_rejected115 ms
- ✓A known currency with no enabled rate provider is still accepted as a base currency changehttp::orders::tests::a_known_currency_with_no_enabled_rate_provider_is_still_accepted_as_a_base_currency_change136 ms
- ✓A form without the haveno fields keeps the stores haveno limitshttp::orders::tests::a_form_without_the_haveno_fields_keeps_the_stores_haveno_limits161 ms
- ✓A negative or out of range new threshold is rejectedhttp::orders::tests::a_negative_or_out_of_range_new_threshold_is_rejected135 ms
- ✓A new store defaults to coingecko and offers no options when none are enabledhttp::orders::tests::a_new_store_defaults_to_coingecko_and_offers_no_options_when_none_are_enabled128 ms
- ✓A sixth custom threshold is rejected until one is deleted in the same savehttp::orders::tests::a_sixth_custom_threshold_is_rejected_until_one_is_deleted_in_the_same_save122 ms
- ✓A new wallet can choose where its keys are kept when there is a choicehttp::orders::tests::a_new_wallet_can_choose_where_its_keys_are_kept_when_there_is_a_choice146 ms
- ✓Adding and deleting a custom confirmation threshold round trips through the real pagehttp::orders::tests::adding_and_deleting_a_custom_confirmation_threshold_round_trips_through_the_real_page118 ms
- ✓A store with coingecko enabled gets a real currency dropdownhttp::orders::tests::a_store_with_coingecko_enabled_gets_a_real_currency_dropdown146 ms
- ✓A store can move its keys to snp from its settings page without jshttp::orders::tests::a_store_can_move_its_keys_to_snp_from_its_settings_page_without_js191 ms
- ✓An order priced above a custom threshold gets that thresholds confirmations required on the real enginehttp::orders::tests::an_order_priced_above_a_custom_threshold_gets_that_thresholds_confirmations_required_on_the_real_engine115 ms
- ✓An order priced below every custom threshold uses the stores default confirmations requiredhttp::orders::tests::an_order_priced_below_every_custom_threshold_uses_the_stores_default_confirmations_required136 ms
- ✓An invalid haveno limit is rejected and nothing is savedhttp::orders::tests::an_invalid_haveno_limit_is_rejected_and_nothing_is_saved168 ms
- ✓An unknown bundle is not found and the key checker is served as webassemblyhttp::orders::tests::an_unknown_bundle_is_not_found_and_the_key_checker_is_served_as_webassembly47 ms
- ✓An unknown base currency is rejected and the existing value is unchangedhttp::orders::tests::an_unknown_base_currency_is_rejected_and_the_existing_value_is_unchanged138 ms
- ✓Changing the base currency deletes every custom thresholdhttp::orders::tests::changing_the_base_currency_deletes_every_custom_threshold136 ms
- ✓Choosing an fx provider the instance has not enabled is a clear error not silently acceptedhttp::orders::tests::choosing_an_fx_provider_the_instance_has_not_enabled_is_a_clear_error_not_silently_accepted136 ms
- ✓Creating an order from the dashboard redirects to its real detail pagehttp::orders::tests::creating_an_order_from_the_dashboard_redirects_to_its_real_detail_page145 ms
- ✓Creating an order with a known but provider unsupported currency gets a distinct errorhttp::orders::tests::creating_an_order_with_a_known_but_provider_unsupported_currency_gets_a_distinct_error132 ms
- ✓Creating an order with an unknown currency shows a clear errorhttp::orders::tests::creating_an_order_with_an_unknown_currency_shows_a_clear_error109 ms
- ✓Custom confirmation save fails closed when thresholds cannot be readhttp::orders::tests::custom_confirmation_save_fails_closed_when_thresholds_cannot_be_read139 ms
- ✓Custom confirmation thresholds save without contacting the enginehttp::orders::tests::custom_confirmation_thresholds_save_without_contacting_the_engine138 ms
- ✓Custom thresholds are displayed in ascending order of amounthttp::orders::tests::custom_thresholds_are_displayed_in_ascending_order_of_amount128 ms
- ✓Dashboard order retries reuse the order and changed history forms create anotherhttp::orders::tests::dashboard_order_retries_reuse_the_order_and_changed_history_forms_create_another134 ms
- ✓Default confirmation save leaves custom thresholds unchangedhttp::orders::tests::default_confirmation_save_leaves_custom_thresholds_unchanged116 ms
- ✓Equivalent decimal thresholds are rejected by both formshttp::orders::tests::equivalent_decimal_thresholds_are_rejected_by_both_forms153 ms
- ✓Haveno fields are ignored and not shown when the instance does not offer havenohttp::orders::tests::haveno_fields_are_ignored_and_not_shown_when_the_instance_does_not_offer_haveno124 ms
- ✓Invalid new threshold does not publish zero conf or delete existing rowshttp::orders::tests::invalid_new_threshold_does_not_publish_zero_conf_or_delete_existing_rows133 ms
- ✓Lookup payment reshows the orders page with a not found messagehttp::orders::tests::lookup_payment_reshows_the_orders_page_with_a_not_found_message137 ms
- ✓Merchant recovers a missed payment by looking up the customers txidhttp::orders::tests::merchant_recovers_a_missed_payment_by_looking_up_the_customers_txid142 ms
- ✓Order detail for an unknown order id renders a clear not found statehttp::orders::tests::order_detail_for_an_unknown_order_id_renders_a_clear_not_found_state134 ms
- ✓Order detail shows the seeded orders full detailhttp::orders::tests::order_detail_shows_the_seeded_orders_full_detail117 ms
- ✓Orders list shows a real order seeded against the engines public apihttp::orders::tests::orders_list_shows_a_real_order_seeded_against_the_engines_public_api139 ms
- ✓Scan range row shows a closed range once no longer being watchedhttp::orders::tests::scan_range_row_shows_a_closed_range_once_no_longer_being_watched13 ms
- ✓Order detail streams its live part to its owner onlyhttp::orders::tests::order_detail_streams_its_live_part_to_its_owner_only203 ms
- ✓Scan range row shows a growing range while the order is still being watchedhttp::orders::tests::scan_range_row_shows_a_growing_range_while_the_order_is_still_being_watched119 ms
- ✓Saving the providers waits for the stores policy lockhttp::orders::tests::saving_the_providers_waits_for_the_stores_policy_lock234 ms
- ✓Scan range row shows a muted dash for an order with no first tick yethttp::orders::tests::scan_range_row_shows_a_muted_dash_for_an_order_with_no_first_tick_yet107 ms
- ✓Store detail shows the real connected stores overview and integration helphttp::orders::tests::store_detail_shows_the_real_connected_stores_overview_and_integration_help143 ms
- ✓The default threshold has no delete control and is not a row in the custom tablehttp::orders::tests::the_default_threshold_has_no_delete_control_and_is_not_a_row_in_the_custom_table126 ms
- ✓Store detail for an unowned or unknown connection returns 404http::orders::tests::store_detail_for_an_unowned_or_unknown_connection_returns_404190 ms
- ✓The order currency dropdown for a haveno store is its own list without asking havenohttp::orders::tests::the_order_currency_dropdown_for_a_haveno_store_is_its_own_list_without_asking_haveno135 ms
- ✓The haveno limits are shown and saved with the provider listhttp::orders::tests::the_haveno_limits_are_shown_and_saved_with_the_provider_list158 ms
- ✓The provider form rejects a provider the instance does not offerhttp::orders::tests::the_provider_form_rejects_a_provider_the_instance_does_not_offer12 ms
- ✓The provider form yields the ticked providers in position orderhttp::orders::tests::the_provider_form_yields_the_ticked_providers_in_position_order10 ms
- ✓The provider options list the stores choices first in its order then the resthttp::orders::tests::the_provider_options_list_the_stores_choices_first_in_its_order_then_the_rest10 ms
- ✓The orders page lists sources and cancellations searches and pageshttp::orders::tests::the_orders_page_lists_sources_and_cancellations_searches_and_pages200 ms
- ✓The settings form saves the changed cards or nothinghttp::orders::tests::the_settings_form_saves_the_changed_cards_or_nothing146 ms
- ✓Unauthenticated requests to all three new routes get 401 before any ownership checkhttp::orders::tests::unauthenticated_requests_to_all_three_new_routes_get_401_before_any_ownership_check77 ms
- ✓Ticking the zero conf checkbox persists and shows as checked on the settings pagehttp::orders::tests::ticking_the_zero_conf_checkbox_persists_and_shows_as_checked_on_the_settings_page158 ms
- ✓Updating the confirmation threshold to zero is acceptedhttp::orders::tests::updating_the_confirmation_threshold_to_zero_is_accepted119 ms
- ✓Updating the confirmation threshold redirects and the new value shows on the store pagehttp::orders::tests::updating_the_confirmation_threshold_redirects_and_the_new_value_shows_on_the_store_page132 ms
- ✓Updating the base currency persists and shows on the store pagehttp::orders::tests::updating_the_base_currency_persists_and_shows_on_the_store_page153 ms
- ✓Updating the confirmation threshold with non numeric input shows a clear errorhttp::orders::tests::updating_the_confirmation_threshold_with_non_numeric_input_shows_a_clear_error124 ms
- ✓Webhooks list on a connection with none registered renders an empty but valid pagehttp::orders::tests::webhooks_list_on_a_connection_with_none_registered_renders_an_empty_but_valid_page146 ms
- ✓With a single key storage backend no choice is shownhttp::orders::tests::with_a_single_key_storage_backend_no_choice_is_shown136 ms
monokulo::http::pay213.2 s
- ✓A change to the stores haveno limits prices the very next orderhttp::pay::tests::a_change_to_the_stores_haveno_limits_prices_the_very_next_order151 ms
- ✓A retried order creation with one key makes one orderhttp::pay::tests::a_retried_order_creation_with_one_key_makes_one_order160 ms
- ✓A change to the stores provider settings prices the very next orderhttp::pay::tests::a_change_to_the_stores_provider_settings_prices_the_very_next_order187 ms
- ✓Client library is served as javascript and calls monokulos own endpointshttp::pay::tests::client_library_is_served_as_javascript_and_calls_monokulos_own_endpoints85 ms
- ✓An unavailable or rateless provider falls through to the next preferredhttp::pay::tests::an_unavailable_or_rateless_provider_falls_through_to_the_next_preferred159 ms
- ✓An order waits for its stores policy edithttp::pay::tests::an_order_waits_for_its_stores_policy_edit227 ms
- ✓Creating a real order records local fiat metadatahttp::pay::tests::creating_a_real_order_records_local_fiat_metadata109 ms
- ✓Creating an order for an unknown public key returns 404http::pay::tests::creating_an_order_for_an_unknown_public_key_returns_40464 ms
- ✓Creating a real order through the public endpoint returns a real address and order idhttp::pay::tests::creating_a_real_order_through_the_public_endpoint_returns_a_real_address_and_order_id137 ms
- ✓Creating a real order with a merchant order id records it on the enginehttp::pay::tests::creating_a_real_order_with_a_merchant_order_id_records_it_on_the_engine158 ms
- ✓Creating an order is rejected when the stores own base currency has no available rate providerhttp::pay::tests::creating_an_order_is_rejected_when_the_stores_own_base_currency_has_no_available_rate_provider137 ms
- ✓Creating an order with a known but provider unsupported currency gets a distinct errorhttp::pay::tests::creating_an_order_with_a_known_but_provider_unsupported_currency_gets_a_distinct_error142 ms
- ✓Creating an order with a malformed amount is a clear 400 not a 500http::pay::tests::creating_an_order_with_a_malformed_amount_is_a_clear_400_not_a_500135 ms
- ✓Creating an order with an unknown currency is rejected before ever reaching the enginehttp::pay::tests::creating_an_order_with_an_unknown_currency_is_rejected_before_ever_reaching_the_engine136 ms
- ✓Every static file the pages reference is served with its typehttp::pay::tests::every_static_file_the_pages_reference_is_served_with_its_type137 ms
- ✓Haveno can be ordered first and falls through when its book is one sidedhttp::pay::tests::haveno_can_be_ordered_first_and_falls_through_when_its_book_is_one_sided207 ms
- ✓Malformed stored threshold cannot fall back to zero confhttp::pay::tests::malformed_stored_threshold_cannot_fall_back_to_zero_conf136 ms
- ✓Only the checkout refreshes by itselfhttp::pay::tests::only_the_checkout_refreshes_by_itself152 ms
- ✓Threshold database failure rejects order even with zero conf defaulthttp::pay::tests::threshold_database_failure_rejects_order_even_with_zero_conf_default142 ms
- ✓Only the store itself can forward its plugin errorshttp::pay::tests::only_the_store_itself_can_forward_its_plugin_errors162 ms
- ✓Two merchants with different haveno limits are priced by their own limits from one shared cachehttp::pay::tests::two_merchants_with_different_haveno_limits_are_priced_by_their_own_limits_from_one_shared_cache234 ms
monokulo::http::pos264.2 s
- ✓A cancellation that cannot be taken back is an error and wakes nothing morehttp::pos::tests::a_cancellation_that_cannot_be_taken_back_is_an_error_and_wakes_nothing_more134 ms
- ✓A failed read of the pos rows sends nothing and fails the statushttp::pos::tests::a_failed_read_of_the_pos_rows_sends_nothing_and_fails_the_status130 ms
- ✓A paid order whose row still says cancelled is shown paid not cancelledhttp::pos::tests::a_paid_order_whose_row_still_says_cancelled_is_shown_paid_not_cancelled122 ms
- ✓A pos order created against a fiat base currency is rejected with no priced provider configuredhttp::pos::tests::a_pos_order_created_against_a_fiat_base_currency_is_rejected_with_no_priced_provider_configured132 ms
- ✓A payment landing as an order is cancelled takes the cancellation backhttp::pos::tests::a_payment_landing_as_an_order_is_cancelled_takes_the_cancellation_back152 ms
- ✓An order paid in full as it is cancelled is never shown cancelledhttp::pos::tests::an_order_paid_in_full_as_it_is_cancelled_is_never_shown_cancelled129 ms
- ✓A rate limited engine is a retryable 503 not an internal errorhttp::pos::tests::a_rate_limited_engine_is_a_retryable_503_not_an_internal_error211 ms
- ✓Backgrounding and cancelling an order are sent on its live streamhttp::pos::tests::backgrounding_and_cancelling_an_order_are_sent_on_its_live_stream143 ms
- ✓Creating a pos order rejects a malformed amounthttp::pos::tests::creating_a_pos_order_rejects_a_malformed_amount160 ms
- ✓Creating a pos order rejects an empty amounthttp::pos::tests::creating_a_pos_order_rejects_an_empty_amount161 ms
- ✓Creating a pos order uses the stores own base currency and is visible on the dashboardhttp::pos::tests::creating_a_pos_order_uses_the_stores_own_base_currency_and_is_visible_on_the_dashboard161 ms
- ✓Creating a pos order 404s for a connection owned by a different userhttp::pos::tests::creating_a_pos_order_404s_for_a_connection_owned_by_a_different_user207 ms
- ✓Production pos assets are served with browser mime typeshttp::pos::tests::production_pos_assets_are_served_with_browser_mime_types92 ms
- ✓Creating a pos order with a blank note records no merchant order idhttp::pos::tests::creating_a_pos_order_with_a_blank_note_records_no_merchant_order_id160 ms
- ✓Creating a pos order with a note records it as the real merchant order idhttp::pos::tests::creating_a_pos_order_with_a_note_records_it_as_the_real_merchant_order_id160 ms
- ✓Pending order can be backgrounded listed reopened and cancelledhttp::pos::tests::pending_order_can_be_backgrounded_listed_reopened_and_cancelled217 ms
- ✓The events stream reports every watched order and pushes changeshttp::pos::tests::the_events_stream_reports_every_watched_order_and_pushes_changes157 ms
- ✓The active list has every open pos order however many newer ones finishedhttp::pos::tests::the_active_list_has_every_open_pos_order_however_many_newer_ones_finished250 ms
- ✓The order list and events stream read many orders in one engine requesthttp::pos::tests::the_order_list_and_events_stream_read_many_orders_in_one_engine_request201 ms
- ✓The pos page 404s for a connection owned by a different userhttp::pos::tests::the_pos_page_404s_for_a_connection_owned_by_a_different_user202 ms
- ✓The pos page is a real 404 not a 500 for an unknown connectionhttp::pos::tests::the_pos_page_is_a_real_404_not_a_500_for_an_unknown_connection160 ms
- ✓The pos page requires authenticationhttp::pos::tests::the_pos_page_requires_authentication150 ms
- ✓The pos page renders for the owning user with the stores own base currencyhttp::pos::tests::the_pos_page_renders_for_the_owning_user_with_the_stores_own_base_currency152 ms
- ✓The status endpoint 404s for an unknown order idhttp::pos::tests::the_status_endpoint_404s_for_an_unknown_order_id146 ms
- ✓The status endpoint 404s for a connection owned by a different userhttp::pos::tests::the_status_endpoint_404s_for_a_connection_owned_by_a_different_user205 ms
- ✓The status endpoint reports pending with no error for a fresh orderhttp::pos::tests::the_status_endpoint_reports_pending_with_no_error_for_a_fresh_order153 ms
monokulo::http::pos::pure_logic_tests661 ms
- ✓A double spend is flagged regardless of statushttp::pos::pure_logic_tests::a_double_spend_is_flagged_regardless_of_status12 ms
- ✓A partial payment is flagged as underpaidhttp::pos::pure_logic_tests::a_partial_payment_is_flagged_as_underpaid9 ms
- ✓A pending unconfirmed or confirming order has no errorhttp::pos::pure_logic_tests::a_pending_unconfirmed_or_confirming_order_has_no_error11 ms
- ✓A plain paid order has no errorhttp::pos::pure_logic_tests::a_plain_paid_order_has_no_error9 ms
- ✓An expired order is flaggedhttp::pos::pure_logic_tests::an_expired_order_is_flagged11 ms
- ✓An overpaid order is flaggedhttp::pos::pure_logic_tests::an_overpaid_order_is_flagged9 ms
monokulo::http::pos_logs336 ms
- ✓Detail text and detail pairs are inverseshttp::pos_logs::tests::detail_text_and_detail_pairs_are_inverses11 ms
- ✓Details are flat clipped and keep no control charactershttp::pos_logs::tests::details_are_flat_clipped_and_keep_no_control_characters13 ms
- ✓Session ids kinds and order ids are checkedhttp::pos_logs::tests::session_ids_kinds_and_order_ids_are_checked12 ms
monokulo::http::signup112 ms
- ✓An email is stored trimmed and lowercased and must be an addresshttp::signup::tests::an_email_is_stored_trimmed_and_lowercased_and_must_be_an_address12 ms
monokulo::http::status_page6114 ms
- ✓A slow block is yellow and says why and what would helphttp::status_page::tests::a_slow_block_is_yellow_and_says_why_and_what_would_help12 ms
- ✓Relative time never goes negative for a clock that moved backwardhttp::status_page::tests::relative_time_never_goes_negative_for_a_clock_that_moved_backward11 ms
- ✓Relative time picks the right buckethttp::status_page::tests::relative_time_picks_the_right_bucket11 ms
- ✓The snp policy is checked against the backends the save leaveshttp::status_page::tests::the_snp_policy_is_checked_against_the_backends_the_save_leaves11 ms
- ✓The status page says when block headers are read firsthttp::status_page::tests::the_status_page_says_when_block_headers_are_read_first11 ms
- ✓Known health renders the last known state and refreshes it in the backgroundhttp::status_page::tests::known_health_renders_the_last_known_state_and_refreshes_it_in_the_background58 ms
monokulo::http::status_page::http_tests10732 ms
- ✓Announcements are shown to admins onlyhttp::status_page::tests::http_tests::announcements_are_shown_to_admins_only52 ms
- ✓Status page describes each scanner state and an unreachable nodehttp::status_page::tests::http_tests::status_page_describes_each_scanner_state_and_an_unreachable_node13 ms
- ✓Get status cached reuses a fresh fetch instead of refetchinghttp::status_page::tests::http_tests::get_status_cached_reuses_a_fresh_fetch_instead_of_refetching86 ms
- ✓Proof of work checking is shown to admins onlyhttp::status_page::tests::http_tests::proof_of_work_checking_is_shown_to_admins_only93 ms
- ✓Requests that arrive during a fetch share ithttp::status_page::tests::http_tests::requests_that_arrive_during_a_fetch_share_it96 ms
- ✓Status page is reachable with no authentication and shows no configured networkshttp::status_page::tests::http_tests::status_page_is_reachable_with_no_authentication_and_shows_no_configured_networks90 ms
- ✓Status page shows a plain error banner when a remote engine is unreachable over httphttp::status_page::tests::http_tests::status_page_shows_a_plain_error_banner_when_a_remote_engine_is_unreachable_over_http60 ms
- ✓Status summary reports unhealthy when a remote engine is unreachable over httphttp::status_page::tests::http_tests::status_summary_reports_unhealthy_when_a_remote_engine_is_unreachable_over_http60 ms
- ✓Status page lists a configured networks node and a scanner not yet runhttp::status_page::tests::http_tests::status_page_lists_a_configured_networks_node_and_a_scanner_not_yet_run92 ms
- ✓Status summary reports unhealthy when there are no configured networkshttp::status_page::tests::http_tests::status_summary_reports_unhealthy_when_there_are_no_configured_networks90 ms
monokulo::http::telemetry_client352 ms
- ✓A report that is not json is refusedhttp::telemetry_client::tests::a_report_that_is_not_json_is_refused11 ms
- ✓Texts are clipped and lose their control charactershttp::telemetry_client::tests::texts_are_clipped_and_lose_their_control_characters11 ms
- ✓Pages about a store report only once it opted inhttp::telemetry_client::tests::pages_about_a_store_report_only_once_it_opted_in30 ms
monokulo::http::wallets152.6 s
- ✓A brought in wallet is registered named and listedhttp::wallets::tests::a_brought_in_wallet_is_registered_named_and_listed168 ms
- ✓A brought in wallet records which app it is inhttp::wallets::tests::a_brought_in_wallet_records_which_app_it_is_in163 ms
- ✓A name in use is refused before any phrase is madehttp::wallets::tests::a_name_in_use_is_refused_before_any_phrase_is_made164 ms
- ✓A name taken meanwhile gets a number instead of losing the backuphttp::wallets::tests::a_name_taken_meanwhile_gets_a_number_instead_of_losing_the_backup168 ms
- ✓A retired wallet comes back only with its own keyshttp::wallets::tests::a_retired_wallet_comes_back_only_with_its_own_keys168 ms
- ✓A store made before wallets gets its wallethttp::wallets::tests::a_store_made_before_wallets_gets_its_wallet163 ms
- ✓A wallet is renamed and only deleted unused with its name typedhttp::wallets::tests::a_wallet_is_renamed_and_only_deleted_unused_with_its_name_typed168 ms
- ✓Adding a wallet names it first and creating one waits for javascripthttp::wallets::tests::adding_a_wallet_names_it_first_and_creating_one_waits_for_javascript155 ms
- ✓A wallet made in the browser is added with its backup and the page never sends its phrasehttp::wallets::tests::a_wallet_made_in_the_browser_is_added_with_its_backup_and_the_page_never_sends_its_phrase175 ms
- ✓Keys that dont match the pages address are refused and nothing is kepthttp::wallets::tests::keys_that_dont_match_the_pages_address_are_refused_and_nothing_is_kept165 ms
- ✓Changing a stores wallet asks first then records it everywherehttp::wallets::tests::changing_a_stores_wallet_asks_first_then_records_it_everywhere213 ms
- ✓The same wallet twice is refused and a blank name is picked for youhttp::wallets::tests::the_same_wallet_twice_is_refused_and_a_blank_name_is_picked_for_you163 ms
- ✓Someone elses wallet is not foundhttp::wallets::tests::someone_elses_wallet_is_not_found183 ms
- ✓Two stores on one wallet get different order addresseshttp::wallets::tests::two_stores_on_one_wallet_get_different_order_addresses169 ms
- ✓The wallet card asks first and refuses another networkhttp::wallets::tests::the_wallet_card_asks_first_and_refuses_another_network195 ms
monokulo::options_file4311 ms
- ✓Init writes the options file where xdg says and never overwrites itinit_writes_the_options_file_where_xdg_says_and_never_overwrites_it30 ms
- ✓Monokulo does not start on a file it cannot usemonokulo_does_not_start_on_a_file_it_cannot_use24 ms
- ✓Settings for the other engine mode stop monokulosettings_for_the_other_engine_mode_stop_monokulo40 ms
- ✓Monokulo starts without a file and follows onemonokulo_starts_without_a_file_and_follows_one217 ms
monokulo::settings102.5 s
- ✓A public url must be an http base url with nothing after itsettings::tests::a_public_url_must_be_an_http_base_url_with_nothing_after_it12 ms
- ✓Every section builds from the defaults and every setting is in onesettings::tests::every_section_builds_from_the_defaults_and_every_setting_is_in_one13 ms
- ✓Exchange rates default to the keyless public providerssettings::tests::exchange_rates_default_to_the_keyless_public_providers13 ms
- ✓Public url is none until set and then normalizedsettings::tests::public_url_is_none_until_set_and_then_normalized12 ms
- ✓The command line wins over the options filesettings::tests::the_command_line_wins_over_the_options_file13 ms
- ✓The engine mode decides whether its url and token are wantedsettings::tests::the_engine_mode_decides_whether_its_url_and_token_are_wanted13 ms
- ✓The start up settings come from outside and the key is requiredsettings::tests::the_start_up_settings_come_from_outside_and_the_key_is_required12 ms
- ✓The webhook delivery keep periods load and bad ones stop monokulosettings::tests::the_webhook_delivery_keep_periods_load_and_bad_ones_stop_monokulo130 ms
- ✓Saved settings reach the engine client exchange rates and abuse protectionsettings::tests::saved_settings_reach_the_engine_client_exchange_rates_and_abuse_protection165 ms
- ✓The onion listener starts moves and stops when savedsettings::tests::the_onion_listener_starts_moves_and_stops_when_saved2.1 s
monokulo::stores555 ms
- ✓A name is tidied and must be therestores::tests::a_name_is_tidied_and_must_be_there11 ms
- ✓A pasted address keeps only its hoststores::tests::a_pasted_address_keeps_only_its_host11 ms
- ✓A port stays only when it isnt the schemesstores::tests::a_port_stays_only_when_it_isnt_the_schemes11 ms
- ✓Local and onion sites link over plain httpstores::tests::local_and_onion_sites_link_over_plain_http10 ms
- ✓What cant be a site says whystores::tests::what_cant_be_a_site_says_why12 ms
monokulo::views10107 ms
- ✓A network badge always says the network and marks mainnet apartviews::tests::a_network_badge_always_says_the_network_and_marks_mainnet_apart10 ms
- ✓An admin sees the status dot in the bar then admin links then their account menuviews::tests::an_admin_sees_the_status_dot_in_the_bar_then_admin_links_then_their_account_menu11 ms
- ✓Home is marked on the home page and only for someone signed inviews::tests::home_is_marked_on_the_home_page_and_only_for_someone_signed_in12 ms
- ✓Logs links are for admins and quote the valueviews::tests::logs_links_are_for_admins_and_quote_the_value11 ms
- ✓Signed out the nav offers log in and sign up and no account controlsviews::tests::signed_out_the_nav_offers_log_in_and_sign_up_and_no_account_controls10 ms
- ✓Status indicator is rendered with the known health and polls only as an enhancementviews::tests::status_indicator_is_rendered_with_the_known_health_and_polls_only_as_an_enhancement9 ms
- ✓The nav row keeps one height and the status dot is a 44px targetviews::tests::the_nav_row_keeps_one_height_and_the_status_dot_is_a_44px_target10 ms
- ✓The account menu holds who account wallets theme times and log out in that orderviews::tests::the_account_menu_holds_who_account_wallets_theme_times_and_log_out_in_that_order12 ms
- ✓Theme hover moves the thumb and recolors only the hovered iconviews::tests::theme_hover_moves_the_thumb_and_recolors_only_the_hovered_icon11 ms
- ✓Theme toggle renders a slider with a thumb positioned for the current themeviews::tests::theme_toggle_renders_a_slider_with_a_thumb_positioned_for_the_current_theme11 ms
monokulo::views::account7113 ms
- ✓A refused save marks its card and keeps what was sent against what is savedviews::account::tests::a_refused_save_marks_its_card_and_keeps_what_was_sent_against_what_is_saved22 ms
- ✓Tabs are named by their query and profile is the defaultviews::account::tests::tabs_are_named_by_their_query_and_profile_is_the_default10 ms
- ✓A save says what it savedviews::account::tests::a_save_says_what_it_saved25 ms
- ✓The theme choice previews each theme and marks the chosen oneviews::account::tests::the_theme_choice_previews_each_theme_and_marks_the_chosen_one12 ms
- ✓The profile tab has email appearance and language and time cards and one save barviews::account::tests::the_profile_tab_has_email_appearance_and_language_and_time_cards_and_one_save_bar21 ms
- ✓The security tab asks for the current password and a new oneviews::account::tests::the_security_tab_asks_for_the_current_password_and_a_new_one13 ms
- ✓Without javascript an email change asks on a page of its ownviews::account::tests::without_javascript_an_email_change_asks_on_a_page_of_its_own10 ms
monokulo::views::admin34536 ms
- ✓A node row is closed to a line with a handle and its move buttons are for no scriptviews::admin::tests::a_node_row_is_closed_to_a_line_with_a_handle_and_its_move_buttons_are_for_no_script15 ms
- ✓A network is closed until it has nodes or storesviews::admin::tests::a_network_is_closed_until_it_has_nodes_or_stores17 ms
- ✓A nodes status is said in wordsviews::admin::tests::a_nodes_status_is_said_in_words13 ms
- ✓A setting shows its name then help then controlviews::admin::tests::a_setting_shows_its_name_then_help_then_control10 ms
- ✓A setting the map does not know goes to otherviews::admin::tests::a_setting_the_map_does_not_know_goes_to_other11 ms
- ✓A refused card is red says why and shows what was typedviews::admin::tests::a_refused_card_is_red_says_why_and_shows_what_was_typed19 ms
- ✓A tab is found by its id and anything else is generalviews::admin::tests::a_tab_is_found_by_its_id_and_anything_else_is_general9 ms
- ✓A time limit shown again keeps the saved time to discard toviews::admin::tests::a_time_limit_shown_again_keeps_the_saved_time_to_discard_to11 ms
- ✓A tab is marked while something on it needs attentionviews::admin::tests::a_tab_is_marked_while_something_on_it_needs_attention19 ms
- ✓Admin invites page lists rows with a mailto link and a delete form carrying the current pageviews::admin::tests::admin_invites_page_lists_rows_with_a_mailto_link_and_a_delete_form_carrying_the_current_page10 ms
- ✓A toast says how a save wentviews::admin::tests::a_toast_says_how_a_save_went25 ms
- ✓Admin invites page shows no pending message when emptyviews::admin::tests::admin_invites_page_shows_no_pending_message_when_empty10 ms
- ✓Admin invites page shows the struck through just deleted row even with no other pending rowsviews::admin::tests::admin_invites_page_shows_the_struck_through_just_deleted_row_even_with_no_other_pending_rows10 ms
- ✓Development logging is chosen as off or a number of hours and says when it endsviews::admin::tests::development_logging_is_chosen_as_off_or_a_number_of_hours_and_says_when_it_ends11 ms
- ✓After a save focus lands where it says what it didviews::admin::tests::after_a_save_focus_lands_where_it_says_what_it_did16 ms
- ✓Banners are above the tab bar on every tabviews::admin::tests::banners_are_above_the_tab_bar_on_every_tab25 ms
- ✓Each group of settings is a card with its heading and ownerviews::admin::tests::each_group_of_settings_is_a_card_with_its_heading_and_owner14 ms
- ✓Each key custody backend has its own section shown while it is turned onviews::admin::tests::each_key_custody_backend_has_its_own_section_shown_while_it_is_turned_on13 ms
- ✓Each networks proof of work switch is in its own blockviews::admin::tests::each_networks_proof_of_work_switch_is_in_its_own_block15 ms
- ✓Every setting known today has a named tabviews::admin::tests::every_setting_known_today_has_a_named_tab33 ms
- ✓Every tab copes with an engine it cannot reachviews::admin::tests::every_tab_copes_with_an_engine_it_cannot_reach24 ms
- ✓Each tab shows only its own settingsviews::admin::tests::each_tab_shows_only_its_own_settings47 ms
- ✓Inputs follow the kind of value and secrets are never echoedviews::admin::tests::inputs_follow_the_kind_of_value_and_secrets_are_never_echoed9 ms
- ✓General is the default and the open tab is marked currentviews::admin::tests::general_is_the_default_and_the_open_tab_is_marked_current23 ms
- ✓Notices render with their level and restart only fields say soviews::admin::tests::notices_render_with_their_level_and_restart_only_fields_say_so12 ms
- ✓Node rows are named in order with their buttons and a blank row to add oneviews::admin::tests::node_rows_are_named_in_order_with_their_buttons_and_a_blank_row_to_add_one15 ms
- ✓Request invite page shows the form before submission and a thank you afterviews::admin::tests::request_invite_page_shows_the_form_before_submission_and_a_thank_you_after11 ms
- ✓Setup page shows the echoed email and an errorviews::admin::tests::setup_page_shows_the_echoed_email_and_an_error11 ms
- ✓Tabs with two owners head each groupviews::admin::tests::tabs_with_two_owners_head_each_group17 ms
- ✓The nodes tab keeps each nodes status and links to the engine pageviews::admin::tests::the_nodes_tab_keeps_each_nodes_status_and_links_to_the_engine_page14 ms
- ✓The other tab shows only with something in itviews::admin::tests::the_other_tab_shows_only_with_something_in_it13 ms
- ✓The tab list covers both registriesviews::admin::tests::the_tab_list_covers_both_registries9 ms
- ✓The save bar is the tabs one save and discard loads the tab againviews::admin::tests::the_save_bar_is_the_tabs_one_save_and_discard_loads_the_tab_again13 ms
- ✓What is wrong shows where it isviews::admin::tests::what_is_wrong_shows_where_it_is12 ms
monokulo::views::auth993 ms
- ✓Login page escapes special characters in next rather than injecting them rawviews::auth::tests::login_page_escapes_special_characters_in_next_rather_than_injecting_them_raw11 ms
- ✓Login page has no hidden next field when absentviews::auth::tests::login_page_has_no_hidden_next_field_when_absent10 ms
- ✓Login page includes a hidden next field when presentviews::auth::tests::login_page_includes_a_hidden_next_field_when_present10 ms
- ✓Login page shows the error when presentviews::auth::tests::login_page_shows_the_error_when_present9 ms
- ✓Login page renders with no errorviews::auth::tests::login_page_renders_with_no_error11 ms
- ✓Signup fields are labelled and say the password ruleviews::auth::tests::signup_fields_are_labelled_and_say_the_password_rule11 ms
- ✓Signup page shows the error when presentviews::auth::tests::signup_page_shows_the_error_when_present9 ms
- ✓Signup page renders with no errorviews::auth::tests::signup_page_renders_with_no_error11 ms
- ✓Signup page shows the invite required message and hides the formviews::auth::tests::signup_page_shows_the_invite_required_message_and_hides_the_form11 ms
monokulo::views::challenge19 ms
- ✓The interstitial works without javascript and announces itselfviews::challenge::tests::the_interstitial_works_without_javascript_and_announces_itself9 ms
monokulo::views::checkout18196 ms
- ✓Checkout page auto refresh toggle turns the meta refresh off and back onviews::checkout::tests::checkout_page_auto_refresh_toggle_turns_the_meta_refresh_off_and_back_on11 ms
- ✓Checkout page lists payments when presentviews::checkout::tests::checkout_page_lists_payments_when_present10 ms
- ✓Checkout page keeps the refund field editable after savingviews::checkout::tests::checkout_page_keeps_the_refund_field_editable_after_saving12 ms
- ✓Checkout page meta refreshes once a minute only without javascriptviews::checkout::tests::checkout_page_meta_refreshes_once_a_minute_only_without_javascript12 ms
- ✓Checkout page preserves no js refund entry and adds local qr captureviews::checkout::tests::checkout_page_preserves_no_js_refund_entry_and_adds_local_qr_capture11 ms
- ✓Checkout page shows the double spend stage only when one was detectedviews::checkout::tests::checkout_page_shows_the_double_spend_stage_only_when_one_was_detected13 ms
- ✓Checkout page stops meta refreshing once the order is terminalviews::checkout::tests::checkout_page_stops_meta_refreshing_once_the_order_is_terminal10 ms
- ✓Compact view uses the same payment markup and stageviews::checkout::tests::compact_view_uses_the_same_payment_markup_and_stage9 ms
- ✓Full payment hides deadline and overpayment explains excessviews::checkout::tests::full_payment_hides_deadline_and_overpayment_explains_excess11 ms
- ✓Live fragment carries every changing region and nothing elseviews::checkout::tests::live_fragment_carries_every_changing_region_and_nothing_else11 ms
- ✓Not found page renders with no navviews::checkout::tests::not_found_page_renders_with_no_nav10 ms
- ✓Partial payment shows remaining amount and deadlineviews::checkout::tests::partial_payment_shows_remaining_amount_and_deadline9 ms
- ✓Refund flag hides the entire refund sectionviews::checkout::tests::refund_flag_hides_the_entire_refund_section12 ms
- ✓Share page shows a not found state with the site nav when not foundviews::checkout::tests::share_page_shows_a_not_found_state_with_the_site_nav_when_not_found10 ms
- ✓Share page wraps the iframe with the site nav when foundviews::checkout::tests::share_page_wraps_the_iframe_with_the_site_nav_when_found10 ms
- ✓The code fades once the payment is seen or the order is overviews::checkout::tests::the_code_fades_once_the_payment_is_seen_or_the_order_is_over12 ms
- ✓The stage leads the page in every state and the code never leavesviews::checkout::tests::the_stage_leads_the_page_in_every_state_and_the_code_never_leaves12 ms
- ✓The track has no confirm step when one payment is enoughviews::checkout::tests::the_track_has_no_confirm_step_when_one_payment_is_enough11 ms
monokulo::views::connect223 ms
- ✓A shop that cant connect says why and shows no formviews::connect::tests::a_shop_that_cant_connect_says_why_and_shows_no_form12 ms
- ✓A shop your store already has connects to it with one buttonviews::connect::tests::a_shop_your_store_already_has_connects_to_it_with_one_button11 ms
monokulo::views::controls286 ms
- ✓A switch is named so off is sent tooviews::controls::tests::a_switch_is_named_so_off_is_sent_too9 ms
- ✓Every select is the dropdown componentviews::controls::tests::every_select_is_the_dropdown_component77 ms
monokulo::views::create_order444 ms
- ✓A rejected submission keeps its values and its request keyviews::create_order::tests::a_rejected_submission_keeps_its_values_and_its_request_key12 ms
- ✓Locks currency to xmr when no provider is availableviews::create_order::tests::locks_currency_to_xmr_when_no_provider_is_available11 ms
- ✓Renders the form with a merchant reference fieldviews::create_order::tests::renders_the_form_with_a_merchant_reference_field10 ms
- ✓Shows the create order error when presentviews::create_order::tests::shows_the_create_order_error_when_present11 ms
monokulo::views::engine439 ms
- ✓A segment places its shapes in its lengthviews::engine::tests::a_segment_places_its_shapes_in_its_length8 ms
- ✓Labels go on the lowest level they are clear onviews::engine::tests::labels_go_on_the_lowest_level_they_are_clear_on11 ms
- ✓The strip draws short spans whole and cuts long onesviews::engine::tests::the_strip_draws_short_spans_whole_and_cuts_long_ones8 ms
- ✓The strip is as tall as its labels levelsviews::engine::tests::the_strip_is_as_tall_as_its_labels_levels12 ms
monokulo::views::home439 ms
- ✓A long public key and order id are shortened with the whole in reachviews::home::tests::a_long_public_key_and_order_id_are_shortened_with_the_whole_in_reach9 ms
- ✓Never shows a meta refreshviews::home::tests::never_shows_a_meta_refresh8 ms
- ✓Lists stores and recent orders when presentviews::home::tests::lists_stores_and_recent_orders_when_present11 ms
- ✓Shows the add store cta when the user has no storesviews::home::tests::shows_the_add_store_cta_when_the_user_has_no_stores11 ms
monokulo::views::key_entry329 ms
- ✓A build that is not a release points at the source and a custom key is namedviews::key_entry::tests::a_build_that_is_not_a_release_points_at_the_source_and_a_custom_key_is_named10 ms
- ✓A release links its own cli and the command to runviews::key_entry::tests::a_release_links_its_own_cli_and_the_command_to_run9 ms
- ✓Keys are required only when they must be typedviews::key_entry::tests::keys_are_required_only_when_they_must_be_typed10 ms
monokulo::views::orders777 ms
- ✓Detail page shows a not found state when order is noneviews::orders::tests::detail_page_shows_a_not_found_state_when_order_is_none8 ms
- ✓A middle page links newer and older keeping the searchviews::orders::tests::a_middle_page_links_newer_and_older_keeping_the_search12 ms
- ✓Detail page hides the double spend row entirely when none was detectedviews::orders::tests::detail_page_hides_the_double_spend_row_entirely_when_none_was_detected13 ms
- ✓Detail page shows the double spend row when one was detectedviews::orders::tests::detail_page_shows_the_double_spend_row_when_one_was_detected12 ms
- ✓Detail page uses order breadcrumbviews::orders::tests::detail_page_uses_order_breadcrumb10 ms
- ✓List page links to each order detail pageviews::orders::tests::list_page_links_to_each_order_detail_page11 ms
- ✓List page shortens a long order id inside a plain linkviews::orders::tests::list_page_shortens_a_long_order_id_inside_a_plain_link11 ms
monokulo::views::pos19 ms
- ✓Renders solid mount with store config and no site navviews::pos::tests::renders_solid_mount_with_store_config_and_no_site_nav9 ms
monokulo::views::scaling878 ms
- ✓Different machines are shown apart and a silent engine says soviews::scaling::tests::different_machines_are_shown_apart_and_a_silent_engine_says_so11 ms
- ✓Figures read as people write themviews::scaling::tests::figures_read_as_people_write_them10 ms
- ✓One machine stacks engine under monokulo with the total and splitviews::scaling::tests::one_machine_stacks_engine_under_monokulo_with_the_total_and_split9 ms
- ✓One process splits cpu and shows memory onceviews::scaling::tests::one_process_splits_cpu_and_shows_memory_once11 ms
- ✓Samples land on their slot and missing ones are gapsviews::scaling::tests::samples_land_on_their_slot_and_missing_ones_are_gaps8 ms
- ✓The block size tile gives the average and its trendviews::scaling::tests::the_block_size_tile_gives_the_average_and_its_trend10 ms
- ✓The link tiles follow the node in useviews::scaling::tests::the_link_tiles_follow_the_node_in_use10 ms
- ✓The scanning panel says what sets the pace and whyviews::scaling::tests::the_scanning_panel_says_what_sets_the_pace_and_why9 ms
monokulo::views::settings658 ms
- ✓A card says how the last save wentviews::settings::tests::a_card_says_how_the_last_save_went9 ms
- ✓A cards own attributes are escapedviews::settings::tests::a_cards_own_attributes_are_escaped11 ms
- ✓A form saves with fixi or reloads as its page asksviews::settings::tests::a_form_saves_with_fixi_or_reloads_as_its_page_asks10 ms
- ✓A setting has its label its changed mark and its helpviews::settings::tests::a_setting_has_its_label_its_changed_mark_and_its_help10 ms
- ✓The save bar saves and discardsviews::settings::tests::the_save_bar_saves_and_discards8 ms
- ✓A toast links to the card it is aboutviews::settings::tests::a_toast_links_to_the_card_it_is_about10 ms
monokulo::views::setup10109 ms
- ✓A site one of your stores has links to it and someone elses does notviews::setup::tests::a_site_one_of_your_stores_has_links_to_it_and_someone_elses_does_not12 ms
- ✓Bringing your own wallet has two small stepsviews::setup::tests::bringing_your_own_wallet_has_two_small_steps8 ms
- ✓Done lists the checkout the plugin and the tillviews::setup::tests::done_lists_the_checkout_the_plugin_and_the_till12 ms
- ✓From the plugin the site is the shops and fixedviews::setup::tests::from_the_plugin_the_site_is_the_shops_and_fixed11 ms
- ✓From the plugin back to woocommerce is the primaryviews::setup::tests::from_the_plugin_back_to_woocommerce_is_the_primary11 ms
- ✓Progress counts completed wallet tasksviews::setup::tests::progress_counts_completed_wallet_tasks10 ms
- ✓The store step asks a name and an optional websiteviews::setup::tests::the_store_step_asks_a_name_and_an_optional_website12 ms
- ✓The steps never say done before the store existsviews::setup::tests::the_steps_never_say_done_before_the_store_exists12 ms
- ✓With a site the guide is the primaryviews::setup::tests::with_a_site_the_guide_is_the_primary9 ms
- ✓With no site the till is the primaryviews::setup::tests::with_no_site_the_till_is_the_primary12 ms
monokulo::views::shorten220 ms
- ✓A shortened value shows the short text over the wholeviews::shorten::tests::a_shortened_value_shows_the_short_text_over_the_whole8 ms
- ✓A shortened value never shows three dotsviews::shorten::tests::a_shortened_value_never_shows_three_dots12 ms
monokulo::views::status17176 ms
- ✓A slow block is announced at the topviews::status::tests::a_slow_block_is_announced_at_the_top9 ms
- ✓A non admin sees no proof of workviews::status::tests::a_non_admin_sees_no_proof_of_work12 ms
- ✓A trust mismatch is a red alert at the topviews::status::tests::a_trust_mismatch_is_a_red_alert_at_the_top10 ms
- ✓Each node is a card on a phoneviews::status::tests::each_node_is_a_card_on_a_phone9 ms
- ✓Each verdict is shown in wordsviews::status::tests::each_verdict_is_shown_in_words11 ms
- ✓Shows a node row and its error when unreachableviews::status::tests::shows_a_node_row_and_its_error_when_unreachable11 ms
- ✓Shows a plain error banner when the engine is unreachableviews::status::tests::shows_a_plain_error_banner_when_the_engine_is_unreachable11 ms
- ✓Shows no configured networks message when networks is emptyviews::status::tests::shows_no_configured_networks_message_when_networks_is_empty9 ms
- ✓The card is titled by the network with its states beside itviews::status::tests::the_card_is_titled_by_the_network_with_its_states_beside_it11 ms
- ✓The facts fold under how its checkedviews::status::tests::the_facts_fold_under_how_its_checked9 ms
- ✓The held state offers a new anchorviews::status::tests::the_held_state_offers_a_new_anchor11 ms
- ✓The scanner is one lineviews::status::tests::the_scanner_is_one_line11 ms
- ✓The window fourteen behindviews::status::tests::the_window_fourteen_behind11 ms
- ✓The window three behindviews::status::tests::the_window_three_behind9 ms
- ✓The window when caught upviews::status::tests::the_window_when_caught_up11 ms
- ✓Watch it live is a button in the header for an admin onlyviews::status::tests::watch_it_live_is_a_button_in_the_header_for_an_admin_only10 ms
- ✓The window with the anchor inside or olderviews::status::tests::the_window_with_the_anchor_inside_or_older11 ms
monokulo::views::store_detail775 ms
- ✓A restricted store drops the any site warning but warns when no domain countsviews::store_detail::tests::a_restricted_store_drops_the_any_site_warning_but_warns_when_no_domain_counts11 ms
- ✓Renders not found state when store is noneviews::store_detail::tests::renders_not_found_state_when_store_is_none10 ms
- ✓Links to the settings page and widget pagesviews::store_detail::tests::links_to_the_settings_page_and_widget_pages12 ms
- ✓Shows the base currency at the top of the table and hides the engine endpointviews::store_detail::tests::shows_the_base_currency_at_the_top_of_the_table_and_hides_the_engine_endpoint9 ms
- ✓Shows the lookup message when presentviews::store_detail::tests::shows_the_lookup_message_when_present12 ms
- ✓The any site warning can be dismissed to one line but a failing domain warning cannotviews::store_detail::tests::the_any_site_warning_can_be_dismissed_to_one_line_but_a_failing_domain_warning_cannot11 ms
- ✓The store is called by its name and its site is a link to the hostviews::store_detail::tests::the_store_is_called_by_its_name_and_its_site_is_a_link_to_the_host10 ms
monokulo::views::store_settings21260 ms
- ✓A custom threshold is added in the tables last rowviews::store_settings::tests::a_custom_threshold_is_added_in_the_tables_last_row12 ms
- ✓A hostile currency list is escapedviews::store_settings::tests::a_hostile_currency_list_is_escaped12 ms
- ✓A refused action shows why in its own cardviews::store_settings::tests::a_refused_action_shows_why_in_its_own_card13 ms
- ✓A refused save shows why on its card and keeps what was sentviews::store_settings::tests::a_refused_save_shows_why_on_its_card_and_keeps_what_was_sent13 ms
- ✓A save says which cards it savedviews::store_settings::tests::a_save_says_which_cards_it_saved13 ms
- ✓Accepting unconfirmed payments is a switchviews::store_settings::tests::accepting_unconfirmed_payments_is_a_switch12 ms
- ✓Confirmations required input is narrow and capped at three digitsviews::store_settings::tests::confirmations_required_input_is_narrow_and_capped_at_three_digits10 ms
- ✓Diagnostics are a switch off until turned onviews::store_settings::tests::diagnostics_are_a_switch_off_until_turned_on14 ms
- ✓Existing thresholds are deleted by ticking them even at the limitviews::store_settings::tests::existing_thresholds_are_deleted_by_ticking_them_even_at_the_limit13 ms
- ✓Renders not found state when store is noneviews::store_settings::tests::renders_not_found_state_when_store_is_none11 ms
- ✓Says when the webhooks could not be readviews::store_settings::tests::says_when_the_webhooks_could_not_be_read10 ms
- ✓Shows store context above the settings headingviews::store_settings::tests::shows_store_context_above_the_settings_heading12 ms
- ✓Shows the webhook signing secret exactly once after creationviews::store_settings::tests::shows_the_webhook_signing_secret_exactly_once_after_creation15 ms
- ✓The default threshold row has no delete controlviews::store_settings::tests::the_default_threshold_row_has_no_delete_control10 ms
- ✓The default haveno limits render as plain numbersviews::store_settings::tests::the_default_haveno_limits_render_as_plain_numbers12 ms
- ✓The haveno limits show the stores current valuesviews::store_settings::tests::the_haveno_limits_show_the_stores_current_values12 ms
- ✓The haveno limits are shown only while the instance offers havenoviews::store_settings::tests::the_haveno_limits_are_shown_only_while_the_instance_offers_haveno13 ms
- ✓The restriction switch needs a verified domain to turn onviews::store_settings::tests::the_restriction_switch_needs_a_verified_domain_to_turn_on15 ms
- ✓The settings are one form and the actions are cards beside itviews::store_settings::tests::the_settings_are_one_form_and_the_actions_are_cards_beside_it11 ms
- ✓The verified domains form uses the settings fieldviews::store_settings::tests::the_verified_domains_form_uses_the_settings_field13 ms
- ✓Verified domains show the record to publish until verifiedviews::store_settings::tests::verified_domains_show_the_record_to_publish_until_verified14 ms
monokulo::views::store_site659 ms
- ✓A connected plugin locks the website and lists in connectionsviews::store_site::tests::a_connected_plugin_locks_the_website_and_lists_in_connections10 ms
- ✓Changing the website is blocked while a plugin is connectedviews::store_site::tests::changing_the_website_is_blocked_while_a_plugin_is_connected9 ms
- ✓Changing the website lists what follows then asks for the nameviews::store_site::tests::changing_the_website_lists_what_follows_then_asks_for_the_name11 ms
- ✓Disconnecting says the webhook goes then asks for the nameviews::store_site::tests::disconnecting_says_the_webhook_goes_then_asks_for_the_name9 ms
- ✓Disconnecting is blocked while an order from the shop can be paidviews::store_site::tests::disconnecting_is_blocked_while_an_order_from_the_shop_can_be_paid10 ms
- ✓With no plugin the website is a field that asks before changingviews::store_site::tests::with_no_plugin_the_website_is_a_field_that_asks_before_changing10 ms
monokulo::views::theme_tests7205 ms
- ✓Both dark blocks agree and only override light tokensviews::theme_tests::both_dark_blocks_agree_and_only_override_light_tokens12 ms
- ✓Every pill and chip is padded with the pill tokensviews::theme_tests::every_pill_and_chip_is_padded_with_the_pill_tokens32 ms
- ✓Text and controls are legible in both themesviews::theme_tests::text_and_controls_are_legible_in_both_themes13 ms
- ✓The browsers own control parts follow the theme in useviews::theme_tests::the_browsers_own_control_parts_follow_the_theme_in_use13 ms
- ✓Every token a page uses is declaredviews::theme_tests::every_token_a_page_uses_is_declared61 ms
- ✓The checks catch what they are forviews::theme_tests::the_checks_catch_what_they_are_for10 ms
- ✓No colour is defined outside theme cssviews::theme_tests::no_colour_is_defined_outside_theme_css64 ms
monokulo::views::time222 ms
- ✓A chosen zone wins then the browsers then utcviews::time::tests::a_chosen_zone_wins_then_the_browsers_then_utc10 ms
- ✓Times read as day month and clock time in the zoneviews::time::tests::times_read_as_day_month_and_clock_time_in_the_zone12 ms
monokulo::views::wallets15158 ms
- ✓A retired wallets page offers restore at the bottomviews::wallets::tests::a_retired_wallets_page_offers_restore_at_the_bottom11 ms
- ✓A wallets page is one column in the agreed orderviews::wallets::tests::a_wallets_page_is_one_column_in_the_agreed_order11 ms
- ✓Mainnet wallets are the list with no foldviews::wallets::tests::mainnet_wallets_are_the_list_with_no_fold11 ms
- ✓Mixed wallets put mainnet first and fold the test ones shutviews::wallets::tests::mixed_wallets_put_mainnet_first_and_fold_the_test_ones_shut11 ms
- ✓No wallets says so and offers to add oneviews::wallets::tests::no_wallets_says_so_and_offers_to_add_one11 ms
- ✓Retire is blocked by a store with its fix beside itviews::wallets::tests::retire_is_blocked_by_a_store_with_its_fix_beside_it9 ms
- ✓Retire is blocked by orders until about whenviews::wallets::tests::retire_is_blocked_by_orders_until_about_when11 ms
- ✓Retire is ready once both are ticked and asks for the nameviews::wallets::tests::retire_is_ready_once_both_are_ticked_and_asks_for_the_name11 ms
- ✓Retire waits when monokulo cant checkviews::wallets::tests::retire_waits_when_monokulo_cant_check8 ms
- ✓The setup network dropdown shows each networks badgeviews::wallets::tests::the_setup_network_dropdown_shows_each_networks_badge9 ms
- ✓The no javascript pages hold the dialogs contentviews::wallets::tests::the_no_javascript_pages_hold_the_dialogs_content13 ms
- ✓The stores card lists stores flush with a change link and past ones mutedviews::wallets::tests::the_stores_card_lists_stores_flush_with_a_change_link_and_past_ones_muted9 ms
- ✓With only test wallets the fold starts open and says whyviews::wallets::tests::with_only_test_wallets_the_fold_starts_open_and_says_why9 ms
- ✓Where it lives says which app holds the keysviews::wallets::tests::where_it_lives_says_which_app_holds_the_keys11 ms
- ✓The wallets already added show each wallets networkviews::wallets::tests::the_wallets_already_added_show_each_wallets_network13 ms
node-settings (real binaries)114.6 s
- ✓A node saved on a fresh instance applies straight away, and the warnings worknode-settings.spec.js14.6 s
settings-section-updates (real binaries)616.9 s
- ✓Saving an admin settings tab swaps only its panel, and the tab bar and banners stay wholesettings-section-updates.spec.js2.7 s
- ✓A value either check refuses saves nothing, and every change stays to fix or discardsettings-section-updates.spec.js2.7 s
- ✓A http failure restores Save and allows retrysettings-section-updates.spec.js1.8 s
- ✓A network failure restores Save and allows retrysettings-section-updates.spec.js1.7 s
- ✓Leaving a tab with unsaved changes asks first, and Save and go saves then goessettings-section-updates.spec.js3.5 s
- ✓A store settings save that is refused shows why on its card, and an action on its own cardsettings-section-updates.spec.js4.5 s
site-themes (real binaries)138.5 s
- ✓The site, the POS and the hosted payment page share one theme, light and darksite-themes.spec.js38.5 s
store-key-custody (real binaries)16.4 s
- ✓A store keeps its keys in the engine; snp turned on without SEV-SNP hardware is reported, and plain stores carry onstore-key-custody.spec.js6.4 s
Key custody 16 groups12148.0 s
engine-test-support::snp3358 ms
- ✓A payment is matched after a store moves its keys to snptests::snp::a_payment_is_matched_after_a_store_moves_its_keys_to_snp140 ms
- ✓An upgraded engine takes the master key over httptests::snp::an_upgraded_engine_takes_the_master_key_over_http103 ms
- ✓Order creation and chain scanning behave identically on the snp backendtests::snp::order_creation_and_chain_scanning_behave_identically_on_the_snp_backend115 ms
key-custody-cli::tests420 ms
- ✓A bundle comes from its address or a filetests::a_bundle_comes_from_its_address_or_a_file5 ms
- ✓A bundle of another format names the cli to gettests::a_bundle_of_another_format_names_the_cli_to_get4 ms
- ✓A trusted id key given replaces the official one and is flaggedtests::a_trusted_id_key_given_replaces_the_official_one_and_is_flagged5 ms
- ✓Keys are two 32 byte hex valuestests::keys_are_two_32_byte_hex_values6 ms
key-custody::custody18 ms
- ✓A scan input keeps what a scan reads and leaves out the restcustody::tests::a_scan_input_keeps_what_a_scan_reads_and_leaves_out_the_rest8 ms
key-custody::outputs11113 ms
- ✓A payment made with an outputs own key is foundoutputs::tests::a_payment_made_with_an_outputs_own_key_is_found13 ms
- ✓A payment without a view tag is foundoutputs::tests::a_payment_without_a_view_tag_is_found8 ms
- ✓A transaction without a key or without outputs pays nobodyoutputs::tests::a_transaction_without_a_key_or_without_outputs_pays_nobody7 ms
- ✓A real payment is found by its wallet and by no otheroutputs::tests::a_real_payment_is_found_by_its_wallet_and_by_no_other14 ms
- ✓A view tagged payment is found among other peoples outputsoutputs::tests::a_view_tagged_payment_is_found_among_other_peoples_outputs11 ms
- ✓An amount that does not open costs the other outputs nothingoutputs::tests::an_amount_that_does_not_open_costs_the_other_outputs_nothing14 ms
- ✓An output beyond the additional keys is still tried with the main keyoutputs::tests::an_output_beyond_the_additional_keys_is_still_tried_with_the_main_key10 ms
- ✓An output whose key is not a curve point is skippedoutputs::tests::an_output_whose_key_is_not_a_curve_point_is_skipped8 ms
- ✓An output whose amount does not open is found without an amountoutputs::tests::an_output_whose_amount_does_not_open_is_found_without_an_amount12 ms
- ✓An output with no ringct data of its own is found without an amountoutputs::tests::an_output_with_no_ringct_data_of_its_own_is_found_without_an_amount7 ms
- ✓An output with the wrong view tag is not a paymentoutputs::tests::an_output_with_the_wrong_view_tag_is_not_a_payment9 ms
key-custody::plain17257 ms
- ✓A batch scan says which of its transactions pay the walletplain::tests::a_batch_scan_says_which_of_its_transactions_pay_the_wallet17 ms
- ✓A large lookup range builds in reusable bounded batchesplain::tests::a_large_lookup_range_builds_in_reusable_bounded_batches27 ms
- ✓An absurdly wide scan range is refused rather than hanging foreverplain::tests::an_absurdly_wide_scan_range_is_refused_rather_than_hanging_forever14 ms
- ✓An index at the top of the u32 range derives without overflowingplain::tests::an_index_at_the_top_of_the_u32_range_derives_without_overflowing8 ms
- ✓Cancelling a scan preserves the next payment matchplain::tests::cancelling_a_scan_preserves_the_next_payment_match17 ms
- ✓Concurrent registrations and removals never cross wires between walletsplain::tests::concurrent_registrations_and_removals_never_cross_wires_between_wallets13 ms
- ✓Index zero derives a standard address not an unpayable subaddressplain::tests::index_zero_derives_a_standard_address_not_an_unpayable_subaddress9 ms
- ✓Register then derive subaddress roundtripplain::tests::register_then_derive_subaddress_roundtrip8 ms
- ✓Removing a wallet scrubs its view key rather than leaving it in freed memoryplain::tests::removing_a_wallet_scrubs_its_view_key_rather_than_leaving_it_in_freed_memory7 ms
- ✓Registering the same material twice yields independent handles that both workplain::tests::registering_the_same_material_twice_yields_independent_handles_that_both_work10 ms
- ✓Scan tx outputs finds output paid to subaddressplain::tests::scan_tx_outputs_finds_output_paid_to_subaddress9 ms
- ✓Seal rejects truncated or overlong material instead of silently paddingplain::tests::seal_rejects_truncated_or_overlong_material_instead_of_silently_padding11 ms
- ✓Seal round trips every byte of both keys including high bytesplain::tests::seal_round_trips_every_byte_of_both_keys_including_high_bytes9 ms
- ✓Seal then unseal survives a simulated restartplain::tests::seal_then_unseal_survives_a_simulated_restart11 ms
- ✓Scans of different wallets run in parallel off the async workersplain::tests::scans_of_different_wallets_run_in_parallel_off_the_async_workers58 ms
- ✓The live table is updated incrementally and never rebuilt for the same setplain::tests::the_live_table_is_updated_incrementally_and_never_rebuilt_for_the_same_set21 ms
- ✓The scan slots keep the first size they are givenplain::tests::the_scan_slots_keep_the_first_size_they_are_given8 ms
key-custody::plain::properties1643.1 s
- ✓Cancelling queued scans preserves both cachesplain::properties::cancelling_queued_scans_preserves_both_caches403 ms
- ✓Concurrent wallet scans keep independent caches and matchesplain::properties::concurrent_wallet_scans_keep_independent_caches_and_matches840 ms
- ✓Idempotent registration sealing and removal preserve wallet identityplain::properties::idempotent_registration_sealing_and_removal_preserve_wallet_identity100 ms
- ✓Invalid material and oversized ranges cannot poison a live walletplain::properties::invalid_material_and_oversized_ranges_cannot_poison_a_live_wallet200 ms
- ✓Invalid registration ids never allocate walletsplain::properties::invalid_registration_ids_never_allocate_wallets50 ms
- ✓Lookup ranges match fresh scans and do not poison the live windowplain::properties::lookup_ranges_match_fresh_scans_and_do_not_poison_the_live_window1.4 s
- ✓Table build batches keep exact progress across window changesplain::properties::table_build_batches_keep_exact_progress_across_window_changes67 ms
- ✓Sparse window histories match fresh scans without rebuilding kept keysplain::properties::sparse_window_histories_match_fresh_scans_without_rebuilding_kept_keys4.1 s
- ✓Cancelling queued scans preserves both caches 512 casesplain::properties::cancelling_queued_scans_preserves_both_caches2.0 s
- ✓Concurrent wallet scans keep independent caches and matches 512 casesplain::properties::concurrent_wallet_scans_keep_independent_caches_and_matches3.9 s
- ✓Idempotent registration sealing and removal preserve wallet identity 512 casesplain::properties::idempotent_registration_sealing_and_removal_preserve_wallet_identity231 ms
- ✓Invalid material and oversized ranges cannot poison a live wallet 512 casesplain::properties::invalid_material_and_oversized_ranges_cannot_poison_a_live_wallet525 ms
- ✓Invalid registration ids never allocate wallets 512 casesplain::properties::invalid_registration_ids_never_allocate_wallets35 ms
- ✓Lookup ranges match fresh scans and do not poison the live window 512 casesplain::properties::lookup_ranges_match_fresh_scans_and_do_not_poison_the_live_window7.0 s
- ✓Sparse window histories match fresh scans without rebuilding kept keys 512 casesplain::properties::sparse_window_histories_match_fresh_scans_without_rebuilding_kept_keys22.2 s
- ✓Table build batches keep exact progress across window changes 512 casesplain::properties::table_build_batches_keep_exact_progress_across_window_changes53 ms
key-custody::router754 ms
- ✓A backend replaced by a new instance under the same name drops its handles and frees themrouter::tests::a_backend_replaced_by_a_new_instance_under_the_same_name_drops_its_handles_and_frees_them7 ms
- ✓A disabled backend can not take wallets and its handles stop being liverouter::tests::a_disabled_backend_can_not_take_wallets_and_its_handles_stop_being_live7 ms
- ✓A handle its backend no longer knows stops being liverouter::tests::a_handle_its_backend_no_longer_knows_stops_being_live7 ms
- ✓A registration that finishes after its backend was replaced is freed there and retriedrouter::tests::a_registration_that_finishes_after_its_backend_was_replaced_is_freed_there_and_retried9 ms
- ✓A removal the backend refuses is logged and one already done is notrouter::tests::a_removal_the_backend_refuses_is_logged_and_one_already_done_is_not8 ms
- ✓A restarted backend loses only its own handlesrouter::tests::a_restarted_backend_loses_only_its_own_handles7 ms
- ✓Each wallet lives in its own backend and calls are routed by handlerouter::tests::each_wallet_lives_in_its_own_backend_and_calls_are_routed_by_handle9 ms
key-custody::router::properties123.4 s
- ✓Backend epoch changes invalidate only the restarted backendrouter::properties::backend_epoch_changes_invalidate_only_the_restarted_backend25 ms
- ✓Cancelled registration results are recovered by the same registration idrouter::properties::cancelled_registration_results_are_recovered_by_the_same_registration_id35 ms
- ✓Registration removal and backend reload histories never cross walletsrouter::properties::registration_removal_and_backend_reload_histories_never_cross_wallets459 ms
- ✓Registrations finishing after replacement are freed and retry on the new backendrouter::properties::registrations_finishing_after_replacement_are_freed_and_retry_on_the_new_backend82 ms
- ✓Transient backend failures preserve ownership until recoveryrouter::properties::transient_backend_failures_preserve_ownership_until_recovery37 ms
- ✓Two maximum backend epochs do not panic or wraprouter::properties::two_maximum_backend_epochs_do_not_panic_or_wrap10 ms
- ✓Backend epoch changes invalidate only the restarted backend 512 casesrouter::properties::backend_epoch_changes_invalidate_only_the_restarted_backend98 ms
- ✓Cancelled registration results are recovered by the same registration id 512 casesrouter::properties::cancelled_registration_results_are_recovered_by_the_same_registration_id133 ms
- ✓Registration removal and backend reload histories never cross wallets 512 casesrouter::properties::registration_removal_and_backend_reload_histories_never_cross_wallets1.9 s
- ✓Registrations finishing after replacement are freed and retry on the new backend 512 casesrouter::properties::registrations_finishing_after_replacement_are_freed_and_retry_on_the_new_backend526 ms
- ✓Transient backend failures preserve ownership until recovery 512 casesrouter::properties::transient_backend_failures_preserve_ownership_until_recovery95 ms
- ✓Two maximum backend epochs do not panic or wrap 512 casesrouter::properties::two_maximum_backend_epochs_do_not_panic_or_wrap5 ms
key-custody::snp15398 ms
- ✓A guest a migration agent could export is refusedsnp::tests::a_guest_a_migration_agent_could_export_is_refused13 ms
- ✓A firmware update rewraps the master key and a rollback cant open itsnp::tests::a_firmware_update_rewraps_the_master_key_and_a_rollback_cant_open_it29 ms
- ✓A handoff answer nobody trusted attested is refusedsnp::tests::a_handoff_answer_nobody_trusted_attested_is_refused59 ms
- ✓A handoff goes only to a trusted image that is not oldersnp::tests::a_handoff_goes_only_to_a_trusted_image_that_is_not_older67 ms
- ✓A merchants encrypted keys are registered sealed and survive a restartsnp::tests::a_merchants_encrypted_keys_are_registered_sealed_and_survive_a_restart27 ms
- ✓A wrap from another chip leaves the backend waitingsnp::tests::a_wrap_from_another_chip_leaves_the_backend_waiting17 ms
- ✓An engine below the release firmware floor doesnt startsnp::tests::an_engine_below_the_release_firmware_floor_doesnt_start12 ms
- ✓A signed upgrade takes the master key by handoffsnp::tests::a_signed_upgrade_takes_the_master_key_by_handoff38 ms
- ✓An envelope that does not open leaves its challenge for the real onesnp::tests::an_envelope_that_does_not_open_leaves_its_challenge_for_the_real_one21 ms
- ✓An envelope is used once and only for what its challenge was issued forsnp::tests::an_envelope_is_used_once_and_only_for_what_its_challenge_was_issued_for33 ms
- ✓Keys in the clear are refusedsnp::tests::keys_in_the_clear_are_refused9 ms
- ✓An untrusted engine image does not startsnp::tests::an_untrusted_engine_image_does_not_start15 ms
- ✓Without amds certificates no bundle is offeredsnp::tests::without_amds_certificates_no_bundle_is_offered9 ms
- ✓The same image under another id key cannot unwrap the master keysnp::tests::the_same_image_under_another_id_key_cannot_unwrap_the_master_key15 ms
- ✓An older image is refused once a newer one used the databasesnp::tests::an_older_image_is_refused_once_a_newer_one_used_the_database34 ms
key-custody::transport6122 ms
- ✓A firmware floor refuses older firmware and reads its own texttransport::tests::a_firmware_floor_refuses_older_firmware_and_reads_its_own_text14 ms
- ✓Id key digests are 96 hex characterstransport::tests::id_key_digests_are_96_hex_characters5 ms
- ✓Firmware below the release floor is refused whatever the policytransport::tests::firmware_below_the_release_floor_is_refused_whatever_the_policy19 ms
- ✓Pasted text that is not an envelope is refused plainlytransport::tests::pasted_text_that_is_not_an_envelope_is_refused_plainly6 ms
- ✓Keys sealed to a verified bundle open only where they were meant totransport::tests::keys_sealed_to_a_verified_bundle_open_only_where_they_were_meant_to21 ms
- ✓A bundle that does not check out is refused by reasontransport::tests::a_bundle_that_does_not_check_out_is_refused_by_reason57 ms
snp-attest::guest545 ms
- ✓A derived key is bound only to a tcb already committedguest::tests::a_derived_key_is_bound_only_to_a_tcb_already_committed8 ms
- ✓A missing device is reported by pathguest::tests::a_missing_device_is_reported_by_path4 ms
- ✓A derived key changes with what it is bound toguest::tests::a_derived_key_changes_with_what_it_is_bound_to14 ms
- ✓The real device answers inside a guestguest::tests::the_real_device_answers_inside_a_guest4 ms
- ✓A test report is signed and carries its identityguest::tests::a_test_report_is_signed_and_carries_its_identity15 ms
snp-attest::id_block224 ms
- ✓An id block lays out its fields where the firmware reads themid_block::tests::an_id_block_lays_out_its_fields_where_the_firmware_reads_them6 ms
- ✓The auth info carries a signature the id key in it verifiesid_block::tests::the_auth_info_carries_a_signature_the_id_key_in_it_verifies18 ms
snp-attest::kds420 ms
- ✓Cert chain url matches amd kds formatkds::tests::cert_chain_url_matches_amd_kds_format5 ms
- ✓Hw id trimmed to 8 bytes on turin full 64 elsewherekds::tests::hw_id_trimmed_to_8_bytes_on_turin_full_64_elsewhere6 ms
- ✓Vcek url for legacy product has no fmc paramkds::tests::vcek_url_for_legacy_product_has_no_fmc_param5 ms
- ✓Vcek url for turin includes fmc paramkds::tests::vcek_url_for_turin_includes_fmc_param4 ms
snp-attest::pinned_ark15 ms
- ✓Every pinned ark is well formed pempinned_ark::tests::every_pinned_ark_is_well_formed_pem5 ms
snp-attest::report741 ms
- ✓Identity fields are read from their offsetsreport::tests::identity_fields_are_read_from_their_offsets5 ms
- ✓Parses legacy layout offsets correctlyreport::tests::parses_legacy_layout_offsets_correctly6 ms
- ✓Parses turin layout offsets correctlyreport::tests::parses_turin_layout_offsets_correctly6 ms
- ✓Policy report data and measurement are read from their offsetsreport::tests::policy_report_data_and_measurement_are_read_from_their_offsets6 ms
- ✓Rejects unsupported sig algoreport::tests::rejects_unsupported_sig_algo6 ms
- ✓Product kds name and parse round tripreport::tests::product_kds_name_and_parse_round_trip6 ms
- ✓Rejects wrong lengthreport::tests::rejects_wrong_length6 ms
snp-attest::verify10131 ms
- ✓A certificate on the revocation list is refusedverify::tests::a_certificate_on_the_revocation_list_is_refused7 ms
- ✓An out of date revocation list is refusedverify::tests::an_out_of_date_revocation_list_is_refused12 ms
- ✓Ark self signature verifies for every productverify::tests::ark_self_signature_verifies_for_every_product15 ms
- ✓Evidence that does not lead to the pinned root is refusedverify::tests::evidence_that_does_not_lead_to_the_pinned_root_is_refused12 ms
- ✓Real ask verifies against pinned ark for every productverify::tests::real_ask_verifies_against_pinned_ark_for_every_product15 ms
- ✓Real crls verify against the pinned ark and list no askverify::tests::real_crls_verify_against_the_pinned_ark_and_list_no_ask18 ms
- ✓Report signature round trips through the little endian encodingverify::tests::report_signature_round_trips_through_the_little_endian_encoding18 ms
- ✓The vcek hw id must name the reports chipverify::tests::the_vcek_hw_id_must_name_the_reports_chip6 ms
- ✓Tampered signed region is rejectedverify::tests::tampered_signed_region_is_rejected19 ms
- ✓Wrong root is rejectedverify::tests::wrong_root_is_rejected9 ms
Storage and recovery 11 groups1312 min
engine-crash-recovery (real binaries)16.6 s
- ✓Killing the engine at random moments never loses a confirmed order or reuses an addressengine-crash-recovery.spec.js6.6 s
engine::store562.8 s
- ✓A duplicate insert cannot resurrect a voided paymentstore::tests::a_duplicate_insert_cannot_resurrect_a_voided_payment51 ms
- ✓A full disk is reported as a disk full error and nothing is half writtenstore::tests::a_full_disk_is_reported_as_a_disk_full_error_and_nothing_is_half_written50 ms
- ✓A late mempool resighting never nulls out an already known block heightstore::tests::a_late_mempool_resighting_never_nulls_out_an_already_known_block_height51 ms
- ✓A file created from the template matches a migrated file and never replaces onestore::tests::a_file_created_from_the_template_matches_a_migrated_file_and_never_replaces_one103 ms
- ✓A mempool first payment gains its block height once the tx is minedstore::tests::a_mempool_first_payment_gains_its_block_height_once_the_tx_is_mined54 ms
- ✓A panic inside a transaction rolls back and leaves the store usablestore::tests::a_panic_inside_a_transaction_rolls_back_and_leaves_the_store_usable50 ms
- ✓A recompute that changes nothing writes nothingstore::tests::a_recompute_that_changes_nothing_writes_nothing49 ms
- ✓A panic while holding the shared store does not break later usersstore::tests::a_panic_while_holding_the_shared_store_does_not_break_later_users53 ms
- ✓A saved setting round trips and a second save overwrites rather than erroringstore::tests::a_saved_setting_round_trips_and_a_second_save_overwrites_rather_than_erroring51 ms
- ✓A setting that was never saved reads as nonestore::tests::a_setting_that_was_never_saved_reads_as_none49 ms
- ✓A tenant config patch applies whole and knows an unknown tenantstore::tests::a_tenant_config_patch_applies_whole_and_knows_an_unknown_tenant52 ms
- ✓A transaction holds the write lock before its first readstore::tests::a_transaction_holds_the_write_lock_before_its_first_read57 ms
- ✓An order read back knows whether the scanner still examines itstore::tests::an_order_read_back_knows_whether_the_scanner_still_examines_it50 ms
- ✓An unknown order status in a row is an error not a panicstore::tests::an_unknown_order_status_in_a_row_is_an_error_not_a_panic53 ms
- ✓Claiming a minor index and creating its order is all or nothingstore::tests::claiming_a_minor_index_and_creating_its_order_is_all_or_nothing50 ms
- ✓Clear double spend flag only reports a real change and is idempotentstore::tests::clear_double_spend_flag_only_reports_a_real_change_and_is_idempotent50 ms
- ✓Create and lookup tenant by secret tokenstore::tests::create_and_lookup_tenant_by_secret_token48 ms
- ✓Concurrent minor index allocation never duplicatesstore::tests::concurrent_minor_index_allocation_never_duplicates65 ms
- ✓Disabled tenant is not found by its secretstore::tests::disabled_tenant_is_not_found_by_its_secret50 ms
- ✓Double spend flag is independent of status when redundant payment covers orderstore::tests::double_spend_flag_is_independent_of_status_when_redundant_payment_covers_order56 ms
- ✓Duplicate payment match is idempotentstore::tests::duplicate_payment_match_is_idempotent51 ms
- ✓Foreign keys are enforced on a reopened database filestore::tests::foreign_keys_are_enforced_on_a_reopened_database_file56 ms
- ✓Forget scanned blocks at or above walks the high water mark backstore::tests::forget_scanned_blocks_at_or_above_walks_the_high_water_mark_back49 ms
- ✓Get order tenant id is unscoped by designstore::tests::get_order_tenant_id_is_unscoped_by_design48 ms
- ✓Get order is scoped by tenant and returns none across tenantsstore::tests::get_order_is_scoped_by_tenant_and_returns_none_across_tenants49 ms
- ✓List active tenants excludes disabled onesstore::tests::list_active_tenants_excludes_disabled_ones49 ms
- ✓In transaction rolls every write back when the closure failsstore::tests::in_transaction_rolls_every_write_back_when_the_closure_fails51 ms
- ✓Mark double spend detected is sticky first occurrence onlystore::tests::mark_double_spend_detected_is_sticky_first_occurrence_only50 ms
- ✓List orders filters by status and paginates newest firststore::tests::list_orders_filters_by_status_and_paginates_newest_first51 ms
- ✓Migration 0004 rebuilds order payments without losing existing rowsstore::tests::migration_0004_rebuilds_order_payments_without_losing_existing_rows49 ms
- ✓Max scanned height reflects the highest recorded blockstore::tests::max_scanned_height_reflects_the_highest_recorded_block50 ms
- ✓Migration 0014 drops the tenant allowed origins column and keeps the tenantstore::tests::migration_0014_drops_the_tenant_allowed_origins_column_and_keeps_the_tenant47 ms
- ✓Migration 0013 preserves orders already paid by the old ceilingstore::tests::migration_0013_preserves_orders_already_paid_by_the_old_ceiling48 ms
- ✓Migration 0028 gives every existing store its own wallet with its counterstore::tests::migration_0028_gives_every_existing_store_its_own_wallet_with_its_counter49 ms
- ✓Minor index allocation starts at one and incrementsstore::tests::minor_index_allocation_starts_at_one_and_increments50 ms
- ✓Moving a stores keys moves its wallet and every store on itstore::tests::moving_a_stores_keys_moves_its_wallet_and_every_store_on_it50 ms
- ✓Order changes are published only when something visible changedstore::tests::order_changes_are_published_only_when_something_visible_changed51 ms
- ✓Plan status covers every rulestore::tests::plan_status_covers_every_rule11 ms
- ✓Order changes inside a transaction publish once after commit and never on rollbackstore::tests::order_changes_inside_a_transaction_publish_once_after_commit_and_never_on_rollback49 ms
- ✓Pending payment recomputes survive reopening and track real changesstore::tests::pending_payment_recomputes_survive_reopening_and_track_real_changes60 ms
- ✓Read pool uses independent connections without blocking the runtimestore::tests::read_pool_uses_independent_connections_without_blocking_the_runtime54 ms
- ✓Recompute status falls back to the tenants default when no override is setstore::tests::recompute_status_falls_back_to_the_tenants_default_when_no_override_is_set50 ms
- ✓Recompute status reflects new payment and persistsstore::tests::recompute_status_reflects_new_payment_and_persists50 ms
- ✓Recompute status uses the per order override instead of the tenants defaultstore::tests::recompute_status_uses_the_per_order_override_instead_of_the_tenants_default51 ms
- ✓Rotated secret invalidates the old tokenstore::tests::rotated_secret_invalidates_the_old_token48 ms
- ✓Reopening an existing database file does not reapply migrationsstore::tests::reopening_an_existing_database_file_does_not_reapply_migrations58 ms
- ✓Settlement waits for proven paymentsstore::tests::settlement_waits_for_proven_payments10 ms
- ✓Scanned blocks are fully isolated per networkstore::tests::scanned_blocks_are_fully_isolated_per_network49 ms
- ✓Scanned blocks round trip and prunestore::tests::scanned_blocks_round_trip_and_prune48 ms
- ✓Stores sharing a wallet allocate from its one counterstore::tests::stores_sharing_a_wallet_allocate_from_its_one_counter49 ms
- ✓Two orders can each record the same transaction outputstore::tests::two_orders_can_each_record_the_same_transaction_output49 ms
- ✓The unconfirmed payments page holds only live mempool only rows of one networkstore::tests::the_unconfirmed_payments_page_holds_only_live_mempool_only_rows_of_one_network50 ms
- ✓Unconfirmed payment pages rotate without repeating a rowstore::tests::unconfirmed_payment_pages_rotate_without_repeating_a_row51 ms
- ✓Unvoid payment restores a row without clearing the double spend flagstore::tests::unvoid_payment_restores_a_row_without_clearing_the_double_spend_flag51 ms
- ✓Update tenant config only touches included fieldsstore::tests::update_tenant_config_only_touches_included_fields49 ms
- ✓Voiding one of two payments drops status to partial and recomputes totalstore::tests::voiding_one_of_two_payments_drops_status_to_partial_and_recomputes_total51 ms
engine::store::conflicts6252 ms
- ✓A copy shown first does not get the real payment refusedstore::conflicts::tests::a_copy_shown_first_does_not_get_the_real_payment_refused34 ms
- ✓A payment voided for a double spent one comes backstore::conflicts::tests::a_payment_voided_for_a_double_spent_one_comes_back52 ms
- ✓An unsettled conflict holds an order its other payments would settlestore::conflicts::tests::an_unsettled_conflict_holds_an_order_its_other_payments_would_settle38 ms
- ✓Only a shared key is a conflictstore::conflicts::tests::only_a_shared_key_is_a_conflict40 ms
- ✓The credit follows the blocksstore::conflicts::tests::the_credit_follows_the_blocks54 ms
- ✓Under checking only a proven block settles a conflictstore::conflicts::tests::under_checking_only_a_proven_block_settles_a_conflict34 ms
engine::store::db8541 ms
- ✓A backlog in one class delays another by one job at moststore::db::tests::a_backlog_in_one_class_delays_another_by_one_job_at_most46 ms
- ✓A stalled job never blocks the async runtimestore::db::tests::a_stalled_job_never_blocks_the_async_runtime58 ms
- ✓A stopped worker fails jobs instead of hangingstore::db::tests::a_stopped_worker_fails_jobs_instead_of_hanging42 ms
- ✓A worker that cannot start is an errorstore::db::tests::a_worker_that_cannot_start_is_an_error40 ms
- ✓An abandoned job still runs and a panic fails only its callerstore::db::tests::an_abandoned_job_still_runs_and_a_panic_fails_only_its_caller51 ms
- ✓Changes made through the worker reach the stores subscribersstore::db::tests::changes_made_through_the_worker_reach_the_stores_subscribers35 ms
- ✓The worker loop restarts after a panicstore::db::tests::the_worker_loop_restarts_after_a_panic34 ms
- ✓An inline job on a held store fails instead of deadlockingstore::db::tests::an_inline_job_on_a_held_store_fails_instead_of_deadlocking235 ms
engine::store::db::properties87.7 s
- ✓Class selection matches independent round robin modelstore::db::properties::class_selection_matches_independent_round_robin_model17 ms
- ✓Bounded queues preserve fifo fairness and accepted workstore::db::properties::bounded_queues_preserve_fifo_fairness_and_accepted_work541 ms
- ✓Continuously ready classes are served within one turn eachstore::db::properties::continuously_ready_classes_are_served_within_one_turn_each20 ms
- ✓Closing all senders drains accepted jobsstore::db::properties::closing_all_senders_drains_accepted_jobs652 ms
- ✓Bounded queues preserve fifo fairness and accepted work 512 casesstore::db::properties::bounded_queues_preserve_fifo_fairness_and_accepted_work3.0 s
- ✓Class selection matches independent round robin model 512 casesstore::db::properties::class_selection_matches_independent_round_robin_model12 ms
- ✓Closing all senders drains accepted jobs 512 casesstore::db::properties::closing_all_senders_drains_accepted_jobs3.4 s
- ✓Continuously ready classes are served within one turn each 512 casesstore::db::properties::continuously_ready_classes_are_served_within_one_turn_each8 ms
engine::store::db::properties::scale224.4 s
- ✓Repeated saturation retains fifo fairness and cancellationstore::db::properties::scale::repeated_saturation_retains_fifo_fairness_and_cancellation3.2 s
- ✓Repeated saturation retains fifo fairness and cancellation 512 casesstore::db::properties::scale::repeated_saturation_retains_fifo_fairness_and_cancellation21.2 s
engine::store::order_events18 ms
- ✓A resume point is lost only when events after it are gonestore::order_events::tests::a_resume_point_is_lost_only_when_events_after_it_are_gone8 ms
engine::store::proof7285 ms
- ✓A payment counts only in its proven blockstore::proof::tests::a_payment_counts_only_in_its_proven_block32 ms
- ✓An anchor is stored with its window and keysstore::proof::tests::an_anchor_is_stored_with_its_window_and_keys34 ms
- ✓Checking holds settlement from the moment it is onstore::proof::tests::checking_holds_settlement_from_the_moment_it_is_on31 ms
- ✓Forgetting the anchor keeps checking onstore::proof::tests::forgetting_the_anchor_keeps_checking_on32 ms
- ✓Pruning keeps the keys still neededstore::proof::tests::pruning_keeps_the_keys_still_needed57 ms
- ✓The ceiling is the highest recorded block that is provenstore::proof::tests::the_ceiling_is_the_highest_recorded_block_that_is_proven49 ms
- ✓The proven chain extends switches and refuses a stale parentstore::proof::tests::the_proven_chain_extends_switches_and_refuses_a_stale_parent50 ms
engine::store::properties1254.1 s
- ✓Every historic schema upgrades with existing money and workstore::properties::every_historic_schema_upgrades_with_existing_money_and_work1.3 s
- ✓Every reached upgrade fault recovers without partial schemastore::properties::every_reached_upgrade_fault_recovers_without_partial_schema1.3 s
- ✓Migration crash childstore::properties::migration_crash_child9 ms
- ✓Historic upgrades recover from process deathstore::properties::historic_upgrades_recover_from_process_death3.4 s
- ✓Migration process death before and after commit preserves money and schemastore::properties::migration_process_death_before_and_after_commit_preserves_money_and_schema3.0 s
- ✓Upgrades preserve money queues and interrupted workstore::properties::upgrades_preserve_money_queues_and_interrupted_work2.9 s
- ✓Every historic schema upgrades with existing money and work 512 casesstore::properties::every_historic_schema_upgrades_with_existing_money_and_work873 ms
- ✓Every reached upgrade fault recovers without partial schema 512 casesstore::properties::every_reached_upgrade_fault_recovers_without_partial_schema1.6 s
- ✓Migration crash child 512 casesstore::properties::migration_crash_child7 ms
- ✓Historic upgrades recover from process death 512 casesstore::properties::historic_upgrades_recover_from_process_death20.6 s
- ✓Migration process death before and after commit preserves money and schema 512 casesstore::properties::migration_process_death_before_and_after_commit_preserves_money_and_schema2.3 s
- ✓Upgrades preserve money queues and interrupted work 512 casesstore::properties::upgrades_preserve_money_queues_and_interrupted_work16.9 s
engine::store::work281.8 s
- ✓A deeper fork widens the open job and a shallower one does notstore::work::tests::a_deeper_fork_widens_the_open_job_and_a_shallower_one_does_not56 ms
- ✓A failed candidate waits behind the others and blocks the rewind until donestore::work::tests::a_failed_candidate_waits_behind_the_others_and_blocks_the_rewind_until_done56 ms
- ✓A reorg collects payments back in the pool and voided onesstore::work::tests::a_reorg_collects_payments_back_in_the_pool_and_voided_ones52 ms
- ✓A reorg job collects its candidates in pages that survive a restartstore::work::tests::a_reorg_job_collects_its_candidates_in_pages_that_survive_a_restart60 ms
- ✓A rewind that empties the window keeps the ancestor and clamps cursorsstore::work::tests::a_rewind_that_empties_the_window_keeps_the_ancestor_and_clamps_cursors54 ms
- ✓A settlement waits for the payments block to be recordedstore::work::tests::a_settlement_waits_for_the_payments_block_to_be_recorded55 ms
- ✓A settlement waits for an open reorg on its networkstore::work::tests::a_settlement_waits_for_an_open_reorg_on_its_network58 ms
- ✓A store is in scope for each open order status and no settled onestore::work::tests::a_store_is_in_scope_for_each_open_order_status_and_no_settled_one52 ms
- ✓A store leaves scope when its orders settle and returns with a new onestore::work::tests::a_store_leaves_scope_when_its_orders_settle_and_returns_with_a_new_one53 ms
- ✓An expired order stays in scope for the grace period and no longerstore::work::tests::an_expired_order_stays_in_scope_for_the_grace_period_and_no_longer50 ms
- ✓An unknown reorg phase is an errorstore::work::tests::an_unknown_reorg_phase_is_an_error49 ms
- ✓Catch up groups are counted as listedstore::work::tests::catch_up_groups_are_counted_as_listed52 ms
- ✓Due orders are listed once up to the limitstore::work::tests::due_orders_are_listed_once_up_to_the_limit51 ms
- ✓Branch tracking and recollection commit whole and preserve the rescan anchorstore::work::tests::branch_tracking_and_recollection_commit_whole_and_preserve_the_rescan_anchor100 ms
- ✓Finishing a reorg early or at another fork is refusedstore::work::tests::finishing_a_reorg_early_or_at_another_fork_is_refused49 ms
- ✓Height due orders get half the page whatever the time due backlogstore::work::tests::height_due_orders_get_half_the_page_whatever_the_time_due_backlog54 ms
- ✓Late collects and defers are no opsstore::work::tests::late_collects_and_defers_are_no_ops50 ms
- ✓Open orders are due by deadline and height and terminal ones neverstore::work::tests::open_orders_are_due_by_deadline_and_height_and_terminal_ones_never57 ms
- ✓Out of range values and corrupt rows are errorsstore::work::tests::out_of_range_values_and_corrupt_rows_are_errors50 ms
- ✓Every store operation fails whole and then worksstore::work::tests::every_store_operation_fails_whole_and_then_works190 ms
- ✓Scheduler positions are per network typed and survive a restartstore::work::tests::scheduler_positions_are_per_network_typed_and_survive_a_restart58 ms
- ✓Stores in scope and due orders are those of one networkstore::work::tests::stores_in_scope_and_due_orders_are_those_of_one_network49 ms
- ✓Every reorg staging cleanup boundary survives reopenstore::work::tests::every_reorg_staging_cleanup_boundary_survives_reopen262 ms
- ✓The engine page s facts count each thing once on its networkstore::work::tests::the_engine_page_s_facts_count_each_thing_once_on_its_network49 ms
- ✓Unsigned values cross into sqlite checked both waysstore::work::tests::unsigned_values_cross_into_sqlite_checked_both_ways10 ms
- ✓The scanners hot queries use their indexesstore::work::tests::the_scanners_hot_queries_use_their_indexes52 ms
- ✓Voided payments are paged from a cutoff on their own networkstore::work::tests::voided_payments_are_paged_from_a_cutoff_on_their_own_network46 ms
- ✓Tip decreases queue recomputes atomically and only for their networkstore::work::tests::tip_decreases_queue_recomputes_atomically_and_only_for_their_network68 ms
engine::store::work::properties25.8 s
- ✓Generated reorg staging is scoped and durablestore::work::tests::properties::generated_reorg_staging_is_scoped_and_durable867 ms
- ✓Generated reorg staging is scoped and durable 512 casesstore::work::tests::properties::generated_reorg_staging_is_scoped_and_durable4.9 s
Exchange rates 7 groups931.6 s
monokulo::exchange_rate_config16415 ms
- ✓A currency off the stores haveno list skips haveno without any requestexchange_rate_config::tests::a_currency_off_the_stores_haveno_list_skips_haveno_without_any_request27 ms
- ✓A depth limit reaches haveno and a thin book hands overexchange_rate_config::tests::a_depth_limit_reaches_haveno_and_a_thin_book_hands_over28 ms
- ✓A failing provider and a rateless provider both hand over to the nextexchange_rate_config::tests::a_failing_provider_and_a_rateless_provider_both_hand_over_to_the_next45 ms
- ✓A provider the store did not turn on or the instance did not enable is never askedexchange_rate_config::tests::a_provider_the_store_did_not_turn_on_or_the_instance_did_not_enable_is_never_asked39 ms
- ✓A store with no coingecko configured gets a clear provider not configured error for fiatexchange_rate_config::tests::a_store_with_no_coingecko_configured_gets_a_clear_provider_not_configured_error_for_fiat13 ms
- ✓An unrecognized provider name is a clear error not a panicexchange_rate_config::tests::an_unrecognized_provider_name_is_a_clear_error_not_a_panic9 ms
- ✓An xmr order is always priced at the identity rate regardless of the stores providerexchange_rate_config::tests::an_xmr_order_is_always_priced_at_the_identity_rate_regardless_of_the_stores_provider11 ms
- ✓Coingecko is only available when actually configuredexchange_rate_config::tests::coingecko_is_only_available_when_actually_configured22 ms
- ✓Each stores own limits decide whether haveno quotes from the same bookexchange_rate_config::tests::each_stores_own_limits_decide_whether_haveno_quotes_from_the_same_book33 ms
- ✓Haveno lists the stores currencies or every known one without asking havenoexchange_rate_config::tests::haveno_lists_the_stores_currencies_or_every_known_one_without_asking_haveno22 ms
- ✓No rate anywhere is none but a failure anywhere is an errorexchange_rate_config::tests::no_rate_anywhere_is_none_but_a_failure_anywhere_is_an_error35 ms
- ✓Haveno prices from its book and a one sided book hands over to the nextexchange_rate_config::tests::haveno_prices_from_its_book_and_a_one_sided_book_hands_over_to_the_next54 ms
- ✓Supported currencies are the union over the stores providers without repeatsexchange_rate_config::tests::supported_currencies_are_the_union_over_the_stores_providers_without_repeats25 ms
- ✓Supported currencies for a store on an unenabled provider still lists xmr onlyexchange_rate_config::tests::supported_currencies_for_a_store_on_an_unenabled_provider_still_lists_xmr_only17 ms
- ✓Supported currencies for always includes xmr even with nothing configuredexchange_rate_config::tests::supported_currencies_for_always_includes_xmr_even_with_nothing_configured12 ms
- ✓The stores order decides which provider answersexchange_rate_config::tests::the_stores_order_decides_which_provider_answers23 ms
monokulo::fx_provider_settings16163 ms
- ✓A failed currency lookup is a generic errorfx_provider_settings::tests::a_failed_currency_lookup_is_a_generic_error11 ms
- ✓A form without any haveno field leaves the settings alonefx_provider_settings::tests::a_form_without_any_haveno_field_leaves_the_settings_alone11 ms
- ✓A partly submitted form is an error not a partial savefx_provider_settings::tests::a_partly_submitted_form_is_an_error_not_a_partial_save10 ms
- ✓A non empty list allows only its currencies case insensitivelyfx_provider_settings::tests::a_non_empty_list_allows_only_its_currencies_case_insensitively12 ms
- ✓A valid form is read in fullfx_provider_settings::tests::a_valid_form_is_read_in_full9 ms
- ✓An empty currency list means every currencyfx_provider_settings::tests::an_empty_currency_list_means_every_currency11 ms
- ✓An unknown currency is rejected by namefx_provider_settings::tests::an_unknown_currency_is_rejected_by_name9 ms
- ✓Currencies are canonicalised deduplicated and kept in orderfx_provider_settings::tests::currencies_are_canonicalised_deduplicated_and_kept_in_order12 ms
- ✓Offers per side must be a whole number from one to the capfx_provider_settings::tests::offers_per_side_must_be_a_whole_number_from_one_to_the_cap9 ms
- ✓The defaults are a five percent spread one offer per side no depth and every currencyfx_provider_settings::tests::the_defaults_are_a_five_percent_spread_one_offer_per_side_no_depth_and_every_currency8 ms
- ✓Stored json round trips and missing pieces fall back to defaultsfx_provider_settings::tests::stored_json_round_trips_and_missing_pieces_fall_back_to_defaults12 ms
- ✓The spread must be a percentage above zerofx_provider_settings::tests::the_spread_must_be_a_percentage_above_zero8 ms
- ✓The policy carries the stores limitsfx_provider_settings::tests::the_policy_carries_the_stores_limits11 ms
- ✓Unreadable stored settings are the defaults not an errorfx_provider_settings::tests::unreadable_stored_settings_are_the_defaults_not_an_error9 ms
- ✓Xmr depth must be a number from zero to the capfx_provider_settings::tests::xmr_depth_must_be_a_number_from_zero_to_the_cap12 ms
- ✓Xmr is rejected since no provider ever prices itfx_provider_settings::tests::xmr_is_rejected_since_no_provider_ever_prices_it9 ms
shared::coinmarketcap10219 ms
- ✓A code that cannot be fiat is none without any requestcoinmarketcap::tests::a_code_that_cannot_be_fiat_is_none_without_any_request18 ms
- ✓A body level error is an err whether the code is a number or a stringcoinmarketcap::tests::a_body_level_error_is_an_err_whether_the_code_is_a_number_or_a_string32 ms
- ✓A fresh cache is reused and a stale one refetchedcoinmarketcap::tests::a_fresh_cache_is_reused_and_a_stale_one_refetched19 ms
- ✓A later failure or bad price does not wipe a cached ratecoinmarketcap::tests::a_later_failure_or_bad_price_does_not_wipe_a_cached_rate15 ms
- ✓A quote for another currency is nonecoinmarketcap::tests::a_quote_for_another_currency_is_none19 ms
- ✓A non 2xx status and a malformed body are clean errorscoinmarketcap::tests::a_non_2xx_status_and_a_malformed_body_are_clean_errors35 ms
- ✓A successful fetch inverts the price into piconero per unitcoinmarketcap::tests::a_successful_fetch_inverts_the_price_into_piconero_per_unit16 ms
- ✓An unreachable base url is a clean errorcoinmarketcap::tests::an_unreachable_base_url_is_a_clean_error18 ms
- ✓A zero or negative price is unpriced not a free ordercoinmarketcap::tests::a_zero_or_negative_price_is_unpriced_not_a_free_order30 ms
- ✓Currency lookups are case insensitivecoinmarketcap::tests::currency_lookups_are_case_insensitive17 ms
shared::exchange_rate1378 ms
- ✓A fractional piconero remainder rounds up so the merchant is never shortexchange_rate::tests::a_fractional_piconero_remainder_rounds_up_so_the_merchant_is_never_short6 ms
- ✓A value too large for u64 piconero is an error not a silent wraparoundexchange_rate::tests::a_value_too_large_for_u64_piconero_is_an_error_not_a_silent_wraparound5 ms
- ✓A leading plus sign is rejected rather than shifting the decimal placeexchange_rate::tests::a_leading_plus_sign_is_rejected_rather_than_shifting_the_decimal_place6 ms
- ✓An order can never be priced at zero piconeroexchange_rate::tests::an_order_can_never_be_priced_at_zero_piconero6 ms
- ✓Compute order amount uses xmrs own 12 decimal precision for xmr not 2 decimal fiat roundingexchange_rate::tests::compute_order_amount_uses_xmrs_own_12_decimal_precision_for_xmr_not_2_decimal_fiat_rounding6 ms
- ✓Compute order amount uses fiat shaped 2 decimal arithmetic for a real fiat currencyexchange_rate::tests::compute_order_amount_uses_fiat_shaped_2_decimal_arithmetic_for_a_real_fiat_currency7 ms
- ✓More than two decimal places is rejected not truncatedexchange_rate::tests::more_than_two_decimal_places_is_rejected_not_truncated7 ms
- ✓Non numeric amount is rejectedexchange_rate::tests::non_numeric_amount_is_rejected6 ms
- ✓Single decimal digit is treated as tenthsexchange_rate::tests::single_decimal_digit_is_treated_as_tenths6 ms
- ✓Twenty five dollars at a known rate matches hand computed valueexchange_rate::tests::twenty_five_dollars_at_a_known_rate_matches_hand_computed_value6 ms
- ✓Whole number amount without a decimal point worksexchange_rate::tests::whole_number_amount_without_a_decimal_point_works5 ms
- ✓Xmr identity provider always returns the fixed unit conversionexchange_rate::tests::xmr_identity_provider_always_returns_the_fixed_unit_conversion6 ms
- ✓Zero or empty amount is rejectedexchange_rate::tests::zero_or_empty_amount_is_rejected6 ms
shared::exchange_rate::coingecko16258 ms
- ✓A currency coingecko has no price for is simply none not a panicexchange_rate::tests::coingecko::a_currency_coingecko_has_no_price_for_is_simply_none_not_a_panic17 ms
- ✓A later bad response does not wipe a previously cached rateexchange_rate::tests::coingecko::a_later_bad_response_does_not_wipe_a_previously_cached_rate16 ms
- ✓A malformed response body is a clean error not a panicexchange_rate::tests::coingecko::a_malformed_response_body_is_a_clean_error_not_a_panic21 ms
- ✓A successful fetch computes the correct inversion from a known priceexchange_rate::tests::coingecko::a_successful_fetch_computes_the_correct_inversion_from_a_known_price17 ms
- ✓An excerpt never splits a characterexchange_rate::tests::coingecko::an_excerpt_never_splits_a_character7 ms
- ✓A reply longer than the limit is refused and quoted only in partexchange_rate::tests::coingecko::a_reply_longer_than_the_limit_is_refused_and_quoted_only_in_part27 ms
- ✓A zero or negative price is treated as unpriced not a free orderexchange_rate::tests::coingecko::a_zero_or_negative_price_is_treated_as_unpriced_not_a_free_order19 ms
- ✓Currency lookups are case insensitiveexchange_rate::tests::coingecko::currency_lookups_are_case_insensitive12 ms
- ✓An unreachable base url is a clean errorexchange_rate::tests::coingecko::an_unreachable_base_url_is_a_clean_error17 ms
- ✓Piconero per unit cached never marks a failed fetch as freshexchange_rate::tests::coingecko::piconero_per_unit_cached_never_marks_a_failed_fetch_as_fresh17 ms
- ✓Piconero per unit cached performs a real fetch on an empty cacheexchange_rate::tests::coingecko::piconero_per_unit_cached_performs_a_real_fetch_on_an_empty_cache16 ms
- ✓Piconero per unit cached reuses a fresh cache without a second fetchexchange_rate::tests::coingecko::piconero_per_unit_cached_reuses_a_fresh_cache_without_a_second_fetch12 ms
- ✓Piconero per unit cached refetches once max age has elapsedexchange_rate::tests::coingecko::piconero_per_unit_cached_refetches_once_max_age_has_elapsed16 ms
- ✓Supported currencies cached reuses a fresh cache without a second fetchexchange_rate::tests::coingecko::supported_currencies_cached_reuses_a_fresh_cache_without_a_second_fetch13 ms
- ✓Supported currencies cached and rate cache are independentexchange_rate::tests::coingecko::supported_currencies_cached_and_rate_cache_are_independent15 ms
- ✓Supported currencies cached fetches and uppercasesexchange_rate::tests::coingecko::supported_currencies_cached_fetches_and_uppercases16 ms
shared::exchange_rate::stale_tests16 ms
- ✓A rate older than the stale ceiling is not servedexchange_rate::stale_tests::a_rate_older_than_the_stale_ceiling_is_not_served6 ms
shared::haveno21504 ms
- ✓A crossed or non positive book is unpricedhaveno::tests::a_crossed_or_non_positive_book_is_unpriced15 ms
- ✓A currency whose book emptied stops being priced on refreshhaveno::tests::a_currency_whose_book_emptied_stops_being_priced_on_refresh15 ms
- ✓A missing side in the depth response counts as zero offershaveno::tests::a_missing_side_in_the_depth_response_counts_as_zero_offers15 ms
- ✓A one sided book a missing currency and a crypto pair are unpricedhaveno::tests::a_one_sided_book_a_missing_currency_and_a_crypto_pair_are_unpriced15 ms
- ✓A rejection is not cached for the next callerhaveno::tests::a_rejection_is_not_cached_for_the_next_caller17 ms
- ✓Depth failures are errors not a no and are not cachedhaveno::tests::depth_failures_are_errors_not_a_no_and_are_not_cached36 ms
- ✓Depth is asked for the right pair and cached per currencyhaveno::tests::depth_is_asked_for_the_right_pair_and_cached_per_currency18 ms
- ✓A policys answer never depends on which policy asked firsthaveno::tests::a_policys_answer_never_depends_on_which_policy_asked_first88 ms
- ✓Concurrent callers with different policies share one fetch and keep their own answershaveno::tests::concurrent_callers_with_different_policies_share_one_fetch_and_keep_their_own_answers79 ms
- ✓Depth is cached per currency and shared by policieshaveno::tests::depth_is_cached_per_currency_and_shared_by_policies18 ms
- ✓Depth is fetched only when the policy needs ithaveno::tests::depth_is_fetched_only_when_the_policy_needs_it14 ms
- ✓Depth is not fetched for a currency with no book or a too wide spreadhaveno::tests::depth_is_not_fetched_for_a_currency_with_no_book_or_a_too_wide_spread15 ms
- ✓Every policy that passes gets the same pricehaveno::tests::every_policy_that_passes_gets_the_same_price17 ms
- ✓The default policy is a five percent spread and needs no depthhaveno::tests::the_default_policy_is_a_five_percent_spread_and_needs_no_depth5 ms
- ✓One request prices every currency and a fresh cache is reusedhaveno::tests::one_request_prices_every_currency_and_a_fresh_cache_is_reused17 ms
- ✓Stale depth is refetchedhaveno::tests::stale_depth_is_refetched16 ms
- ✓The offer count minimum applies to each sidehaveno::tests::the_offer_count_minimum_applies_to_each_side14 ms
- ✓The price is the bid ask midpoint never the stale last pricehaveno::tests::the_price_is_the_bid_ask_midpoint_never_the_stale_last_price15 ms
- ✓The spread limit is the policys ownhaveno::tests::the_spread_limit_is_the_policys_own15 ms
- ✓The xmr depth minimum applies to each sidehaveno::tests::the_xmr_depth_minimum_applies_to_each_side16 ms
- ✓Ticker failures are errors and are not cachedhaveno::tests::ticker_failures_are_errors_and_are_not_cached44 ms
Abuse protection 8 groups2924.4 s
client-challenge-protocol1399 ms
- ✓Monokulo-client.js solves an order-creation challenge on its ownclient-challenge-protocol.spec.js399 ms
connection-challenge423.8 s
- ✓Real challenge solves in JavaScript and continues to the checkoutconnection-challenge.spec.js849 ms
- ✓Real challenge offers a ten second no-JavaScript continuationconnection-challenge.spec.js10.7 s
- ✓Real challenge continues inside a cross-site checkout frame with and without JavaScriptconnection-challenge.spec.js11.6 s
- ✓Real challenge on a plain-HTTP onion (no Web Crypto) waits ten seconds and continuesconnection-challenge.spec.js634 ms
monokulo::abuse::challenge656 ms
- ✓A solved challenge redeems once for its own client onlyabuse::challenge::tests::a_solved_challenge_redeems_once_for_its_own_client_only9 ms
- ✓A wait token only redeems after its wait and onceabuse::challenge::tests::a_wait_token_only_redeems_after_its_wait_and_once9 ms
- ✓Expired tokens are forgotten in order and live ones still refuse replayabuse::challenge::tests::expired_tokens_are_forgotten_in_order_and_live_ones_still_refuse_replay9 ms
- ✓Leading zero bits counts across bytesabuse::challenge::tests::leading_zero_bits_counts_across_bytes8 ms
- ✓The replay memory is capped and fails closedabuse::challenge::tests::the_replay_memory_is_capped_and_fails_closed8 ms
- ✓Unsolved expired forged and malformed proofs are refusedabuse::challenge::tests::unsolved_expired_forged_and_malformed_proofs_are_refused13 ms
monokulo::abuse::identity329 ms
- ✓Forwarded for is only believed from a trusted proxyabuse::identity::tests::forwarded_for_is_only_believed_from_a_trusted_proxy9 ms
- ✓Ipv6 clients are grouped by their 64 and ipv4 is kept wholeabuse::identity::tests::ipv6_clients_are_grouped_by_their_64_and_ipv4_is_kept_whole10 ms
- ✓Trusted proxies parse addresses and ranges and refuse nonsenseabuse::identity::tests::trusted_proxies_parse_addresses_and_ranges_and_refuse_nonsense10 ms
monokulo::abuse::limiter763 ms
- ✓A client that waits for retry after is let throughabuse::limiter::tests::a_client_that_waits_for_retry_after_is_let_through9 ms
- ✓A pass granted to an evicted client still countsabuse::limiter::tests::a_pass_granted_to_an_evicted_client_still_counts9 ms
- ✓A pass skips the challenge for ten minutes but not the hard limitabuse::limiter::tests::a_pass_skips_the_challenge_for_ten_minutes_but_not_the_hard_limit9 ms
- ✓Memory is capped by forgetting the least recently seen clientabuse::limiter::tests::memory_is_capped_by_forgetting_the_least_recently_seen_client10 ms
- ✓The count is a rolling minuteabuse::limiter::tests::the_count_is_a_rolling_minute9 ms
- ✓Under attack challenges every client without a passabuse::limiter::tests::under_attack_challenges_every_client_without_a_pass8 ms
- ✓Under soft is allowed past soft is challenged past hard is blockedabuse::limiter::tests::under_soft_is_allowed_past_soft_is_challenged_past_hard_is_blocked9 ms
monokulo::abuse::proxy_protocol444 ms
- ✓Malformed or incomplete headers are refusedabuse::proxy_protocol::tests::malformed_or_incomplete_headers_are_refused8 ms
- ✓A dropped listener frees its address without waiting for a connectionabuse::proxy_protocol::tests::a_dropped_listener_frees_its_address_without_waiting_for_a_connection20 ms
- ✓The onion listener must be loopbackabuse::proxy_protocol::tests::the_onion_listener_must_be_loopback8 ms
- ✓Tor headers parse and carry the circuit in the source addressabuse::proxy_protocol::tests::tor_headers_parse_and_carry_the_circuit_in_the_source_address8 ms
monokulo::abuse::stats18 ms
- ✓Counts cover exactly the last hourabuse::stats::tests::counts_cover_exactly_the_last_hour8 ms
monokulo::abuse::streams324 ms
- ✓A store and the process have ceilings however many clients there areabuse::streams::tests::a_store_and_the_process_have_ceilings_however_many_clients_there_are8 ms
- ✓An empty entry is removed so the map only holds open streamsabuse::streams::tests::an_empty_entry_is_removed_so_the_map_only_holds_open_streams8 ms
- ✓Each source and store gets its own allowance and a dropped permit frees its slotabuse::streams::tests::each_source_and_store_gets_its_own_allowance_and_a_dropped_permit_frees_its_slot8 ms
Logs and tracing 9 groups601 min
TraceContextTest38 ms
- ✓A traceparent names this requests trace and a new span each timeTraceContextTest::test_a_traceparent_names_this_requests_trace_and_a_new_span_each_time1 ms
- ✓An incoming traceparent is adopted only when well formedTraceContextTest::test_an_incoming_traceparent_is_adopted_only_when_well_formed1 ms
- ✓Warnings are sent to monokulo only when the option is onTraceContextTest::test_warnings_are_sent_to_monokulo_only_when_the_option_is_on6 ms
log-search-and-tracing (real binaries)111 min
- ✓A search swaps the results in place, keeps the URL, and back returns to the earlier searchlog-search-and-tracing.spec.js7.5 s
- ✓The search box, Syntax and Search share one height; Syntax opens the help as a dialoglog-search-and-tracing.spec.js12.9 s
- ✓Without JavaScript, Syntax is a page whose examples are searcheslog-search-and-tracing.spec.js5.2 s
- ✓A line's properties load when it's first opened, and only thenlog-search-and-tracing.spec.js8.0 s
- ✓A search that does not parse says wherelog-search-and-tracing.spec.js5.3 s
- ✓A request from monokulo to the engine is one trace with spans from bothlog-search-and-tracing.spec.js5.1 s
- ✓Find narrows the search to a property of a linelog-search-and-tracing.spec.js1.9 s
- ✓Live adds new lines at the top without a reload, and pauseslog-search-and-tracing.spec.js5.0 s
- ✓Without JavaScript › the search form and Refresh work as plain navigation, and lines expandlog-search-and-tracing.spec.js12.9 s
- ✓A caller's traceparent (as the WooCommerce plugin sends it) is followed through monokulo to the enginelog-search-and-tracing.spec.js3.9 s
- ✓Refresh and Live sit in the title bar, the histogram above the search, and every line has trace and session buttonslog-search-and-tracing.spec.js12.6 s
telemetry::http431 ms
- ✓A callers traceparent is joinedhttp::tests::a_callers_traceparent_is_joined8 ms
- ✓A request gets a span with http attributes and one line at the endhttp::tests::a_request_gets_a_span_with_http_attributes_and_one_line_at_the_end7 ms
- ✓Server errors are warnings and static files are debughttp::tests::server_errors_are_warnings_and_static_files_are_debug8 ms
- ✓Who a request is for is on its lines once recordedhttp::tests::who_a_request_is_for_is_on_its_lines_once_recorded8 ms
telemetry::otlp_export237 ms
- ✓Settings are checkedtests::otlp_export::settings_are_checked7 ms
- ✓Lines and spans reach the collector redacted and in their tracetests::otlp_export::lines_and_spans_reach_the_collector_redacted_and_in_their_trace30 ms
telemetry::query641 ms
- ✓Errors say what and wherequery::tests::errors_say_what_and_where7 ms
- ✓Nesting past the limit is an error not a stack overflowquery::tests::nesting_past_the_limit_is_an_error_not_a_stack_overflow7 ms
- ✓Precedence and printing round tripquery::tests::precedence_and_printing_round_trip7 ms
- ✓Sql uses parameters for every value and field namequery::tests::sql_uses_parameters_for_every_value_and_field_name7 ms
- ✓Text searches escape like wildcardsquery::tests::text_searches_escape_like_wildcards6 ms
- ✓Words that are not a query are a text searchquery::tests::words_that_are_not_a_query_are_a_text_search7 ms
telemetry::redact748 ms
- ✓Client addresses keep only their networkredact::tests::client_addresses_keep_only_their_network7 ms
- ✓Monero addresses are shortened anywhere in a stringredact::tests::monero_addresses_are_shortened_anywhere_in_a_string7 ms
- ✓Public names and ordinary fields are keptredact::tests::public_names_and_ordinary_fields_are_kept7 ms
- ✓Secret names are redacted whatever their prefixredact::tests::secret_names_are_redacted_whatever_their_prefix7 ms
- ✓Store secret keys are removed anywhere in a stringredact::tests::store_secret_keys_are_removed_anywhere_in_a_string7 ms
- ✓Strings without anything to redact are borrowed unchangedredact::tests::strings_without_anything_to_redact_are_borrowed_unchanged7 ms
- ✓Unicode around a redaction survivesredact::tests::unicode_around_a_redaction_survives6 ms
telemetry::store10328 ms
- ✓A histogram counts lines per slice and attribute names are listedstore::tests::a_histogram_counts_lines_per_slice_and_attribute_names_are_listed15 ms
- ✓A store made before session ids were indexed gets the column and finds by itstore::tests::a_store_made_before_session_ids_were_indexed_gets_the_column_and_finds_by_it26 ms
- ✓Lines are stored with their attributes and trace and found by filterstore::tests::lines_are_stored_with_their_attributes_and_trace_and_found_by_filter17 ms
- ✓Flush returns once every line logged so far is storedstore::tests::flush_returns_once_every_line_logged_so_far_is_stored33 ms
- ✓Pages follow the cursor both ways and time ranges applystore::tests::pages_follow_the_cursor_both_ways_and_time_ranges_apply15 ms
- ✓Lines logged before the store opens are keptstore::tests::lines_logged_before_the_store_opens_are_kept39 ms
- ✓Spans are stored redacted with their parents and a trace reads back wholestore::tests::spans_are_stored_redacted_with_their_parents_and_a_trace_reads_back_whole34 ms
- ✓The retention settings reach the storestore::tests::the_retention_settings_reach_the_store14 ms
- ✓Watching the latest id sees new linesstore::tests::watching_the_latest_id_sees_new_lines35 ms
- ✓Retention removes old lines then the oldest until under the size limitstore::tests::retention_removes_old_lines_then_the_oldest_until_under_the_size_limit100 ms
telemetry::tests16105 ms
- ✓A development time already past is offtests::a_development_time_already_past_is_off7 ms
- ✓A filter that does not parse leaves the old one in placetests::a_filter_that_does_not_parse_leaves_the_old_one_in_place6 ms
- ✓A hosted services lines are named after ittests::a_hosted_services_lines_are_named_after_it5 ms
- ✓A json line carries the event and every enclosing spans fields redactedtests::a_json_line_carries_the_event_and_every_enclosing_spans_fields_redacted5 ms
- ✓A later apply cancels the earlier expirytests::a_later_apply_cancels_the_earlier_expiry5 ms
- ✓A span with a remote parent joins the callers tracetests::a_span_with_a_remote_parent_joins_the_callers_trace6 ms
- ✓An event outside any span has empty attributes and no spanstests::an_event_outside_any_span_has_empty_attributes_and_no_spans7 ms
- ✓Applying a level changes what is written straight awaytests::applying_a_level_changes_what_is_written_straight_away8 ms
- ✓Check level accepts filters and refuses the resttests::check_level_accepts_filters_and_refuses_the_rest7 ms
- ✓Development mode keeps the targets the level namestests::development_mode_keeps_the_targets_the_level_names7 ms
- ✓Development mode logs debug until its time then turns itself offtests::development_mode_logs_debug_until_its_time_then_turns_itself_off7 ms
- ✓Lines inside a span carry its trace and span ids even when the span is not loggedtests::lines_inside_a_span_carry_its_trace_and_span_ids_even_when_the_span_is_not_logged8 ms
- ✓Pretty output is redacted tootests::pretty_output_is_redacted_too7 ms
- ✓Pretty output truncates a client address like json doestests::pretty_output_truncates_a_client_address_like_json_does7 ms
- ✓Traceparent values are checkedtests::traceparent_values_are_checked7 ms
- ✓Unix times read as utctests::unix_times_read_as_utc6 ms
telemetry::through_settings17 ms
- ✓A saved level reaches the process wide subscribertests::through_settings::a_saved_level_reaches_the_process_wide_subscriber7 ms
WooCommerce plugin 5 groups343.6 s
ConnectFlowTest989 ms
- ✓Connect button links to the real connect start url with a stored nonceConnectFlowTest::test_connect_button_links_to_the_real_connect_start_url_with_a_stored_nonce7 ms
- ✓Process connect return saves settings and enables the gateway on successConnectFlowTest::test_process_connect_return_saves_settings_and_enables_the_gateway_on_success9 ms
- ✓Process connect return does not save or enable on a failed finish callConnectFlowTest::test_process_connect_return_does_not_save_or_enable_on_a_failed_finish_call12 ms
- ✓Process connect return reports monokulo not ready on 503ConnectFlowTest::test_process_connect_return_reports_monokulo_not_ready_on_5037 ms
- ✓Process connect return rejects a mismatched nonce without calling finishConnectFlowTest::test_process_connect_return_rejects_a_mismatched_nonce_without_calling_finish6 ms
- ✓Process connect return rejects reusing the same nonce twiceConnectFlowTest::test_process_connect_return_rejects_reusing_the_same_nonce_twice9 ms
- ✓Process connect return rejects missing token or nonceConnectFlowTest::test_process_connect_return_rejects_missing_token_or_nonce6 ms
- ✓A customer account opening the connect return url is refusedConnectFlowTest::test_a_customer_account_opening_the_connect_return_url_is_refused21 ms
- ✓An unreachable or garbled finish saves nothingConnectFlowTest::test_an_unreachable_or_garbled_finish_saves_nothing12 ms
GatewayRegistrationTest27 ms
- ✓Gateway is registered with woocommerceGatewayRegistrationTest::test_gateway_is_registered_with_woocommerce5 ms
- ✓Gateway is disabled by defaultGatewayRegistrationTest::test_gateway_is_disabled_by_default2 ms
MerchantExperienceTest5207 ms
- ✓The merchant is told how connecting wentMerchantExperienceTest::test_the_merchant_is_told_how_connecting_went7 ms
- ✓A connected store shows which store it is connected asMerchantExperienceTest::test_a_connected_store_shows_which_store_it_is_connected_as6 ms
- ✓A response that is not monokulos fails the payment cleanlyMerchantExperienceTest::test_a_response_that_is_not_monokulos_fails_the_payment_cleanly54 ms
- ✓A store monokulo no longer knows tells the merchant to reconnectMerchantExperienceTest::test_a_store_monokulo_no_longer_knows_tells_the_merchant_to_reconnect50 ms
- ✓Events from a newer monokulo are acknowledged and change nothingMerchantExperienceTest::test_events_from_a_newer_monokulo_are_acknowledged_and_change_nothing91 ms
ProcessPaymentTest8428 ms
- ✓Process payment sends expected request and returns monokulo checkout redirectProcessPaymentTest::test_process_payment_sends_expected_request_and_returns_monokulo_checkout_redirect71 ms
- ✓Process payment throws when gateway is not configuredProcessPaymentTest::test_process_payment_throws_when_gateway_is_not_configured48 ms
- ✓Process payment throws when monokulo returns non 200ProcessPaymentTest::test_process_payment_throws_when_monokulo_returns_non_20050 ms
- ✓Process payment throws when monokulo is unreachableProcessPaymentTest::test_process_payment_throws_when_monokulo_is_unreachable50 ms
- ✓Process payment turns 401 403 and 429 into customer safe messagesProcessPaymentTest::test_process_payment_turns_401_403_and_429_into_customer_safe_messages141 ms
- ✓Amounts are plain decimals with the right precisionProcessPaymentTest::test_amounts_are_plain_decimals_with_the_right_precision2 ms
- ✓An install connected before this version must reconnectProcessPaymentTest::test_an_install_connected_before_this_version_must_reconnect66 ms
- ✓A store that never connected gets no reconnect noticeProcessPaymentTest::test_a_store_that_never_connected_gets_no_reconnect_notice1 ms
mock-woocommerce::tests102.9 s
- ✓A callback with a mismatched nonce is rejected and never consumes the tokentests::a_callback_with_a_mismatched_nonce_is_rejected_and_never_consumes_the_token137 ms
- ✓A full woocommerce checkout is created with the key opened and paidtests::a_full_woocommerce_checkout_is_created_with_the_key_opened_and_paid275 ms
- ✓Create order against a real engine yields a working checkout redirecttests::create_order_against_a_real_engine_yields_a_working_checkout_redirect165 ms
- ✓Signature verification matches the known cross language vectortests::signature_verification_matches_the_known_cross_language_vector8 ms
- ✓Run connect flow against a real engine and monokulo yields genuine working credentialstests::run_connect_flow_against_a_real_engine_and_monokulo_yields_genuine_working_credentials127 ms
- ✓Webhook receiver records a validly signed delivery and dedupes a retried event idtests::webhook_receiver_records_a_validly_signed_delivery_and_dedupes_a_retried_event_id15 ms
- ✓The flow without a webhook registers nonetests::the_flow_without_a_webhook_registers_none126 ms
- ✓Webhook receiver rejects an invalid signature and records nothingtests::webhook_receiver_rejects_an_invalid_signature_and_records_nothing15 ms
- ✓Webhook receiver rejects everything before its signing secret is knowntests::webhook_receiver_rejects_everything_before_its_signing_secret_is_known15 ms
- ✓A genuinely forced order expired webhook is delivered and verifiedtests::a_genuinely_forced_order_expired_webhook_is_delivered_and_verified2.0 s
Test tools 15 groups673.3 s
cli-wallet::amount215 ms
- ✓Amounts round trip exactly in every unitamount::tests::amounts_round_trip_exactly_in_every_unit7 ms
- ✓Malformed or too precise amounts are rejectedamount::tests::malformed_or_too_precise_amounts_are_rejected8 ms
cli-wallet::args960 ms
- ✓History filters default to everythingargs::tests::history_filters_default_to_everything7 ms
- ✓Output specs are ringct amount and global indexargs::tests::output_specs_are_ringct_amount_and_global_index6 ms
- ✓Payment uris carry their amount in moneroargs::tests::payment_uris_carry_their_amount_in_monero7 ms
- ✓Pocketchange defaults to the biggest split of the biggest outputargs::tests::pocketchange_defaults_to_the_biggest_split_of_the_biggest_output8 ms
- ✓Prompt lines split like a shell for simple quotingargs::tests::prompt_lines_split_like_a_shell_for_simple_quoting6 ms
- ✓Sweeps parse their own leading argumentsargs::tests::sweeps_parse_their_own_leading_arguments6 ms
- ✓Transfer amounts follow the display unitargs::tests::transfer_amounts_follow_the_display_unit7 ms
- ✓Transfer rejects what the reference wallet rejectsargs::tests::transfer_rejects_what_the_reference_wallet_rejects7 ms
- ✓Transfer takes its optional leading words in orderargs::tests::transfer_takes_its_optional_leading_words_in_order6 ms
cli-wallet::block_range450 ms
- ✓Each form names the blocks it saysblock_range::tests::each_form_names_the_blocks_it_says14 ms
- ✓Malformed ranges are refused with the forms that fitblock_range::tests::malformed_ranges_are_refused_with_the_forms_that_fit10 ms
- ✓Ranges print as they were writtenblock_range::tests::ranges_print_as_they_were_written10 ms
- ✓Ranges that cant be scanned say whyblock_range::tests::ranges_that_cant_be_scanned_say_why16 ms
cli-wallet::cli5398 ms
- ✓A new wallet can be opened and driven interactivelya_new_wallet_can_be_opened_and_driven_interactively85 ms
- ✓A testnet wallet is created with the flag and opened without ita_testnet_wallet_is_created_with_the_flag_and_opened_without_it71 ms
- ✓One command runs and exits and existing wallets are never replacedone_command_runs_and_exits_and_existing_wallets_are_never_replaced101 ms
- ✓Rescan takes a block range and leaves the file alone without a noderescan_takes_a_block_range_and_leaves_the_file_alone_without_a_node71 ms
- ✓Transfer arguments are checked before any node is contactedtransfer_arguments_are_checked_before_any_node_is_contacted70 ms
cli-wallet::commands213 ms
- ✓Csv fields are quoted only when neededcommands::tests::csv_fields_are_quoted_only_when_needed7 ms
- ✓Timestamps format as utc datescommands::tests::timestamps_format_as_utc_dates6 ms
cli-wallet::editor645 ms
- ✓Completions follow each commands grammar and the wallets dataeditor::tests::completions_follow_each_commands_grammar_and_the_wallets_data8 ms
- ✓Every parser command is known to the editor with its usageeditor::tests::every_parser_command_is_known_to_the_editor_with_its_usage8 ms
- ✓Hints finish a unique command then show its usageeditor::tests::hints_finish_a_unique_command_then_show_its_usage8 ms
- ✓The command word is green when known and red when noteditor::tests::the_command_word_is_green_when_known_and_red_when_not8 ms
- ✓The completer replaces just the word being typededitor::tests::the_completer_replaces_just_the_word_being_typed7 ms
- ✓The current word after a multi byte space is found without panickingeditor::tests::the_current_word_after_a_multi_byte_space_is_found_without_panicking6 ms
cli-wallet::faucet7130 ms
- ✓A page instead of an answer is shown as textfaucet::tests::a_page_instead_of_an_answer_is_shown_as_text21 ms
- ✓Cypherfaucet is asked for the wallets network and its txid is readfaucet::tests::cypherfaucet_is_asked_for_the_wallets_network_and_its_txid_is_read22 ms
- ✓Cypherfaucet says when to try againfaucet::tests::cypherfaucet_says_when_to_try_again22 ms
- ✓Providers are named as the flag takes themfaucet::tests::providers_are_named_as_the_flag_takes_them7 ms
- ✓Xmr tw is asked with the address and its txid is readfaucet::tests::xmr_tw_is_asked_with_the_address_and_its_txid_is_read20 ms
- ✓Xmr tw pays stagenet onlyfaucet::tests::xmr_tw_pays_stagenet_only20 ms
- ✓Xmr tw says why it sent nothingfaucet::tests::xmr_tw_says_why_it_sent_nothing18 ms
cli-wallet::file225 ms
- ✓A saved wallet file is readable by its owner onlyfile::tests::a_saved_wallet_file_is_readable_by_its_owner_only16 ms
- ✓Secret option values are redacted from the lock notefile::tests::secret_option_values_are_redacted_from_the_lock_note9 ms
cli-wallet::meta216 ms
- ✓A wallet without metadata has just the primary accountmeta::tests::a_wallet_without_metadata_has_just_the_primary_account9 ms
- ✓Accounts and subaddresses are numbered in creation ordermeta::tests::accounts_and_subaddresses_are_numbered_in_creation_order7 ms
cli-wallet::store790 ms
- ✓A file that isnt a database is refusedstore::tests::a_file_that_isnt_a_database_is_refused7 ms
- ✓A missing file is never created by reading itstore::tests::a_missing_file_is_never_created_by_reading_it9 ms
- ✓A wallet with nothing set stores just its keysstore::tests::a_wallet_with_nothing_set_stores_just_its_keys13 ms
- ✓An amount past i64 is refused not wrappedstore::tests::an_amount_past_i64_is_refused_not_wrapped15 ms
- ✓Another format version is refusedstore::tests::another_format_version_is_refused13 ms
- ✓Every table round trips in orderstore::tests::every_table_round_trips_in_order17 ms
- ✓The schema refuses mainnetstore::tests::the_schema_refuses_mainnet16 ms
cli-wallet::tests14400 ms
- ✓A held lock names its holder and lets the caller choosetests::a_held_lock_names_its_holder_and_lets_the_caller_choose126 ms
- ✓A rescan records what it found once and resolves pendingtests::a_rescan_records_what_it_found_once_and_resolves_pending15 ms
- ✓A seed restores to the network asked fortests::a_seed_restores_to_the_network_asked_for19 ms
- ✓A testnet wallet file opens only on testnettests::a_testnet_wallet_file_opens_only_on_testnet24 ms
- ✓A wallet directory variable is taken from the repository roottests::a_wallet_directory_variable_is_taken_from_the_repository_root8 ms
- ✓A wallet file for mainnet or an unknown network is refusedtests::a_wallet_file_for_mainnet_or_an_unknown_network_is_refused13 ms
- ✓A wallet file refuses to be created twice and round tripstests::a_wallet_file_refuses_to_be_created_twice_and_round_trips14 ms
- ✓Concurrent updates are never losttests::concurrent_updates_are_never_lost72 ms
- ✓Each retry starts from the next node and still tries them alltests::each_retry_starts_from_the_next_node_and_still_tries_them_all12 ms
- ✓Every output a transaction pays the wallet gets its own recordtests::every_output_a_transaction_pays_the_wallet_gets_its_own_record16 ms
- ✓Freezing and marking spent change exactly one outputtests::freezing_and_marking_spent_change_exactly_one_output34 ms
- ✓Key images are stable and distincttests::key_images_are_stable_and_distinct15 ms
- ✓Resolving a send dates its sent recordtests::resolving_a_send_dates_its_sent_record12 ms
- ✓Seeds restore the keys they came fromtests::seeds_restore_the_keys_they_came_from20 ms
cli-wallet::wallet::txid_tests18 ms
- ✓A txid is lowercased and must be 64 hex characterswallet::txid_tests::a_txid_is_lowercased_and_must_be_64_hex_characters8 ms
cli-wallet::wallet_setup379 ms
- ✓A stagenet wallet restores on stageneta_stagenet_wallet_restores_on_stagenet25 ms
- ✓The 25 word phrase is the same walletthe_25_word_phrase_is_the_same_wallet20 ms
- ✓The polyseed restores to the address and view key it came withthe_polyseed_restores_to_the_address_and_view_key_it_came_with34 ms
engine-test-support::fake_monerod129 ms
- ✓The stand in node answers what an idle engine asksthe_stand_in_node_answers_what_an_idle_engine_asks29 ms
engine-test-support::tests22.0 s
- ✓Status route is reachable over a real sockettests::status_route_is_reachable_over_a_real_socket56 ms
- ✓Background loops genuinely write a real expired order eventtests::background_loops_genuinely_write_a_real_expired_order_event1.9 s
Everything else 63 groups4058 min
account-settings418.2 s
- ✓Without JavaScript the account menu opens and the profile savesaccount-settings.spec.js3.8 s
- ✓With JavaScript a change shows the save bar, and a new email is confirmed in a dialogaccount-settings.spec.js9.9 s
- ✓The account menu closes on a click outside it, and its items join the phone menuaccount-settings.spec.js3.3 s
- ✓The nav bar is one height signed in or outaccount-settings.spec.js1.1 s
disclosures46.4 s
- ✓A disclosure reads as a link with a caret, with a pointer, a hover and a focus ringdisclosures.spec.js1.6 s
- ✓The account menu keeps its own look, with a pointer, a hover and a focus ringdisclosures.spec.js554 ms
- ✓"More options" sits a step inside its box and a wide step from its neighbours, at 1280pxdisclosures.spec.js2.1 s
- ✓"More options" sits a step inside its box and a wide step from its neighbours, at 390pxdisclosures.spec.js2.0 s
dropdowns65.6 s
- ✓A dropdown floats over the page, picks with the mouse and saves through the real selectdropdowns.spec.js1.3 s
- ✓The keyboard opens, moves, chooses and closes without leaving the carddropdowns.spec.js844 ms
- ✓A long list has a find box, and a script setting the select is followeddropdowns.spec.js1.5 s
- ✓Search is shown, hidden or decided by the number of optionsdropdowns.spec.js439 ms
- ✓A required dropdown left on its prompt is refused, and green is only for Currentdropdowns.spec.js1.1 s
- ✓Without JavaScript the dropdown is the plain select, every part in wordsdropdowns.spec.js485 ms
engine::activity782 ms
- ✓A fresh reader starts at the oldest snapshotactivity::tests::a_fresh_reader_starts_at_the_oldest_snapshot10 ms
- ✓A reader behind the record or from another epoch starts overactivity::tests::a_reader_behind_the_record_or_from_another_epoch_starts_over9 ms
- ✓A reader following next sees every event onceactivity::tests::a_reader_following_next_sees_every_event_once9 ms
- ✓A snapshot is due once per interval and rounds count upactivity::tests::a_snapshot_is_due_once_per_interval_and_rounds_count_up10 ms
- ✓The node s pool is asked for only while someone watchesactivity::tests::the_node_s_pool_is_asked_for_only_while_someone_watches10 ms
- ✓The record is bounded by age and countactivity::tests::the_record_is_bounded_by_age_and_count24 ms
- ✓The record is in time orderactivity::tests::the_record_is_in_time_order10 ms
engine::backup_restore2616 ms
- ✓Restore refuses to overwrite an existing destination without forcerestore_refuses_to_overwrite_an_existing_destination_without_force207 ms
- ✓Backup then restore preserves tenants and orders under concurrent writesbackup_then_restore_preserves_tenants_and_orders_under_concurrent_writes409 ms
engine::cli787 ms
- ✓A setting can be given as an optioncli::tests::a_setting_can_be_given_as_an_option11 ms
- ✓An unrecognized bare argument is a clear error not silently ignoredcli::tests::an_unrecognized_bare_argument_is_a_clear_error_not_silently_ignored14 ms
- ✓Help and version are answered by clapcli::tests::help_and_version_are_answered_by_clap17 ms
- ✓No arguments starts the server from the default options filecli::tests::no_arguments_starts_the_server_from_the_default_options_file11 ms
- ✓The command line is well formedcli::tests::the_command_line_is_well_formed10 ms
- ✓The database path follows xdg unless givencli::tests::the_database_path_follows_xdg_unless_given9 ms
- ✓The help documents the options file and every settingcli::tests::the_help_documents_the_options_file_and_every_setting15 ms
engine::engine_settings8241 ms
- ✓A budget bigger than this machine allows is refused with the maximumengine_settings::tests::a_budget_bigger_than_this_machine_allows_is_refused_with_the_maximum11 ms
- ✓Every section builds from its defaults and the node settings accept the stored formatengine_settings::tests::every_section_builds_from_its_defaults_and_the_node_settings_accept_the_stored_format11 ms
- ✓An snp backend that cannot start says why and plain carries onengine_settings::tests::an_snp_backend_that_cannot_start_says_why_and_plain_carries_on57 ms
- ✓Snp settings are checked and say what the backend still needsengine_settings::tests::snp_settings_are_checked_and_say_what_the_backend_still_needs10 ms
- ✓The old ranges are keptengine_settings::tests::the_old_ranges_are_kept12 ms
- ✓The scan budget fits in 80 percent of memory across networksengine_settings::tests::the_scan_budget_fits_in_80_percent_of_memory_across_networks14 ms
- ✓Preparing the snp backend starts nothing and stores no keyengine_settings::tests::preparing_the_snp_backend_starts_nothing_and_stores_no_key61 ms
- ✓The snp backend starts once and keeps its storesengine_settings::tests::the_snp_backend_starts_once_and_keeps_its_stores65 ms
engine::http995.9 s
- ✓A backend that cannot run is a problem on the setting that enables ithttp::tests::a_backend_that_cannot_run_is_a_problem_on_the_setting_that_enables_it53 ms
- ✓A check answers as a save would and saves nothinghttp::tests::a_check_answers_as_a_save_would_and_saves_nothing71 ms
- ✓A deleted stores keys are not registered again by a request in flighthttp::tests::a_deleted_stores_keys_are_not_registered_again_by_a_request_in_flight53 ms
- ✓A full or locked database is 503 but a constraint violation is 500http::tests::a_full_or_locked_database_is_503_but_a_constraint_violation_is_50011 ms
- ✓A key custody backend that is down is 503http::tests::a_key_custody_backend_that_is_down_is_50311 ms
- ✓A disabled store can not be movedhttp::tests::a_disabled_store_can_not_be_moved49 ms
- ✓A new store can not use a backend that is not enabledhttp::tests::a_new_store_can_not_use_a_backend_that_is_not_enabled53 ms
- ✓A new store goes to the default backend or the one it asks forhttp::tests::a_new_store_goes_to_the_default_backend_or_the_one_it_asks_for54 ms
- ✓A node listed twice in one network is refusedhttp::tests::a_node_listed_twice_in_one_network_is_refused59 ms
- ✓A partially invalid save changes nothing not just the valid halfhttp::tests::a_partially_invalid_save_changes_nothing_not_just_the_valid_half61 ms
- ✓A request that takes too long gets 503http::tests::a_request_that_takes_too_long_gets_50312 ms
- ✓A read only options file is locked and a save to it refusedhttp::tests::a_read_only_options_file_is_locked_and_a_save_to_it_refused70 ms
- ✓A retired wallet has its keys deleted everywhere and comes back only with themhttp::tests::a_retired_wallet_has_its_keys_deleted_everywhere_and_comes_back_only_with_them68 ms
- ✓A saved node is used straight away and clearing it stops it the reported bughttp::tests::a_saved_node_is_used_straight_away_and_clearing_it_stops_it_the_reported_bug74 ms
- ✓A saved rate limit body limit and tenant default apply to the next requesthttp::tests::a_saved_rate_limit_body_limit_and_tenant_default_apply_to_the_next_request65 ms
- ✓A scan from before a wallet change is not recorded against the storehttp::tests::a_scan_from_before_a_wallet_change_is_not_recorded_against_the_store58 ms
- ✓A setting given on the command line is locked and a save of it refusedhttp::tests::a_setting_given_on_the_command_line_is_locked_and_a_save_of_it_refused65 ms
- ✓A stagenet node that says it is on mainnet is refused and nothing changeshttp::tests::a_stagenet_node_that_says_it_is_on_mainnet_is_refused_and_nothing_changes63 ms
- ✓A store a block or two behind is not reported but one further behind ishttp::tests::a_store_a_block_or_two_behind_is_not_reported_but_one_further_behind_is62 ms
- ✓A store changing back and forth keeps one scan row per wallet it lefthttp::tests::a_store_changing_back_and_forth_keeps_one_scan_row_per_wallet_it_left75 ms
- ✓A store made with keys gets its own wallet another store can joinhttp::tests::a_store_made_with_keys_gets_its_own_wallet_another_store_can_join63 ms
- ✓A store on a wallet refuses keys too an unknown wallet and another networkhttp::tests::a_store_on_a_wallet_refuses_keys_too_an_unknown_wallet_and_another_network63 ms
- ✓A stores routes still need its own secrethttp::tests::a_stores_routes_still_need_its_own_secret57 ms
- ✓A tenants reported primary address is a standard address a payment could reachhttp::tests::a_tenants_reported_primary_address_is_a_standard_address_a_payment_could_reach66 ms
- ✓A wallet change is refused to the same wallet an unknown one or another networkhttp::tests::a_wallet_change_is_refused_to_the_same_wallet_an_unknown_one_or_another_network80 ms
- ✓A wallet left with open orders is only retired once they closedhttp::tests::a_wallet_left_with_open_orders_is_only_retired_once_they_closed60 ms
- ✓A zero or malformed xmr amount is rejected with bad requesthttp::tests::a_zero_or_malformed_xmr_amount_is_rejected_with_bad_request54 ms
- ✓Adding a wallet with bad keys is refused and registers nothinghttp::tests::adding_a_wallet_with_bad_keys_is_refused_and_registers_nothing53 ms
- ✓Admin rate limit middleware keys on the presented token not the source iphttp::tests::admin_rate_limit_middleware_keys_on_the_presented_token_not_the_source_ip51 ms
- ✓Admin rate limit middleware rejects after the limit with a real connect infohttp::tests::admin_rate_limit_middleware_rejects_after_the_limit_with_a_real_connect_info52 ms
- ✓Admin route rejects the tenants own public key as a bearer tokenhttp::tests::admin_route_rejects_the_tenants_own_public_key_as_a_bearer_token56 ms
- ✓Admin route with no authorization header is rejectedhttp::tests::admin_route_with_no_authorization_header_is_rejected54 ms
- ✓An idempotency key makes a retried order creation return the first orderhttp::tests::an_idempotency_key_makes_a_retried_order_creation_return_the_first_order64 ms
- ✓An order from before a wallet change is still paid and a new order with its index is nothttp::tests::an_order_from_before_a_wallet_change_is_still_paid_and_a_new_order_with_its_index_is_not66 ms
- ✓An order made while the backend has just lost the store still succeedshttp::tests::an_order_made_while_the_backend_has_just_lost_the_store_still_succeeds59 ms
- ✓An unchanged network keeps its client when another network is savedhttp::tests::an_unchanged_network_keeps_its_client_when_another_network_is_saved55 ms
- ✓An unknown setting is refused and nothing is savedhttp::tests::an_unknown_setting_is_refused_and_nothing_is_saved65 ms
- ✓An xmr amount above the cap is rejected with bad requesthttp::tests::an_xmr_amount_above_the_cap_is_rejected_with_bad_request53 ms
- ✓Clearing a monero node with a null value removes its configurationhttp::tests::clearing_a_monero_node_with_a_null_value_removes_its_configuration64 ms
- ✓Create tenant rejects a non canonical view key scalar as bad request not internal errorhttp::tests::create_tenant_rejects_a_non_canonical_view_key_scalar_as_bad_request_not_internal_error52 ms
- ✓Create tenant rejects a syntactically valid but off curve spend pubkey as bad request not internal errorhttp::tests::create_tenant_rejects_a_syntactically_valid_but_off_curve_spend_pubkey_as_bad_request_not_internal_error55 ms
- ✓Create tenant then create order happy pathhttp::tests::create_tenant_then_create_order_happy_path57 ms
- ✓Creating an order with a confirmations required override persists ithttp::tests::creating_an_order_with_a_confirmations_required_override_persists_it56 ms
- ✓Creating an order with an out of range confirmations required is rejectedhttp::tests::creating_an_order_with_an_out_of_range_confirmations_required_is_rejected63 ms
- ✓Creating an order with confirmations required zero is acceptedhttp::tests::creating_an_order_with_confirmations_required_zero_is_accepted56 ms
- ✓Creating an order with no confirmations required override leaves it unsethttp::tests::creating_an_order_with_no_confirmations_required_override_leaves_it_unset66 ms
- ✓Event streams outlive the request timeout and have their own caphttp::tests::event_streams_outlive_the_request_timeout_and_have_their_own_cap15 ms
- ✓Enabling the snp key custody backend is saved and reportedhttp::tests::enabling_the_snp_key_custody_backend_is_saved_and_reported88 ms
- ✓Every admin route resolves its tenant from the bearer token alonehttp::tests::every_admin_route_resolves_its_tenant_from_the_bearer_token_alone66 ms
- ✓Every route refuses a request without the engine tokenhttp::tests::every_route_refuses_a_request_without_the_engine_token63 ms
- ✓Forgetting a proof anchor keeps checking onhttp::tests::forgetting_a_proof_anchor_keeps_checking_on61 ms
- ✓Get settings reports code defaults when nothing is configuredhttp::tests::get_settings_reports_code_defaults_when_nothing_is_configured65 ms
- ✓Listing orders by ids returns only this tenants named orders in orderhttp::tests::listing_orders_by_ids_returns_only_this_tenants_named_orders_in_order64 ms
- ✓Listing orders can page search and keep to open ordershttp::tests::listing_orders_can_page_search_and_keep_to_open_orders66 ms
- ✓Lookup payment matches and records a real mempool paymenthttp::tests::lookup_payment_matches_and_records_a_real_mempool_payment65 ms
- ✓Lookup payment rejects a malformed txidhttp::tests::lookup_payment_rejects_a_malformed_txid65 ms
- ✓Lookup payment reports no matching order for a real but unrelated txhttp::tests::lookup_payment_reports_no_matching_order_for_a_real_but_unrelated_tx70 ms
- ✓Lookup payment reports not found on chain for an unknown txidhttp::tests::lookup_payment_reports_not_found_on_chain_for_an_unknown_txid57 ms
- ✓Lookup payment requires authenticationhttp::tests::lookup_payment_requires_authentication57 ms
- ✓Moving a store needs the keys of its own wallethttp::tests::moving_a_store_needs_the_keys_of_its_own_wallet57 ms
- ✓Moving a store to another backend keeps it taking orders and frees the old registrationhttp::tests::moving_a_store_to_another_backend_keeps_it_taking_orders_and_frees_the_old_registration59 ms
- ✓Nodes that do not answer or do not say are savedhttp::tests::nodes_that_do_not_answer_or_do_not_say_are_saved72 ms
- ✓Order events stream reports only the authenticated tenants changeshttp::tests::order_events_stream_reports_only_the_authenticated_tenants_changes65 ms
- ✓Otlp headers come from the environment and are never saved or shownhttp::tests::otlp_headers_come_from_the_environment_and_are_never_saved_or_shown64 ms
- ✓Requests beyond the concurrency limit get 503 at once instead of queueinghttp::tests::requests_beyond_the_concurrency_limit_get_503_at_once_instead_of_queueing12 ms
- ✓Oversized request body is rejected before reaching the handlerhttp::tests::oversized_request_body_is_rejected_before_reaching_the_handler56 ms
- ✓Rotated secret invalidates the old token end to endhttp::tests::rotated_secret_invalidates_the_old_token_end_to_end59 ms
- ✓Saving a restart only setting says sohttp::tests::saving_a_restart_only_setting_says_so59 ms
- ✓Saving an out of range scalar is rejected and nothing changeshttp::tests::saving_an_out_of_range_scalar_is_rejected_and_nothing_changes61 ms
- ✓Saving nodes that dont answer for a network stores use is reportedhttp::tests::saving_nodes_that_dont_answer_for_a_network_stores_use_is_reported59 ms
- ✓Status endpoint is reachable with no authentication at allhttp::tests::status_endpoint_is_reachable_with_no_authentication_at_all56 ms
- ✓Status endpoint reflects a failing scan tick with its real errorhttp::tests::status_endpoint_reflects_a_failing_scan_tick_with_its_real_error57 ms
- ✓Setting a monero node round trips including its fallback listhttp::tests::setting_a_monero_node_round_trips_including_its_fallback_list149 ms
- ✓Status endpoint reflects a healthy recent scan tickhttp::tests::status_endpoint_reflects_a_healthy_recent_scan_tick56 ms
- ✓Status endpoint reflects a stale scanner that has stopped tickinghttp::tests::status_endpoint_reflects_a_stale_scanner_that_has_stopped_ticking56 ms
- ✓Status endpoint shows an offline node as an error not a silent gaphttp::tests::status_endpoint_shows_an_offline_node_as_an_error_not_a_silent_gap52 ms
- ✓Status endpoint shows the real configured network and node with its live heighthttp::tests::status_endpoint_shows_the_real_configured_network_and_node_with_its_live_height67 ms
- ✓Status endpoint with no configured networks says so plainlyhttp::tests::status_endpoint_with_no_configured_networks_says_so_plainly65 ms
- ✓Status lists a store whose network has no answering nodehttp::tests::status_lists_a_store_whose_network_has_no_answering_node73 ms
- ✓Status lists stores whose key storage is turned off or not answeringhttp::tests::status_lists_stores_whose_key_storage_is_turned_off_or_not_answering62 ms
- ✓Status says which network each node is onhttp::tests::status_says_which_network_each_node_is_on58 ms
- ✓Status reports resources scaling and a slow blockhttp::tests::status_reports_resources_scaling_and_a_slow_block64 ms
- ✓Tenant a cannot read tenant bs order via admin apihttp::tests::tenant_a_cannot_read_tenant_bs_order_via_admin_api54 ms
- ✓Successive orders get distinct addresses and never leave an unclaimed index behindhttp::tests::successive_orders_get_distinct_addresses_and_never_leave_an_unclaimed_index_behind62 ms
- ✓Tenant creation is rejected for a network with no configured nodehttp::tests::tenant_creation_is_rejected_for_a_network_with_no_configured_node55 ms
- ✓Tenant deletion disables it and admin routes stop workinghttp::tests::tenant_deletion_disables_it_and_admin_routes_stop_working55 ms
- ✓Tenant settings with a silent failure mode are rejected on creation and on patchhttp::tests::tenant_settings_with_a_silent_failure_mode_are_rejected_on_creation_and_on_patch60 ms
- ✓The admin refund address route is scoped to the tenant behind the secret keyhttp::tests::the_admin_refund_address_route_is_scoped_to_the_tenant_behind_the_secret_key53 ms
- ✓The engine serves no public order routes and no corshttp::tests::the_engine_serves_no_public_order_routes_and_no_cors57 ms
- ✓The log api answers the admin with filtered lines traces and query errorshttp::tests::the_log_api_answers_the_admin_with_filtered_lines_traces_and_query_errors63 ms
- ✓The options file is saved to and reloaded through the apihttp::tests::the_options_file_is_saved_to_and_reloaded_through_the_api73 ms
- ✓The order event stream replays from a position then goes livehttp::tests::the_order_event_stream_replays_from_a_position_then_goes_live61 ms
- ✓The order event stream says when a reader missed eventshttp::tests::the_order_event_stream_says_when_a_reader_missed_events59 ms
- ✓The snp trust settings cannot be changed through the settings apihttp::tests::the_snp_trust_settings_cannot_be_changed_through_the_settings_api64 ms
- ✓Two stores on one wallet never hand out the same addresshttp::tests::two_stores_on_one_wallet_never_hand_out_the_same_address57 ms
- ✓Two overlapping moves of one store leave its row and its live keys in the same backendhttp::tests::two_overlapping_moves_of_one_store_leave_its_row_and_its_live_keys_in_the_same_backend72 ms
- ✓Unauthenticated routes are limited per address by the admin limiterhttp::tests::unauthenticated_routes_are_limited_per_address_by_the_admin_limiter59 ms
- ✓Updating a scalar setting persists and a later get reflects ithttp::tests::updating_a_scalar_setting_persists_and_a_later_get_reflects_it57 ms
- ✓Without a log store the log api says sohttp::tests::without_a_log_store_the_log_api_says_so54 ms
engine::http::activity2122 ms
- ✓A network s record is read from its snapshot then followedhttp::activity::tests::a_network_s_record_is_read_from_its_snapshot_then_followed56 ms
- ✓A network without a scanner or an unknown name is refusedhttp::activity::tests::a_network_without_a_scanner_or_an_unknown_name_is_refused66 ms
engine::http::properties261 min
- ✓Cancelling during derivation preserves the address for retryhttp::tests::properties::cancelling_during_derivation_preserves_the_address_for_retry662 ms
- ✓Disabling a tenant during derivation cannot publish an orderhttp::tests::properties::disabling_a_tenant_during_derivation_cannot_publish_an_order655 ms
- ✓Every sql denial during order creation is atomic and retryablehttp::tests::properties::every_sql_denial_during_order_creation_is_atomic_and_retryable238 ms
- ✓Exhausted counter still allows idempotent replays and never wrapshttp::tests::properties::exhausted_counter_still_allows_idempotent_replays_and_never_wraps66 ms
- ✓Every purchase identity field rejects conflicting replayshttp::tests::properties::every_purchase_identity_field_rejects_conflicting_replays630 ms
- ✓Order creation crash childhttp::tests::properties::order_creation_crash_child11 ms
- ✓Concurrent creation and retries use the production database workerhttp::tests::properties::concurrent_creation_and_retries_use_the_production_database_worker1.9 s
- ✓Exhaustion and mismatched claims cannot corrupt allocationhttp::tests::properties::exhaustion_and_mismatched_claims_cannot_corrupt_allocation492 ms
- ✓Request validation is atomic at integer and key boundarieshttp::tests::properties::request_validation_is_atomic_at_integer_and_key_boundaries501 ms
- ✓Sql failures and lost results never burn addresseshttp::tests::properties::sql_failures_and_lost_results_never_burn_addresses762 ms
- ✓Process death at order commit preserves atomic allocationhttp::tests::properties::process_death_at_order_commit_preserves_atomic_allocation1.6 s
- ✓Requests without keys create distinct purchaseshttp::tests::properties::requests_without_keys_create_distinct_purchases1.9 s
- ✓Order histories preserve tenant scoped idempotency and addresseshttp::tests::properties::order_histories_preserve_tenant_scoped_idempotency_and_addresses4.3 s
- ✓Cancelling during derivation preserves the address for retry 512 caseshttp::tests::properties::cancelling_during_derivation_preserves_the_address_for_retry4.1 s
- ✓Disabling a tenant during derivation cannot publish an order 512 caseshttp::tests::properties::disabling_a_tenant_during_derivation_cannot_publish_an_order3.2 s
- ✓Every purchase identity field rejects conflicting replays 512 caseshttp::tests::properties::every_purchase_identity_field_rejects_conflicting_replays3.4 s
- ✓Every sql denial during order creation is atomic and retryable 512 caseshttp::tests::properties::every_sql_denial_during_order_creation_is_atomic_and_retryable136 ms
- ✓Exhausted counter still allows idempotent replays and never wraps 512 caseshttp::tests::properties::exhausted_counter_still_allows_idempotent_replays_and_never_wraps46 ms
- ✓Concurrent creation and retries use the production database worker 512 caseshttp::tests::properties::concurrent_creation_and_retries_use_the_production_database_worker9.3 s
- ✓Order creation crash child 512 caseshttp::tests::properties::order_creation_crash_child7 ms
- ✓Exhaustion and mismatched claims cannot corrupt allocation 512 caseshttp::tests::properties::exhaustion_and_mismatched_claims_cannot_corrupt_allocation2.7 s
- ✓Process death at order commit preserves atomic allocation 512 caseshttp::tests::properties::process_death_at_order_commit_preserves_atomic_allocation9.2 s
- ✓Request validation is atomic at integer and key boundaries 512 caseshttp::tests::properties::request_validation_is_atomic_at_integer_and_key_boundaries3.0 s
- ✓Order histories preserve tenant scoped idempotency and addresses 512 caseshttp::tests::properties::order_histories_preserve_tenant_scoped_idempotency_and_addresses24.5 s
- ✓Requests without keys create distinct purchases 512 caseshttp::tests::properties::requests_without_keys_create_distinct_purchases13.0 s
- ✓Sql failures and lost results never burn addresses 512 caseshttp::tests::properties::sql_failures_and_lost_results_never_burn_addresses3.4 s
engine::http::properties::authorization221 min
- ✓Bearer syntax cannot expand tenant authorityhttp::tests::properties::authorization::bearer_syntax_cannot_expand_tenant_authority843 ms
- ✓Body identity cannot steer own tenant operationshttp::tests::properties::authorization::body_identity_cannot_steer_own_tenant_operations1.1 s
- ✓Concurrent rejections leave no writes or stream slot leakshttp::tests::properties::authorization::concurrent_rejections_leave_no_writes_or_stream_slot_leaks1.2 s
- ✓Every route runs the engine and tenant rejection matrixhttp::tests::properties::authorization::every_route_runs_the_engine_and_tenant_rejection_matrix257 ms
- ✓Cross tenant refund writes are atomichttp::tests::properties::authorization::cross_tenant_refund_writes_are_atomic1.0 s
- ✓Named revocation and cross tenant history replayshttp::tests::properties::authorization::named_revocation_and_cross_tenant_history_replays76 ms
- ✓Lists and live events expose only the authenticated tenanthttp::tests::properties::authorization::lists_and_live_events_expose_only_the_authenticated_tenant1.2 s
- ✓Permission matrix rejects credentials without data or writeshttp::tests::properties::authorization::permission_matrix_rejects_credentials_without_data_or_writes1.1 s
- ✓Payment lookup cannot read or credit another tenants outputshttp::tests::properties::authorization::payment_lookup_cannot_read_or_credit_another_tenants_outputs1.9 s
- ✓Repeated headers bind only the first presented capabilityhttp::tests::properties::authorization::repeated_headers_bind_only_the_first_presented_capability970 ms
- ✓Tenant ownership and revocation historieshttp::tests::properties::authorization::tenant_ownership_and_revocation_histories1.9 s
- ✓Bearer syntax cannot expand tenant authority 512 caseshttp::tests::properties::authorization::bearer_syntax_cannot_expand_tenant_authority3.7 s
- ✓Body identity cannot steer own tenant operations 512 caseshttp::tests::properties::authorization::body_identity_cannot_steer_own_tenant_operations4.8 s
- ✓Concurrent rejections leave no writes or stream slot leaks 512 caseshttp::tests::properties::authorization::concurrent_rejections_leave_no_writes_or_stream_slot_leaks6.6 s
- ✓Every route runs the engine and tenant rejection matrix 512 caseshttp::tests::properties::authorization::every_route_runs_the_engine_and_tenant_rejection_matrix114 ms
- ✓Cross tenant refund writes are atomic 512 caseshttp::tests::properties::authorization::cross_tenant_refund_writes_are_atomic6.4 s
- ✓Named revocation and cross tenant history replays 512 caseshttp::tests::properties::authorization::named_revocation_and_cross_tenant_history_replays45 ms
- ✓Lists and live events expose only the authenticated tenant 512 caseshttp::tests::properties::authorization::lists_and_live_events_expose_only_the_authenticated_tenant5.4 s
- ✓Permission matrix rejects credentials without data or writes 512 caseshttp::tests::properties::authorization::permission_matrix_rejects_credentials_without_data_or_writes4.6 s
- ✓Payment lookup cannot read or credit another tenants outputs 512 caseshttp::tests::properties::authorization::payment_lookup_cannot_read_or_credit_another_tenants_outputs8.5 s
- ✓Repeated headers bind only the first presented capability 512 caseshttp::tests::properties::authorization::repeated_headers_bind_only_the_first_presented_capability4.6 s
- ✓Tenant ownership and revocation histories 512 caseshttp::tests::properties::authorization::tenant_ownership_and_revocation_histories8.6 s
engine::http::status_page441 ms
- ✓A node is asked once when its info says its heighthttp::status_page::tests::a_node_is_asked_once_when_its_info_says_its_height10 ms
- ✓A real observed slow tick cadence against the dev config no longer reads as stalehttp::status_page::tests::a_real_observed_slow_tick_cadence_against_the_dev_config_no_longer_reads_as_stale11 ms
- ✓Is stale uses five times the configured poll interval with a 15s floorhttp::status_page::tests::is_stale_uses_five_times_the_configured_poll_interval_with_a_15s_floor10 ms
- ✓One failed probe while scanning works is not reported as unreachablehttp::status_page::tests::one_failed_probe_while_scanning_works_is_not_reported_as_unreachable10 ms
engine::link448 ms
- ✓A new link starts slow and is given timelink::tests::a_new_link_starts_slow_and_is_given_time12 ms
- ✓A timeout halves the rate and the next timeout growslink::tests::a_timeout_halves_the_rate_and_the_next_timeout_grows12 ms
- ✓History keeps an hour by the minutelink::tests::history_keeps_an_hour_by_the_minute13 ms
- ✓The rate comes from large bodies and the first byte from the nodes worklink::tests::the_rate_comes_from_large_bodies_and_the_first_byte_from_the_nodes_work11 ms
engine::options_file4284 ms
- ✓Init writes the options file where xdg says and never overwrites itinit_writes_the_options_file_where_xdg_says_and_never_overwrites_it37 ms
- ✓The engine does not start on a file it cannot usethe_engine_does_not_start_on_a_file_it_cannot_use35 ms
- ✓Without a home the options file is in the working directorywithout_a_home_the_options_file_is_in_the_working_directory18 ms
- ✓The engine starts without a file and follows one and its optionsthe_engine_starts_without_a_file_and_follows_one_and_its_options194 ms
engine::property_support110 ms
- ✓Each property replays only its own regression fileproperty_support::each_property_replays_only_its_own_regression_file10 ms
engine::run7343 ms
- ✓A database that cannot be opened is an errorrun::tests::a_database_that_cannot_be_opened_is_an_error11 ms
- ✓A second start on the same files carries onrun::tests::a_second_start_on_the_same_files_carries_on102 ms
- ✓An embedded engine refuses the standalone engines settingsrun::tests::an_embedded_engine_refuses_the_standalone_engines_settings11 ms
- ✓An embedded engine uses its hosts token and its table of the filerun::tests::an_embedded_engine_uses_its_hosts_token_and_its_table_of_the_file77 ms
- ✓An engine starts serves its api and shuts down cleanlyrun::tests::an_engine_starts_serves_its_api_and_shuts_down_cleanly75 ms
- ✓The router still requires the engine tokenrun::tests::the_router_still_requires_the_engine_token57 ms
- ✓Without an engine token it does not startrun::tests::without_an_engine_token_it_does_not_start10 ms
engine::settings541 ms
- ✓A node without a publisher needs no zmq supportsettings::tests::a_node_without_a_publisher_needs_no_zmq_support8 ms
- ✓A publisher must be a tcp or ipc addresssettings::tests::a_publisher_must_be_a_tcp_or_ipc_address7 ms
- ✓A saved node round trips through json including fallbackssettings::tests::a_saved_node_round_trips_through_json_including_fallbacks10 ms
- ✓Bind addresses are classified as private or publicsettings::tests::bind_addresses_are_classified_as_private_or_public7 ms
- ✓The default bind address is loopback onlysettings::tests::the_default_bind_address_is_loopback_only9 ms
engine::threads448 ms
- ✓A cpu list takes numbers and ranges like tasksetthreads::tests::a_cpu_list_takes_numbers_and_ranges_like_taskset10 ms
- ✓Cpus that dont exist are refused before the runtime startsthreads::tests::cpus_that_dont_exist_are_refused_before_the_runtime_starts10 ms
- ✓Scans get one slot per cpu the engine may usethreads::tests::scans_get_one_slot_per_cpu_the_engine_may_use9 ms
- ✓Every engine thread is pinned and nicedthreads::tests::every_engine_thread_is_pinned_and_niced19 ms
engine::verification_temp_db111 ms
- ✓Owns unique paths and removes database sidecars and crash markersverification_temp_db::tests::owns_unique_paths_and_removes_database_sidecars_and_crash_markers11 ms
javascript-disabled1586 ms
- ✓Refresh icon and settings fallback remain usable without JSjavascript-disabled.spec.js586 ms
monokulo::assets434 ms
- ✓A browser that has the file is told so without a bodyassets::tests::a_browser_that_has_the_file_is_told_so_without_a_body9 ms
- ✓Every name links to a url the route servesassets::tests::every_name_links_to_a_url_the_route_serves8 ms
- ✓Served with the cache policy its name asks for and only at that nameassets::tests::served_with_the_cache_policy_its_name_asks_for_and_only_at_that_name9 ms
- ✓The digest is computed at build time from the bytesassets::tests::the_digest_is_computed_at_build_time_from_the_bytes8 ms
monokulo::cli558 ms
- ✓The command line is well formedcli::tests::the_command_line_is_well_formed9 ms
- ✓Every setting is an option and a bad value is refusedcli::tests::every_setting_is_an_option_and_a_bad_value_is_refused14 ms
- ✓The database path follows xdg unless givencli::tests::the_database_path_follows_xdg_unless_given10 ms
- ✓The embedded engines settings are engine optionscli::tests::the_embedded_engines_settings_are_engine_options14 ms
- ✓The options file is named or defaults to the config directorycli::tests::the_options_file_is_named_or_defaults_to_the_config_directory11 ms
monokulo::crypto757 ms
- ✓A value bound to one row does not decrypt in anothercrypto::tests::a_value_bound_to_one_row_does_not_decrypt_in_another9 ms
- ✓Decrypting a non hex string returns an error not a paniccrypto::tests::decrypting_a_non_hex_string_returns_an_error_not_a_panic8 ms
- ✓Decrypting a tampered ciphertext returns an error not a panic or wrong plaintextcrypto::tests::decrypting_a_tampered_ciphertext_returns_an_error_not_a_panic_or_wrong_plaintext8 ms
- ✓Decrypting a truncated string returns an error not a paniccrypto::tests::decrypting_a_truncated_string_returns_an_error_not_a_panic8 ms
- ✓Decrypting with the wrong key returns an errorcrypto::tests::decrypting_with_the_wrong_key_returns_an_error8 ms
- ✓Encrypt then decrypt round trips to the exact original plaintextcrypto::tests::encrypt_then_decrypt_round_trips_to_the_exact_original_plaintext8 ms
- ✓Encrypting the same plaintext twice produces two different encoded stringscrypto::tests::encrypting_the_same_plaintext_twice_produces_two_different_encoded_strings8 ms
monokulo::embed_domains663 ms
- ✓A domain covers itself and its subdomains onlyembed_domains::tests::a_domain_covers_itself_and_its_subdomains_only12 ms
- ✓A missing record keeps counting through the grace period then lapsesembed_domains::tests::a_missing_record_keeps_counting_through_the_grace_period_then_lapses9 ms
- ✓A restricted policy allows only https pages on counting domainsembed_domains::tests::a_restricted_policy_allows_only_https_pages_on_counting_domains11 ms
- ✓A site url suggests its domain when it can be verifiedembed_domains::tests::a_site_url_suggests_its_domain_when_it_can_be_verified11 ms
- ✓Check finds the token only at the right nameembed_domains::tests::check_finds_the_token_only_at_the_right_name11 ms
- ✓Normalize domain accepts urls and rejects what cannot be verifiedembed_domains::tests::normalize_domain_accepts_urls_and_rejects_what_cannot_be_verified9 ms
monokulo::live7189 ms
- ✓A new cache size ends live streams on the old http clientlive::tests::a_new_cache_size_ends_live_streams_on_the_old_http_client32 ms
- ✓Last subscription dropped closes the upstreamlive::tests::last_subscription_dropped_closes_the_upstream23 ms
- ✓Order changes reach only the named order and are released with their watcherslive::tests::order_changes_reach_only_the_named_order_and_are_released_with_their_watchers12 ms
- ✓Order changes outlive a new engine hublive::tests::order_changes_outlive_a_new_engine_hub31 ms
- ✓Parser handles split chunks comments and crlflive::tests::parser_handles_split_chunks_comments_and_crlf13 ms
- ✓Wake reaches only the named orderlive::tests::wake_reaches_only_the_named_order23 ms
- ✓Watchers woken by one change share one read of the orderlive::tests::watchers_woken_by_one_change_share_one_read_of_the_order55 ms
monokulo::logs496 ms
- ✓A page of newer lines keeps those closest to the cursorlogs::tests::a_page_of_newer_lines_keeps_those_closest_to_the_cursor9 ms
- ✓Two stores merge newest first and page consistentlylogs::tests::two_stores_merge_newest_first_and_page_consistently10 ms
- ✓Without the engine or a store the page says whylogs::tests::without_the_engine_or_a_store_the_page_says_why12 ms
- ✓Lines from monokulo and a real engine come back as one listlogs::tests::lines_from_monokulo_and_a_real_engine_come_back_as_one_list65 ms
monokulo::onion_listener399 ms
- ✓Each circuit is its own client and headerless connections are droppedeach_circuit_is_its_own_client_and_headerless_connections_are_dropped38 ms
- ✓Junk is refused and a stalled connection does not block the next circuitjunk_is_refused_and_a_stalled_connection_does_not_block_the_next_circuit30 ms
- ✓The ordinary listener never honours a proxy headerthe_ordinary_listener_never_honours_a_proxy_header31 ms
monokulo::qr112 ms
- ✓A code is one svg element hidden from screen readersqr::tests::a_code_is_one_svg_element_hidden_from_screen_readers12 ms
monokulo::templates559 ms
- ✓Display or dash shows the muted placeholder for none or emptytemplates::tests::display_or_dash_shows_the_muted_placeholder_for_none_or_empty11 ms
- ✓Format duration until handles under a minute and already passedtemplates::tests::format_duration_until_handles_under_a_minute_and_already_passed13 ms
- ✓Format duration until matches the moment js style examplestemplates::tests::format_duration_until_matches_the_moment_js_style_examples12 ms
- ✓Format duration until never shows more than two partstemplates::tests::format_duration_until_never_shows_more_than_two_parts12 ms
- ✓Format duration until skips a zero unit rather than showing ittemplates::tests::format_duration_until_skips_a_zero_unit_rather_than_showing_it11 ms
monokulo::wallets443 ms
- ✓A friendly name is two words and never one already takenwallets::tests::a_friendly_name_is_two_words_and_never_one_already_taken9 ms
- ✓Backups are the apps paper or skippedwallets::tests::backups_are_the_apps_paper_or_skipped10 ms
- ✓Names are tidied blank means pick one and long ones are refusedwallets::tests::names_are_tidied_blank_means_pick_one_and_long_ones_are_refused12 ms
- ✓When every pairing is taken a numbered name is usedwallets::tests::when_every_pairing_is_taken_a_numbered_name_is_used12 ms
order-creation11.8 s
- ✓Order creation, Back and changed or unchanged resubmission workorder-creation.spec.js1.8 s
pages-gallery-themes2699 ms
- ✓A light reader sees one thumbnail per frame in every theme modepages-gallery-themes.spec.js316 ms
- ✓A dark reader sees one thumbnail per frame in every theme modepages-gallery-themes.spec.js383 ms
shared::activity211 ms
- ✓Every event but the round s own belongs to a tieractivity::tests::every_event_but_the_round_s_own_belongs_to_a_tier5 ms
- ✓Recorded events round trip through jsonactivity::tests::recorded_events_round_trip_through_json6 ms
shared::auth744 ms
- ✓A raw token never shows in debug outputauth::tests::a_raw_token_never_shows_in_debug_output7 ms
- ✓An engine token must be long enough and is kept without whitespaceauth::tests::an_engine_token_must_be_long_enough_and_is_kept_without_whitespace7 ms
- ✓Generated connect tokens have the expected prefix and are uniqueauth::tests::generated_connect_tokens_have_the_expected_prefix_and_are_unique5 ms
- ✓Generated invite tokens have the expected prefix and are uniqueauth::tests::generated_invite_tokens_have_the_expected_prefix_and_are_unique5 ms
- ✓Generated public and secret keys have expected prefixes and are uniqueauth::tests::generated_public_and_secret_keys_have_expected_prefixes_and_are_unique8 ms
- ✓Generated session tokens have the expected prefix and are uniqueauth::tests::generated_session_tokens_have_the_expected_prefix_and_are_unique6 ms
- ✓Hash is deterministic and sensitive to every bitauth::tests::hash_is_deterministic_and_sensitive_to_every_bit6 ms
shared::http_cache6104 ms
- ✓A cache control bearing response is served from cache within its max agehttp_cache::tests::a_cache_control_bearing_response_is_served_from_cache_within_its_max_age14 ms
- ✓A response with no cache control header at all is never cachedhttp_cache::tests::a_response_with_no_cache_control_header_at_all_is_never_cached17 ms
- ✓A stale entry past its max age triggers a real refetchhttp_cache::tests::a_stale_entry_past_its_max_age_triggers_a_real_refetch18 ms
- ✓A traced client sends the callers trace and a plain one does nothttp_cache::tests::a_traced_client_sends_the_callers_trace_and_a_plain_one_does_not23 ms
- ✓The configured byte cap actually evicts the oldest entry once exceededhttp_cache::tests::the_configured_byte_cap_actually_evicts_the_oldest_entry_once_exceeded17 ms
- ✓Two different bearer tokens against the same url never share a cache entryhttp_cache::tests::two_different_bearer_tokens_against_the_same_url_never_share_a_cache_entry15 ms
shared::ids17 ms
- ✓An id is its string in json and sqliteids::tests::an_id_is_its_string_in_json_and_sqlite7 ms
shared::log531 ms
- ✓A key is kept under the crate that logged itlog::tests::a_key_is_kept_under_the_crate_that_logged_it5 ms
- ✓A repeated event is admitted once per interval with the count held backlog::tests::a_repeated_event_is_admitted_once_per_interval_with_the_count_held_back6 ms
- ✓The macro builds with fields and a formatted messagelog::tests::the_macro_builds_with_fields_and_a_formatted_message7 ms
- ✓The macro throttles by the namespaced keylog::tests::the_macro_throttles_by_the_namespaced_key7 ms
- ✓The same key from two crates is throttled separatelylog::tests::the_same_key_from_two_crates_is_throttled_separately6 ms
shared::migrations323 ms
- ✓A failing migration leaves neither its schema changes nor its version rowmigrations::tests::a_failing_migration_leaves_neither_its_schema_changes_nor_its_version_row8 ms
- ✓A rebuild that leaves a dangling reference is refusedmigrations::tests::a_rebuild_that_leaves_a_dangling_reference_is_refused6 ms
- ✓A migration marked foreign keys off can rebuild a parent tablemigrations::tests::a_migration_marked_foreign_keys_off_can_rebuild_a_parent_table9 ms
shared::monero_tx322 ms
- ✓A pruned blob decodes to the same prefix and base and encodes backmonero_tx::tests::a_pruned_blob_decodes_to_the_same_prefix_and_base_and_encodes_back7 ms
- ✓A pruned transactions id is the whole onesmonero_tx::tests::a_pruned_transactions_id_is_the_whole_ones7 ms
- ✓Whole and pruned blobs are never mistaken for each othermonero_tx::tests::whole_and_pruned_blobs_are_never_mistaken_for_each_other8 ms
shared::network213 ms
- ✓Rejects anything that isnt an exact known namenetwork::tests::rejects_anything_that_isnt_an_exact_known_name7 ms
- ✓Round trips every valid networknetwork::tests::round_trips_every_valid_network6 ms
shared::order_status16 ms
- ✓Every status round trips through its name and jsonorder_status::tests::every_status_round_trips_through_its_name_and_json6 ms
shared::password7355 ms
- ✓A panicking job answers nonepassword::tests::a_panicking_job_answers_none7 ms
- ✓A hashed password rejects a wrong passwordpassword::tests::a_hashed_password_rejects_a_wrong_password68 ms
- ✓A hashed password verifies against the originalpassword::tests::a_hashed_password_verifies_against_the_original67 ms
- ✓Hashing the same password twice produces different hashes but both verifypassword::tests::hashing_the_same_password_twice_produces_different_hashes_but_both_verify90 ms
- ✓Verifying against a malformed hash string returns false rather than panickingpassword::tests::verifying_against_a_malformed_hash_string_returns_false_rather_than_panicking6 ms
- ✓Run hashes without holding up the async threadpassword::tests::run_hashes_without_holding_up_the_async_thread48 ms
- ✓Run keeps to one job per corepassword::tests::run_keeps_to_one_job_per_core69 ms
shared::rate_limit7198 ms
- ✓A changed limit applies to the next requestrate_limit::tests::a_changed_limit_applies_to_the_next_request7 ms
- ✓Allows up to the limit then rejects within the same windowrate_limit::tests::allows_up_to_the_limit_then_rejects_within_the_same_window6 ms
- ✓Different ips have independent budgetsrate_limit::tests::different_ips_have_independent_budgets5 ms
- ✓A swept address gets a fresh budget rather than a stale onerate_limit::tests::a_swept_address_gets_a_fresh_budget_rather_than_a_stale_one18 ms
- ✓Resets after the window elapsesrate_limit::tests::resets_after_the_window_elapses7 ms
- ✓Expired windows are actually removed not merely ignoredrate_limit::tests::expired_windows_are_actually_removed_not_merely_ignored14 ms
- ✓A flood of live addresses inside one window is still boundedrate_limit::tests::a_flood_of_live_addresses_inside_one_window_is_still_bounded141 ms
shared::resources4582 ms
- ✓The limit is the smaller of the machine and its containerresources::tests::the_limit_is_the_smaller_of_the_machine_and_its_container7 ms
- ✓This machine can be readresources::tests::this_machine_can_be_read7 ms
- ✓A process samples itself into 10 second slots and keeps an hourresources::tests::a_process_samples_itself_into_10_second_slots_and_keeps_an_hour60 ms
- ✓A hosted services threads are measured apartresources::tests::a_hosted_services_threads_are_measured_apart508 ms
shared::scaling17 ms
- ✓The pace is named by what limits the scanscaling::tests::the_pace_is_named_by_what_limits_the_scan7 ms
shared::sqlite6254 ms
- ✓A panicking job fails alone and the thread carries onsqlite::tests::a_panicking_job_fails_alone_and_the_thread_carries_on10 ms
- ✓A pool whose threads stopped says sosqlite::tests::a_pool_whose_threads_stopped_says_so8 ms
- ✓A slow job does not hold up the nextsqlite::tests::a_slow_job_does_not_hold_up_the_next13 ms
- ✓Read only refuses writes and restores the connectionsqlite::tests::read_only_refuses_writes_and_restores_the_connection8 ms
- ✓Readers see the writers commits and cannot writesqlite::tests::readers_see_the_writers_commits_and_cannot_write8 ms
- ✓Inline runs on the shared value and refuses a held locksqlite::tests::inline_runs_on_the_shared_value_and_refuses_a_held_lock207 ms
shared::supervise526 ms
- ✓A loop supervised until stopped is aborted and not restartedsupervise::tests::a_loop_supervised_until_stopped_is_aborted_and_not_restarted5 ms
- ✓A loop that keeps failing backs off and is countedsupervise::tests::a_loop_that_keeps_failing_backs_off_and_is_counted6 ms
- ✓A loop that panics or returns is started againsupervise::tests::a_loop_that_panics_or_returns_is_started_again5 ms
- ✓Dropping the stop sender also stops the loopsupervise::tests::dropping_the_stop_sender_also_stops_the_loop5 ms
- ✓The supervisor ends only once its stopped loop is gonesupervise::tests::the_supervisor_ends_only_once_its_stopped_loop_is_gone5 ms
shared::time15 ms
- ✓Seconds and nanoseconds agreetime::tests::seconds_and_nanoseconds_agree5 ms
shared::unreachable16 ms
- ✓A request ends without an answerunreachable::tests::a_request_ends_without_an_answer6 ms
shared::xmr_amount639 ms
- ✓A leading plus sign is rejected rather than shifting the decimal placexmr_amount::tests::a_leading_plus_sign_is_rejected_rather_than_shifting_the_decimal_place6 ms
- ✓Every other malformed decimal shape is rejectedxmr_amount::tests::every_other_malformed_decimal_shape_is_rejected6 ms
- ✓A value too large for u64 piconero is an error not a silent wraparoundxmr_amount::tests::a_value_too_large_for_u64_piconero_is_an_error_not_a_silent_wraparound7 ms
- ✓Format and parse xmr round tripxmr_amount::tests::format_and_parse_xmr_round_trip7 ms
- ✓Format piconero as xmr matches hand computed valuesxmr_amount::tests::format_piconero_as_xmr_matches_hand_computed_values6 ms
- ✓Parse xmr to piconero matches hand computed valuesxmr_amount::tests::parse_xmr_to_piconero_matches_hand_computed_values7 ms
short-id::tests945 ms
- ✓A known prefix stays in front of the shortened valuetests::a_known_prefix_stays_in_front_of_the_shortened_value6 ms
- ✓A measurement shows its start its middle and its endtests::a_measurement_shows_its_start_its_middle_and_its_end5 ms
- ✓A shortened value shows one ellipsis never three dotstests::a_shortened_value_shows_one_ellipsis_never_three_dots5 ms
- ✓A txid keeps six characters at each endtests::a_txid_keeps_six_characters_at_each_end5 ms
- ✓A value is whole when shortening would save fewer than four characterstests::a_value_is_whole_when_shortening_would_save_fewer_than_four_characters4 ms
- ✓An address middle is centred on odd and even lengthstests::an_address_middle_is_centred_on_odd_and_even_lengths6 ms
- ✓An address shows its start its middle and its endtests::an_address_shows_its_start_its_middle_and_its_end5 ms
- ✓An order id drops order and keeps six characters at each endtests::an_order_id_drops_order_and_keeps_six_characters_at_each_end4 ms
- ✓Shortening cuts on character boundariestests::shortening_cuts_on_character_boundaries5 ms
short-values43.6 s
- ✓The dashboard's public key shows short, and copies, reads and finds wholeshort-values.spec.js758 ms
- ✓An order ID on the dashboard is a short, underlined link to the order whose name is the whole IDshort-values.spec.js1.2 s
- ✓An order ID on the orders list is a short, underlined link to the order whose name is the whole IDshort-values.spec.js952 ms
- ✓A double-click on an order ID link opens the order: the link wins over selecting itshort-values.spec.js704 ms
static-assets::tests318 ms
- ✓A file is published at its digest unless others link ittests::a_file_is_published_at_its_digest_unless_others_link_it6 ms
- ✓Every weight of the typeface is linked where the page saystests::every_weight_of_the_typeface_is_linked_where_the_page_says6 ms
- ✓The digest is computed at build time from the bytestests::the_digest_is_computed_at_build_time_from_the_bytes6 ms
status-network-card720.9 s
- ✓An admin sees the card titled Mainnet, its nodes and proof of work 3 behind the tipstatus-network-card.spec.js3.7 s
- ✓Fourteen blocks behind, the chip stays the same neutral tagstatus-network-card.spec.js1.7 s
- ✓Held, one box gives the reason and a neutral button to take a new anchorstatus-network-card.spec.js1.7 s
- ✓On a phone each node is a card and the window still readsstatus-network-card.spec.js982 ms
- ✓Someone not an admin sees no proof of work and no engine pagestatus-network-card.spec.js1.3 s
- ✓Without JavaScript the card is the same, and its facts openstatus-network-card.spec.js569 ms
- ✓The card follows the engine live, the new markup swapped in wholestatus-network-card.spec.js11.0 s
store-settings536.1 s
- ✓A change marks its card and shows the save bar, and Discard puts it backstore-settings.spec.js12.2 s
- ✓A save says so on the card and in a toast; a refused one keeps what was typedstore-settings.spec.js13.9 s
- ✓Without JavaScript the save bar is always there and saves, refused or notstore-settings.spec.js7.8 s
- ✓The Verified domains form lays its field out like every other setting, and still adds a domainstore-settings.spec.js1.2 s
- ✓Without JavaScript the Verified domains form still adds a domainstore-settings.spec.js1.0 s
store-site432.5 s
- ✓A connected plugin locks the website; disconnecting it removes its webhook and unlocks the website, which then changes behind its own dialogstore-site.spec.js19.2 s
- ✓Without JavaScript the dialogs are pagesstore-site.spec.js4.0 s
- ✓On a phone the Connections card stacks its buttonstore-site.spec.js1.5 s
- ✓Disconnecting waits while an order from the shop can be paidstore-site.spec.js7.8 s
ui::select739 ms
- ✓A logo is for the list onlya_logo_is_for_the_list_only5 ms
- ✓A plain option is a plain optiona_plain_option_is_a_plain_option5 ms
- ✓A network on its own is its badgea_network_on_its_own_is_its_badge6 ms
- ✓A select is an island around a working selecta_select_is_an_island_around_a_working_select6 ms
- ✓An option names its network in words and for the badgean_option_names_its_network_in_words_and_for_the_badge5 ms
- ✓An option says everything in words and gives the list its partsan_option_says_everything_in_words_and_gives_the_list_its_parts6 ms
- ✓Only current is greenonly_current_is_green6 ms
ui::template531 ms
- ✓Class is the components ownclass_is_the_components_own6 ms
- ✓Absent options and empty lists take the other branchabsent_options_and_empty_lists_take_the_other_branch6 ms
- ✓Every form renders as maud would write itevery_form_renders_as_maud_would_write_it7 ms
- ✓Slots hold text components and markupslots_hold_text_components_and_markup6 ms
- ✓The description lists props with their defaultsthe_description_lists_props_with_their_defaults6 ms
wallet-details211.5 s
- ✓The Details card renames the wallet: marked, discarded, refused, savedwallet-details.spec.js10.5 s
- ✓Without JavaScript the wallet is renamed with the save bar, which is always therewallet-details.spec.js992 ms
wallet-page729.4 s
- ✓A wallet's page is one column: where it lives, stores, details, history, then Retirewallet-page.spec.js3.2 s
- ✓Where it lives says how each wallet was backed up or which app it is inwallet-page.spec.js2.9 s
- ✓The retire dialog is blocked while a store takes payments into the wallet and an order can be paidwallet-page.spec.js4.7 s
- ✓A wallet nothing uses is retired by typing its name, then restored with its keyswallet-page.spec.js10.6 s
- ✓Without JavaScript the dialogs are pageswallet-page.spec.js4.2 s
- ✓On a phone a wallet's page stays one columnwallet-page.spec.js990 ms
- ✓The setup flow's network dropdown shows each network as its badgewallet-page.spec.js2.9 s
wallet-setup (real binaries)72 min
- ✓A website store is set up: a new wallet backed up in Feather, checked with two words, then Donewallet-setup.spec.js37.4 s
- ✓The check lets you go on without answering after 20 secondswallet-setup.spec.js8.0 s
- ✓Skipping the backup needs the warning read, the box ticked and "skip" typedwallet-setup.spec.js5.0 s
- ✓With JavaScript off › a store with no site is set up on a wallet already added; creating one is shown unavailablewallet-setup.spec.js12.2 s
- ✓With JavaScript off › bringing your own wallet works and shows where the keys arewallet-setup.spec.js4.4 s
- ✓A wallet lists its stores and is renamed on its pagewallet-setup.spec.js9.9 s
- ✓A store changes its wallet: the dropdown asks first, then the history shows bothwallet-setup.spec.js25.6 s
wallet-setup::tests479 ms
- ✓A restore link fits in a qr codetests::a_restore_link_fits_in_a_qr_code21 ms
- ✓The birthday is kept in the phrasetests::the_birthday_is_kept_in_the_phrase16 ms
- ✓Different entropy makes a different wallet and only 150 bits counttests::different_entropy_makes_a_different_wallet_and_only_150_bits_count22 ms
- ✓Each network gets its own address prefixtests::each_network_gets_its_own_address_prefix20 ms
wallets-networks619.4 s
- ✓Mainnet wallets are the list and the test networks are folded below, shutwallets-networks.spec.js5.6 s
- ✓With only test wallets the fold starts open and says there is no mainnet wallet yetwallets-networks.spec.js3.4 s
- ✓On a phone each wallet is a cardwallets-networks.spec.js895 ms
- ✓A wallet's page shows its network beside its namewallets-networks.spec.js3.2 s
- ✓The dashboard shows each store's wallet with its networkwallets-networks.spec.js2.9 s
- ✓Pickers show each wallet with its network, and a store changes only within its ownwallets-networks.spec.js3.4 s
No tests match. Try a shorter word, or clear the suite and area filters.