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.
Some checks failed·Tests and coverage from
4176f6b on 18 Oct 2026·Nightly properties 23 Oct 2026·Fuzzing 23 Oct 2026·Live network 22 Oct 2026Tests2,6572,657 passed · 0 skipped
Engine and server90.5%of 92,270 Rust lines
Checkout and POS95.1%of 1,666 browser lines
Properties nightly212plus 10 fuzz targets · 27 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 groups7011.8 h
engine::daemon_fallback21158 ms
- ✓A block request gives each node the time its link needsdaemon_fallback::tests::a_block_request_gives_each_node_the_time_its_link_needs7 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_call7 ms
- ✓A failed node cools down for longer each time and recoversdaemon_fallback::tests::a_failed_node_cools_down_for_longer_each_time_and_recovers8 ms
- ✓A hanging node gets only its share of the call deadlinedaemon_fallback::tests::a_hanging_node_gets_only_its_share_of_the_call_deadline6 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_called9 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_it7 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_on7 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_against7 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_client8 ms
- ✓A transaction is nowhere only when every reachable node says sodaemon_fallback::tests::a_transaction_is_nowhere_only_when_every_reachable_node_says_so8 ms
- ✓An excluded node is never pinned or trieddaemon_fallback::tests::an_excluded_node_is_never_pinned_or_tried7 ms
- ✓Disagreement between nodes refuses to affirm a double spenddaemon_fallback::tests::disagreement_between_nodes_refuses_to_affirm_a_double_spend8 ms
- ✓Each key image is corroborated independently of the othersdaemon_fallback::tests::each_key_image_is_corroborated_independently_of_the_others8 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_panicking8 ms
- ✓Every node unreachable is an error not a silent unspentdaemon_fallback::tests::every_node_unreachable_is_an_error_not_a_silent_unspent7 ms
- ✓Once failed over the client becomes sticky to the working nodedaemon_fallback::tests::once_failed_over_the_client_becomes_sticky_to_the_working_node7 ms
- ✓Only one node reachable this call is also trusted as isdaemon_fallback::tests::only_one_node_reachable_this_call_is_also_trusted_as_is6 ms
- ✓Pool and unspent disagreement is also inconclusivedaemon_fallback::tests::pool_and_unspent_disagreement_is_also_inconclusive6 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_fails14 ms
- ✓Unanimous agreement on unspent is reported as isdaemon_fallback::tests::unanimous_agreement_on_unspent_is_reported_as_is6 ms
- ✓Unanimous spent in blockchain across every node is affirmeddaemon_fallback::tests::unanimous_spent_in_blockchain_across_every_node_is_affirmed7 ms
engine::daemon_rpc750 ms
- ✓A get blocks bin entry carries its own block identitydaemon_rpc::tests::a_get_blocks_bin_entry_carries_its_own_block_identity7 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_none7 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_holds7 ms
- ✓Get info says which network a node is ondaemon_rpc::tests::get_info_says_which_network_a_node_is_on5 ms
- ✓Only an affirmative miss locates a transaction as not founddaemon_rpc::tests::only_an_affirmative_miss_locates_a_transaction_as_not_found10 ms
- ✓Optional fields a real node may omit still parsedaemon_rpc::tests::optional_fields_a_real_node_may_omit_still_parse5 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_key9 ms
engine::daemon_rpc::live_node_tests115 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_error15 ms
engine::daemon_rpc::wire_tests25666 ms
- ✓A block answer is capped by what was asked fordaemon_rpc::wire_tests::a_block_answer_is_capped_by_what_was_asked_for19 ms
- ✓A blocks pruned transactions are checked against its own listdaemon_rpc::wire_tests::a_blocks_pruned_transactions_are_checked_against_its_own_list9 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_list19 ms
- ✓A large blocks outline is read from its own blobdaemon_rpc::wire_tests::a_large_blocks_outline_is_read_from_its_own_blob15 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_apart47 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_on27 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_list33 ms
- ✓A pool that cannot be read is an errordaemon_rpc::wire_tests::a_pool_that_cannot_be_read_is_an_error20 ms
- ✓A small answer measures the round tripdaemon_rpc::wire_tests::a_small_answer_measures_the_round_trip11 ms
- ✓A tip and a pool asked for together fail apartdaemon_rpc::wire_tests::a_tip_and_a_pool_asked_for_together_fail_apart15 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_under7 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_window13 ms
- ✓An answer over the cap asks for lessdaemon_rpc::wire_tests::an_answer_over_the_cap_asks_for_less14 ms
- ✓Blobs and difficulty headers are read as monerod sends themdaemon_rpc::wire_tests::blobs_and_difficulty_headers_are_read_as_monerod_sends_them27 ms
- ✓Headers and hashes are asked for as just thatdaemon_rpc::wire_tests::headers_and_hashes_are_asked_for_as_just_that22 ms
- ✓Pool answers parse in every shape a node sendsdaemon_rpc::wire_tests::pool_answers_parse_in_every_shape_a_node_sends9 ms
- ✓Several transactions are located in one requestdaemon_rpc::wire_tests::several_transactions_are_located_in_one_request20 ms
- ✓The blocks request is the recorded onedaemon_rpc::wire_tests::the_blocks_request_is_the_recorded_one8 ms
- ✓The pool is followed by its changesdaemon_rpc::wire_tests::the_pool_is_followed_by_its_changes16 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_stats20 ms
- ✓The pool view applies changes and correctionsdaemon_rpc::wire_tests::the_pool_view_applies_changes_and_corrections8 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_moved14 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_estimate221 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_one24 ms
- ✓Transactions are fetched pruned under their idsdaemon_rpc::wire_tests::transactions_are_fetched_pruned_under_their_ids28 ms
engine::daemon_rpc_replay283 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_node61 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_expects22 ms
engine::exploration::properties16365 ms
- ✓Application input boundaries handle arbitrary bytesexploration::properties::application_input_boundaries_handle_arbitrary_bytes30 ms
- ✓Cpu ranges match an independent set modelexploration::properties::cpu_ranges_match_an_independent_set_model32 ms
- ✓Event byte histories preserve scheduler invariantsexploration::properties::event_byte_histories_preserve_scheduler_invariants15 ms
- ✓Hostile cpu range lengths are rejected before allocationexploration::properties::hostile_cpu_range_lengths_are_rejected_before_allocation9 ms
- ✓Maximum cpu range is rejected without expansionexploration::properties::maximum_cpu_range_is_rejected_without_expansion7 ms
- ✓Queue byte histories preserve dispatch and drain contractsexploration::properties::queue_byte_histories_preserve_dispatch_and_drain_contracts21 ms
- ✓Sizing and retry boundaries handle all float bit patternsexploration::properties::sizing_and_retry_boundaries_handle_all_float_bit_patterns7 ms
- ✓Special float patterns are always exercisedexploration::properties::special_float_patterns_are_always_exercised6 ms
- ✓Application input boundaries handle arbitrary bytes 512 casesexploration::properties::application_input_boundaries_handle_arbitrary_bytes75 ms
- ✓Cpu ranges match an independent set model 512 casesexploration::properties::cpu_ranges_match_an_independent_set_model60 ms
- ✓Event byte histories preserve scheduler invariants 512 casesexploration::properties::event_byte_histories_preserve_scheduler_invariants30 ms
- ✓Hostile cpu range lengths are rejected before allocation 512 casesexploration::properties::hostile_cpu_range_lengths_are_rejected_before_allocation10 ms
- ✓Maximum cpu range is rejected without expansion 512 casesexploration::properties::maximum_cpu_range_is_rejected_without_expansion9 ms
- ✓Queue byte histories preserve dispatch and drain contracts 512 casesexploration::properties::queue_byte_histories_preserve_dispatch_and_drain_contracts36 ms
- ✓Sizing and retry boundaries handle all float bit patterns 512 casesexploration::properties::sizing_and_retry_boundaries_handle_all_float_bit_patterns10 ms
- ✓Special float patterns are always exercised 512 casesexploration::properties::special_float_patterns_are_always_exercised8 ms
engine::loops37.0 s
- ✓The node s announcements cut the wait between polls shortloops::tests::the_node_s_announcements_cut_the_wait_between_polls_short324 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.5 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.9 s
- ✓Dropping a manager generation stops its childrenloops::properties::dropping_a_manager_generation_stops_its_children11 ms
- ✓Generations stop before replacement and recover from panicsloops::properties::generations_stop_before_replacement_and_recover_from_panics39 ms
- ✓Stopping during factory or loop restart backoff is immediateloops::properties::stopping_during_factory_or_loop_restart_backoff_is_immediate14 ms
- ✓Real network manager follows generated node configurationloops::properties::real_network_manager_follows_generated_node_configuration844 ms
- ✓Dropping a manager generation stops its children 512 casesloops::properties::dropping_a_manager_generation_stops_its_children24 ms
- ✓Generations stop before replacement and recover from panics 512 casesloops::properties::generations_stop_before_replacement_and_recover_from_panics226 ms
- ✓Stopping during factory or loop restart backoff is immediate 512 casesloops::properties::stopping_during_factory_or_loop_restart_backoff_is_immediate87 ms
- ✓Real network manager follows generated node configuration 512 casesloops::properties::real_network_manager_follows_generated_node_configuration5.6 s
engine::node_events745 ms
- ✓A publisher still configured keeps its figures and one removed goesnode_events::tests::a_publisher_still_configured_keeps_its_figures_and_one_removed_goes8 ms
- ✓A wait runs its interval when nothing is announcednode_events::tests::a_wait_runs_its_interval_when_nothing_is_announced8 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_it7 ms
- ✓An announcement ends the wait after the minimum gapnode_events::tests::an_announcement_ends_the_wait_after_the_minimum_gap6 ms
- ✓An interval shorter than the gap is keptnode_events::tests::an_interval_shorter_than_the_gap_is_kept6 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_publisher5 ms
- ✓Pool and chain announcements wake only their own waitnode_events::tests::pool_and_chain_announcements_wake_only_their_own_wait5 ms
engine::node_events::properties122 min
- ✓Arbitrary topics match exact prefixesnode_events::properties::arbitrary_topics_match_exact_prefixes14 ms
- ✓Notification histories match pending permitsnode_events::properties::notification_histories_match_pending_permits20 ms
- ✓Reviewed notification histories replaynode_events::properties::reviewed_notification_histories_replay7 ms
- ✓Stale generation announcements do not wake replacementsnode_events::properties::stale_generation_announcements_do_not_wake_replacements7 ms
- ✓All polling recovery modes runnode_events::properties::all_polling_recovery_modes_run634 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.9 s
- ✓All polling recovery modes run 512 casesnode_events::properties::all_polling_recovery_modes_run642 ms
- ✓Arbitrary topics match exact prefixes 512 casesnode_events::properties::arbitrary_topics_match_exact_prefixes29 ms
- ✓Notification histories match pending permits 512 casesnode_events::properties::notification_histories_match_pending_permits104 ms
- ✓Reviewed notification histories replay 512 casesnode_events::properties::reviewed_notification_histories_replay9 ms
- ✓Stale generation announcements do not wake replacements 512 casesnode_events::properties::stale_generation_announcements_do_not_wake_replacements31 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::zmq42 min
- ✓Publisher switch disable reenable and duplicate endpointsnode_events::properties::zmq::publisher_switch_disable_reenable_and_duplicate_endpoints234 ms
- ✓Real subscriber recovers and tracks generated publisher configurationnode_events::properties::zmq::real_subscriber_recovers_and_tracks_generated_publisher_configuration11.4 s
- ✓Publisher switch disable reenable and duplicate endpoints 512 casesnode_events::properties::zmq::publisher_switch_disable_reenable_and_duplicate_endpoints261 ms
- ✓Real subscriber recovers and tracks generated publisher configuration 512 casesnode_events::properties::zmq::real_subscriber_recovers_and_tracks_generated_publisher_configuration1 min
engine::node_events::zmq3195 ms
- ✓A publisher s announcements wake the loopsnode_events::tests::zmq::a_publisher_s_announcements_wake_the_loops90 ms
- ✓Only the two topics are announcementsnode_events::tests::zmq::only_the_two_topics_are_announcements6 ms
- ✓The subscriber listens where the node settings saynode_events::tests::zmq::the_subscriber_listens_where_the_node_settings_say99 ms
engine::pow101.7 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_bits8 ms
- ✓A real block sent for another height or garbled is refusedpow::tests::a_real_block_sent_for_another_height_or_garbled_is_refused18 ms
- ✓Difficulty edgespow::tests::difficulty_edges9 ms
- ✓Randomx starts at hard fork 12 on each networkpow::tests::randomx_starts_at_hard_fork_12_on_each_network7 ms
- ✓Real blocks difficulty is computed as monerod doespow::tests::real_blocks_difficulty_is_computed_as_monerod_does11 ms
- ✓Seed heights change 64 blocks after each 2048thpow::tests::seed_heights_change_64_blocks_after_each_2048th8 ms
- ✓The header rules each refusepow::tests::the_header_rules_each_refuse17 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_two8 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_median8 ms
- ✓Real blocks prove across a key change and any change failspow::tests::real_blocks_prove_across_a_key_change_and_any_change_fails1.6 s
engine::pow::hasher21.4 s
- ✓At most two keys are heldpow::hasher::tests::at_most_two_keys_are_held1.1 s
- ✓Hashes randomx s reference vectorpow::hasher::tests::hashes_randomx_s_reference_vector319 ms
engine::proof2137.0 s
- ✓A block below the difficulty floor is caughtproof::tests::a_block_below_the_difficulty_floor_is_caught1.4 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.4 s
- ✓A failed anchor is not retried at onceproof::tests::a_failed_anchor_is_not_retried_at_once1.4 s
- ✓A caught node stays out for a whileproof::tests::a_caught_node_stays_out_for_a_while1.5 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_not1.9 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.0 s
- ✓A lying primary among three is caught and excludedproof::tests::a_lying_primary_among_three_is_caught_and_excluded2.2 s
- ✓A made up block is caught and never provenproof::tests::a_made_up_block_is_caught_and_never_proven2.2 s
- ✓A node contradicting itself is caughtproof::tests::a_node_contradicting_itself_is_caught1.4 s
- ✓A tuning checking cannot run with is refusedproof::tests::a_tuning_checking_cannot_run_with_is_refused8 ms
- ✓A node far behind is not held againstproof::tests::a_node_far_behind_is_not_held_against1.4 s
- ✓A restart resumes from the proven chain without anchoring againproof::tests::a_restart_resumes_from_the_proven_chain_without_anchoring_again1.6 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_refused1.8 s
- ✓An equally heavy branch does not replace the one seen firstproof::tests::an_equally_heavy_branch_does_not_replace_the_one_seen_first1.5 s
- ✓An anchor needs a majority of the configured nodesproof::tests::an_anchor_needs_a_majority_of_the_configured_nodes2.2 s
- ✓A reorg deeper than can be followed holds settlementproof::tests::a_reorg_deeper_than_can_be_followed_holds_settlement3.5 s
- ✓An honest chain is anchored and followed across a key changeproof::tests::an_honest_chain_is_anchored_and_followed_across_a_key_change1.7 s
- ✓An unreachable node is reported and nothing held against itproof::tests::an_unreachable_node_is_reported_and_nothing_held_against_it1.4 s
- ✓Blocks the proven chain has are passed over unhashedproof::tests::blocks_the_proven_chain_has_are_passed_over_unhashed1.4 s
- ✓Turning checking off forgets it and lets every node backproof::tests::turning_checking_off_forgets_it_and_lets_every_node_back1.5 s
- ✓The proven chain is pruned to what reorgs and rules needproof::tests::the_proven_chain_is_pruned_to_what_reorgs_and_rules_need3.4 s
engine::proof::properties1231 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.1 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.4 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.8 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.1 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.1 s
- ✓Verifier rpc timeouts during anchor reads and samples use healthy peersproof::tests::properties::verifier_rpc_timeouts_during_anchor_reads_and_samples_use_healthy_peers8.0 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_outage9 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::settlement413.6 s
- ✓A lying primary is excluded and its payment reorganised awayproof::tests::settlement::a_lying_primary_is_excluded_and_its_payment_reorganised_away3.0 s
- ✓An order is paid once its confirmations are provenproof::tests::settlement::an_order_is_paid_once_its_confirmations_are_proven1.9 s
- ✓An order paid in made up blocks is never paidproof::tests::settlement::an_order_paid_in_made_up_blocks_is_never_paid2.1 s
- ✓A payment deep in a made up chain never settlesproof::tests::settlement::a_payment_deep_in_a_made_up_chain_never_settles6.6 s
engine::scaling749 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_rounds7 ms
- ✓Block sizes rising and falling are namedscaling::tests::block_sizes_rising_and_falling_are_named7 ms
- ✓Discarded bytes are reported for the last ten minutesscaling::tests::discarded_bytes_are_reported_for_the_last_ten_minutes7 ms
- ✓Finishing another block leaves the one in progressscaling::tests::finishing_another_block_leaves_the_one_in_progress7 ms
- ✓Headers come first for an hour after each signscaling::tests::headers_come_first_for_an_hour_after_each_sign7 ms
- ✓The cache peak lasts an hourscaling::tests::the_cache_peak_lasts_an_hour7 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_scan7 ms
engine::scaling::properties12185 ms
- ✓Larger resources and faster links do not reduce request sizescaling::properties::larger_resources_and_faster_links_do_not_reduce_request_size8 ms
- ✓Maximum timeout and wall clock boundaries do not panicscaling::properties::maximum_timeout_and_wall_clock_boundaries_do_not_panic7 ms
- ✓Progress histories survive clock jumps and extreme countersscaling::properties::progress_histories_survive_clock_jumps_and_extreme_counters46 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_bound8 ms
- ✓Timeout bounds hold for extreme measurementsscaling::properties::timeout_bounds_hold_for_extreme_measurements8 ms
- ✓Larger resources and faster links do not reduce request size 512 casesscaling::properties::larger_resources_and_faster_links_do_not_reduce_request_size10 ms
- ✓Maximum timeout and wall clock boundaries do not panic 512 casesscaling::properties::maximum_timeout_and_wall_clock_boundaries_do_not_panic9 ms
- ✓Progress histories survive clock jumps and extreme counters 512 casesscaling::properties::progress_histories_survive_clock_jumps_and_extreme_counters52 ms
- ✓Request sizes remain bounded across numeric inputs 512 casesscaling::properties::request_sizes_remain_bounded_across_numeric_inputs11 ms
- ✓Stopped and backwards clocks cannot grow telemetry without bound 512 casesscaling::properties::stopped_and_backwards_clocks_cannot_grow_telemetry_without_bound9 ms
- ✓Timeout bounds hold for extreme measurements 512 casesscaling::properties::timeout_bounds_hold_for_extreme_measurements9 ms
engine::scanner1408.4 s
- ✓Every sql failure in reconcile now is recovered fromscanner::tests::every_sql_failure_in_reconcile_now_is_recovered_from729 ms
- ✓A backend losing its wallets behind a router costs only its storesscanner::tests::a_backend_losing_its_wallets_behind_a_router_costs_only_its_stores28 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_them30 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_gap32 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_tick31 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_block8 ms
- ✓A chunk stops at what remainsscanner::tests::a_chunk_stops_at_what_remains7 ms
- ✓A coinbase input has no key imagescanner::tests::a_coinbase_input_has_no_key_image9 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_spend33 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_window33 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_detection34 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_lagging34 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_to29 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_once32 ms
- ✓A failed fetch halves the next onescanner::tests::a_failed_fetch_halves_the_next_one8 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_pool35 ms
- ✓A failed mempool scan is retried next tickscanner::tests::a_failed_mempool_scan_is_retried_next_tick36 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_it36 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_blocks50 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_on34 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_cause36 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_at33 ms
- ✓A key image lookup failing mid reconciliation leaves the reorg detectablescanner::tests::a_key_image_lookup_failing_mid_reconciliation_leaves_the_reorg_detectable34 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_mempool39 ms
- ✓A larger average block asks for fewer blocksscanner::tests::a_larger_average_block_asks_for_fewer_blocks8 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_up43 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_gap39 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_alone40 ms
- ✓A new tenant starts at its networks scanned heightscanner::tests::a_new_tenant_starts_at_its_networks_scanned_height28 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_tick38 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_fallback34 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_matched29 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_spent32 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_expiring34 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_lookup43 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_one32 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_period35 ms
- ✓A reconciliation that fails partway leaves the reorg still detectablescanner::tests::a_reconciliation_that_fails_partway_leaves_the_reorg_still_detectable33 ms
- ✓A registration that loses the race is removedscanner::tests::a_registration_that_loses_the_race_is_removed29 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_ran36 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_alone33 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_one34 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_covers56 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_everyone46 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_intact35 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_block35 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_to11 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_tick32 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_payment32 ms
- ✓A scan state runs the tuning it was givenscanner::tests::a_scan_state_runs_the_tuning_it_was_given40 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_call9 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_lost35 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_matches36 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_alone30 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_tick37 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_it34 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_normally34 ms
- ✓A tenant with nothing in scope is never reported as laggingscanner::tests::a_tenant_with_nothing_in_scope_is_never_reported_as_lagging32 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_up40 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_are35 ms
- ✓A third transaction claiming the same inputs keeps the original voidedscanner::tests::a_third_transaction_claiming_the_same_inputs_keeps_the_original_voided32 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_discard31 ms
- ✓A time locked output is not creditedscanner::tests::a_time_locked_output_is_not_credited31 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_pays9 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_failure9 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_wallet31 ms
- ✓A void restored while rechecked is not restored twicescanner::tests::a_void_restored_while_rechecked_is_not_restored_twice35 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_to35 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_block37 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_chain34 ms
- ✓A voided payment keeps no height from the block it lostscanner::tests::a_voided_payment_keeps_no_height_from_the_block_it_lost29 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_involved34 ms
- ✓After a reorg the replacement blocks are forward scanned againscanner::tests::after_a_reorg_the_replacement_blocks_are_forward_scanned_again34 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_unrecorded27 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_boundary33 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_arriving34 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_twice36 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_zero27 ms
- ✓An undecryptable amount is neither recorded nor stagedscanner::tests::an_undecryptable_amount_is_neither_recorded_nor_staged27 ms
- ✓An unchanged mempool is neither fetched nor scanned againscanner::tests::an_unchanged_mempool_is_neither_fetched_nor_scanned_again40 ms
- ✓An unpaid lagging tenants order expires once it has caught upscanner::tests::an_unpaid_lagging_tenants_order_expires_once_it_has_caught_up34 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_nothing29 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_event33 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_since33 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_it36 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_earlier44 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_state30 ms
- ✓Every order event carries a stable event id and a timestampscanner::tests::every_order_event_carries_a_stable_event_id_and_a_timestamp34 ms
- ✓Failed registrations are counted and logged oncescanner::tests::failed_registrations_are_counted_and_logged_once29 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_reorg40 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_window37 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_serve34 ms
- ✓Hung registrations are counted and the pass is boundedscanner::tests::hung_registrations_are_counted_and_the_pass_is_bounded30 ms
- ✓Keys that failed to register are registered by the retryscanner::tests::keys_that_failed_to_register_are_registered_by_the_retry29 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_scope63 ms
- ✓Malformed or empty stored key images never restore a voidscanner::tests::malformed_or_empty_stored_key_images_never_restore_a_void47 ms
- ✓No reorg when hashes still match is a cheap no opscanner::tests::no_reorg_when_hashes_still_match_is_a_cheap_no_op31 ms
- ✓Node disagreement never restores a voidscanner::tests::node_disagreement_never_restores_a_void39 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_network29 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_later46 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_another41 ms
- ✓One transactions outputs are routed to whichever order owns each indexscanner::tests::one_transactions_outputs_are_routed_to_whichever_order_owns_each_index30 ms
- ✓Only tenants with nothing in scope move without a scanscanner::tests::only_tenants_with_nothing_in_scope_move_without_a_scan29 ms
- ✓Rapidly alternating chain tips never lose or double count a paymentscanner::tests::rapidly_alternating_chain_tips_never_lose_or_double_count_a_payment62 ms
- ✓Registration carries on when the state check fails or hangsscanner::tests::registration_carries_on_when_the_state_check_fails_or_hangs30 ms
- ✓Registration that cannot list stores is retriedscanner::tests::registration_that_cannot_list_stores_is_retried29 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_voiding32 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_event833 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_spend32 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_void34 ms
- ✓Rescanning the same mempool tx does not duplicate the paymentscanner::tests::rescanning_the_same_mempool_tx_does_not_duplicate_the_payment32 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_blocks42 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_event34 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_orders33 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_list36 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_history31 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_settles36 ms
- ✓Run scan ticks future is sendscanner::tests::run_scan_ticks_future_is_send29 ms
- ✓Scanning a mempool tx records a payment against the right orderscanner::tests::scanning_a_mempool_tx_records_a_payment_against_the_right_order35 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_summed37 ms
- ✓Short key image answers leave a void alonescanner::tests::short_key_image_answers_leave_a_void_alone38 ms
- ✓Staging skips unknown indices and reports write failuresscanner::tests::staging_skips_unknown_indices_and_reports_write_failures30 ms
- ✓Stored key image evidence must be parseable and nonemptyscanner::tests::stored_key_image_evidence_must_be_parseable_and_nonempty8 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_again31 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_reorg38 ms
- ✓Tenants lagging at the same cursor share one block fetchscanner::tests::tenants_lagging_at_the_same_cursor_share_one_block_fetch44 ms
- ✓The entry points refuse an unknown networkscanner::tests::the_entry_points_refuse_an_unknown_network29 ms
- ✓The scanned block window stays bounded as the chain growsscanner::tests::the_scanned_block_window_stays_bounded_as_the_chain_grows86 ms
- ✓The transaction variants these tests are built from are genuinely distinctscanner::tests::the_transaction_variants_these_tests_are_built_from_are_genuinely_distinct33 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_be40 ms
- ✓The void recheck does nothing while the chain height is unreachablescanner::tests::the_void_recheck_does_nothing_while_the_chain_height_is_unreachable35 ms
- ✓The void recheck ignores a void outside the recheck windowscanner::tests::the_void_recheck_ignores_a_void_outside_the_recheck_window36 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_it23 ms
- ✓The void recheck leaves a still supported void alonescanner::tests::the_void_recheck_leaves_a_still_supported_void_alone26 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_evidence25 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_alpha6 ms
- ✓Voiding one of an orders two payments leaves the other countingscanner::tests::voiding_one_of_an_orders_two_payments_leaves_the_other_counting22 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_once19 ms
- ✓Random outages and reorgs never lose or duplicate a paymentscanner::tests::random_outages_and_reorgs_never_lose_or_duplicate_a_payment1.3 s
- ✓Tenants are scanned concurrently not one after anotherscanner::tests::tenants_are_scanned_concurrently_not_one_after_another1.1 s
engine::scanner::paging_tests213 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_link7 ms
- ✓A page is sized by memory link and cpuscanner::paging_tests::a_page_is_sized_by_memory_link_and_cpu6 ms
engine::scanner_status318 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_history6 ms
- ✓Different networks are tracked independentlyscanner_status::tests::different_networks_are_tracked_independently6 ms
- ✓Record tick tracks success then failure then success correctlyscanner_status::tests::record_tick_tracks_success_then_failure_then_success_correctly6 ms
engine::status1998 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_confirming6 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_alone5 ms
- ✓A zero conf order stays paid once its transaction is minedstatus::tests::a_zero_conf_order_stays_paid_once_its_transaction_is_mined6 ms
- ✓Amounts that would overflow saturate instead of wrappingstatus::tests::amounts_that_would_overflow_saturate_instead_of_wrapping5 ms
- ✓Full amount all zero conf with a nonzero threshold is unconfirmedstatus::tests::full_amount_all_zero_conf_with_a_nonzero_threshold_is_unconfirmed5 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_immediately5 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_unconfirmed5 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_paid5 ms
- ✓Min confirmations exactly at threshold is paidstatus::tests::min_confirmations_exactly_at_threshold_is_paid5 ms
- ✓Min confirmations one below threshold is confirmingstatus::tests::min_confirmations_one_below_threshold_is_confirming5 ms
- ✓Multi payment one voided leaves partialstatus::tests::multi_payment_one_voided_leaves_partial5 ms
- ✓Multi payment voiding one still leaves enough stays paidstatus::tests::multi_payment_voiding_one_still_leaves_enough_stays_paid5 ms
- ✓No payments after expiry is expiredstatus::tests::no_payments_after_expiry_is_expired5 ms
- ✓No payments before expiry is pendingstatus::tests::no_payments_before_expiry_is_pending6 ms
- ✓Overpaid all zero conf with confirmations required zero is overpaid immediatelystatus::tests::overpaid_all_zero_conf_with_confirmations_required_zero_is_overpaid_immediately5 ms
- ✓Overpaid confirmedstatus::tests::overpaid_confirmed5 ms
- ✓Partial payment after expiry is expired not partialstatus::tests::partial_payment_after_expiry_is_expired_not_partial5 ms
- ✓Partial payment before expiry is partial regardless of confirmation depthstatus::tests::partial_payment_before_expiry_is_partial_regardless_of_confirmation_depth5 ms
- ✓The covering set is the deepest payments that reach the amountstatus::tests::the_covering_set_is_the_deepest_payments_that_reach_the_amount5 ms
engine::status::properties20390 ms
- ✓Adding payments cannot undo settlementstatus::properties::adding_payments_cannot_undo_settlement21 ms
- ✓Agrees with aggregate specificationstatus::properties::agrees_with_aggregate_specification15 ms
- ✓Expiry is strictly after the deadlinestatus::properties::expiry_is_strictly_after_the_deadline8 ms
- ✓Funded orders are independent of the clockstatus::properties::funded_orders_are_independent_of_the_clock15 ms
- ✓Fuzz histories match status specificationstatus::properties::fuzz_histories_match_status_specification55 ms
- ✓Increasing mined confirmations preserves settlementstatus::properties::increasing_mined_confirmations_preserves_settlement24 ms
- ✓Payment order does not change statusstatus::properties::payment_order_does_not_change_status25 ms
- ✓Reviewed status fuzz seeds replaystatus::properties::reviewed_status_fuzz_seeds_replay13 ms
- ✓Splitting a payment with the same evidence preserves statusstatus::properties::splitting_a_payment_with_the_same_evidence_preserves_status21 ms
- ✓Status decision boundaries match independent gridstatus::properties::status_decision_boundaries_match_independent_grid7 ms
- ✓Adding payments cannot undo settlement 512 casesstatus::properties::adding_payments_cannot_undo_settlement26 ms
- ✓Agrees with aggregate specification 512 casesstatus::properties::agrees_with_aggregate_specification19 ms
- ✓Expiry is strictly after the deadline 512 casesstatus::properties::expiry_is_strictly_after_the_deadline9 ms
- ✓Funded orders are independent of the clock 512 casesstatus::properties::funded_orders_are_independent_of_the_clock19 ms
- ✓Fuzz histories match status specification 512 casesstatus::properties::fuzz_histories_match_status_specification38 ms
- ✓Increasing mined confirmations preserves settlement 512 casesstatus::properties::increasing_mined_confirmations_preserves_settlement19 ms
- ✓Payment order does not change status 512 casesstatus::properties::payment_order_does_not_change_status20 ms
- ✓Reviewed status fuzz seeds replay 512 casesstatus::properties::reviewed_status_fuzz_seeds_replay8 ms
- ✓Splitting a payment with the same evidence preserves status 512 casesstatus::properties::splitting_a_payment_with_the_same_evidence_preserves_status19 ms
- ✓Status decision boundaries match independent grid 512 casesstatus::properties::status_decision_boundaries_match_independent_grid9 ms
engine::work8648.2 s
- ✓Every sql failure while a payment confirms is recovered fromwork::tests::every_sql_failure_while_a_payment_confirms_is_recovered_from12.0 s
- ✓Every sql failure in a void recheck is recovered fromwork::tests::every_sql_failure_in_a_void_recheck_is_recovered_from651 ms
- ✓Every sql failure while a double spend is found is recovered fromwork::tests::every_sql_failure_while_a_double_spend_is_found_is_recovered_from2.1 s
- ✓Every sql failure during a reorg is recovered fromwork::tests::every_sql_failure_during_a_reorg_is_recovered_from4.6 s
- ✓Every sql failure committing a checkpointed block is recovered fromwork::tests::every_sql_failure_committing_a_checkpointed_block_is_recovered_from5.4 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_from1.7 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_from3.2 s
- ✓Every sql failure working a reorg job is recovered fromwork::tests::every_sql_failure_working_a_reorg_job_is_recovered_from1.4 s
- ✓Every sql failure while seeding is recovered fromwork::tests::every_sql_failure_while_seeding_is_recovered_from3.3 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_from4.1 s
- ✓Every sql failure while a payment is mined is recovered fromwork::tests::every_sql_failure_while_a_payment_is_mined_is_recovered_from4.0 s
- ✓A block request gets the time its link needswork::tests::a_block_request_gets_the_time_its_link_needs36 ms
- ✓A call the node never answers fails at the deadlinework::tests::a_call_the_node_never_answers_fails_at_the_deadline10 ms
- ✓A candidate deleted mid page is skippedwork::tests::a_candidate_deleted_mid_page_is_skipped29 ms
- ✓A big group resumes each store from its own placework::tests::a_big_group_resumes_each_store_from_its_own_place106 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_found112 ms
- ✓A candidate the node never answers about is given up onwork::tests::a_candidate_the_node_never_answers_about_is_given_up_on28 ms
- ✓A cursor moved mid scan keeps what moved itwork::tests::a_cursor_moved_mid_scan_keeps_what_moved_it34 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_whole67 ms
- ✓A failing node is asked once a round about reorg candidateswork::tests::a_failing_node_is_asked_once_a_round_about_reorg_candidates39 ms
- ✓A failed page keeps the pages before itwork::tests::a_failed_page_keeps_the_pages_before_it78 ms
- ✓A failing store is tried once per pass then waitswork::tests::a_failing_store_is_tried_once_per_pass_then_waits37 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_restarts225 ms
- ✓A failing tenant backs off without holding up the otherswork::tests::a_failing_tenant_backs_off_without_holding_up_the_others51 ms
- ✓A fast pass that cannot load windows tries again next passwork::tests::a_fast_pass_that_cannot_load_windows_tries_again_next_pass35 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_slices163 ms
- ✓A fast pass with no store in scope does nothingwork::tests::a_fast_pass_with_no_store_in_scope_does_nothing28 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_down8 ms
- ✓A fork not yet opened stops the frontier instead of spinningwork::tests::a_fork_not_yet_opened_stops_the_frontier_instead_of_spinning36 ms
- ✓A group with nobody to scan fetches nothingwork::tests::a_group_with_nobody_to_scan_fetches_nothing31 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_round34 ms
- ✓A node that returns no block is waited outwork::tests::a_node_that_returns_no_block_is_waited_out32 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_off38 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_block36 ms
- ✓A recorded chain changed mid scan stops the commitwork::tests::a_recorded_chain_changed_mid_scan_stops_the_commit35 ms
- ✓A recompute page fills with due orders up to its sizework::tests::a_recompute_page_fills_with_due_orders_up_to_its_size78 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_time107 ms
- ✓A reorg job with every candidate waiting waitswork::tests::a_reorg_job_with_every_candidate_waiting_waits35 ms
- ✓A reorg moves a superseded payment without restoring itwork::tests::a_reorg_moves_a_superseded_payment_without_restoring_it38 ms
- ✓A reorg page with no time left does one candidatework::tests::a_reorg_page_with_no_time_left_does_one_candidate29 ms
- ✓A reorged payment the node cannot find never settles its orderwork::tests::a_reorged_payment_the_node_cannot_find_never_settles_its_order46 ms
- ✓A rescanned branch anchor pruned before detection is forgottenwork::tests::a_rescanned_branch_anchor_pruned_before_detection_is_forgotten30 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_status13 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_pool34 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_it154 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_chain52 ms
- ✓A snapshot after the paid story shows where it endedwork::tests::a_snapshot_after_the_paid_story_shows_where_it_ended59 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_again53 ms
- ✓A store far behind does not hold every catch up turnwork::tests::a_store_far_behind_does_not_hold_every_catch_up_turn39 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_round42 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_on34 ms
- ✓A tip replaced after it was fetched leaves no phantom paymentwork::tests::a_tip_replaced_after_it_was_fetched_leaves_no_phantom_payment45 ms
- ✓A vanished check the node fails or stalls is retriedwork::tests::a_vanished_check_the_node_fails_or_stalls_is_retried34 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_completes175 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_left32 ms
- ✓A void restored meanwhile still gets its new heightwork::tests::a_void_restored_meanwhile_still_gets_its_new_height29 ms
- ✓A group larger than a page moves togetherwork::tests::a_group_larger_than_a_page_moves_together507 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_rounds60 ms
- ✓Backoff forgets keys that stopped failingwork::tests::backoff_forgets_keys_that_stopped_failing8 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_expiry35 ms
- ✓Blocks are kept only for the node they came fromwork::tests::blocks_are_kept_only_for_the_node_they_came_from32 ms
- ✓Catch up gets turns while the frontier is far behindwork::tests::catch_up_gets_turns_while_the_frontier_is_far_behind41 ms
- ✓An empty frontier keeps its turn when catch up cannot movework::tests::an_empty_frontier_keeps_its_turn_when_catch_up_cannot_move101 ms
- ✓Catching up below the recorded history records nothing for the networkwork::tests::catching_up_below_the_recorded_history_records_nothing_for_the_network36 ms
- ✓Catching up onto a replaced recorded block waitswork::tests::catching_up_onto_a_replaced_recorded_block_waits33 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_scan94 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_again123 ms
- ✓More recomputes owed than a page are all donework::tests::more_recomputes_owed_than_a_page_are_all_done59 ms
- ✓Nothing is fetched for a store whose keys are not registeredwork::tests::nothing_is_fetched_for_a_store_whose_keys_are_not_registered39 ms
- ✓Nothing is kept across a rewindwork::tests::nothing_is_kept_across_a_rewind54 ms
- ✓One failing recompute does not hold up the otherswork::tests::one_failing_recompute_does_not_hold_up_the_others34 ms
- ✓Pool transactions gone before their bodies came are moved pastwork::tests::pool_transactions_gone_before_their_bodies_came_are_moved_past33 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_not32 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_scope38 ms
- ✓The activity record tells the paid story in orderwork::tests::the_activity_record_tells_the_paid_story_in_order69 ms
- ✓The fast path reports an unreadable poolwork::tests::the_fast_path_reports_an_unreadable_pool36 ms
- ✓The fast path settles a new pool payment at oncework::tests::the_fast_path_settles_a_new_pool_payment_at_once30 ms
- ✓The fast path uses the last rounds chain heightwork::tests::the_fast_path_uses_the_last_rounds_chain_height34 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_used43 ms
- ✓Tiers and wait reasons display distinctlywork::tests::tiers_and_wait_reasons_display_distinctly13 ms
- ✓Upkeep prunes order events older than the retentionwork::tests::upkeep_prunes_order_events_older_than_the_retention37 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_spare34 ms
- ✓Turns alternate while the frontier has a store to scanwork::tests::turns_alternate_while_the_frontier_has_a_store_to_scan100 ms
- ✓With no time at all every tier with work still advanceswork::tests::with_no_time_at_all_every_tier_with_work_still_advances58 ms
- ✓Every store is scanned when there are more than a pagework::tests::every_store_is_scanned_when_there_are_more_than_a_page579 ms
- ✓The fast path defers what its budget does not coverwork::tests::the_fast_path_defers_what_its_budget_does_not_cover900 ms
engine::work::blocks558 ms
- ✓A block near the paging size turns headers first onwork::blocks::tests::a_block_near_the_paging_size_turns_headers_first_on6 ms
- ✓The block cache evicts scanned blocks before the restwork::blocks::tests::the_block_cache_evicts_scanned_blocks_before_the_rest11 ms
- ✓A round without a paged block gets the basework::blocks::tests::a_round_without_a_paged_block_gets_the_base12 ms
- ✓The block cache keeps count and evicts the farthest firstwork::blocks::tests::the_block_cache_keeps_count_and_evicts_the_farthest_first7 ms
- ✓A round resumes the cache within todays budgetwork::blocks::tests::a_round_resumes_the_cache_within_todays_budget22 ms
engine::work::blocks::properties64.9 s
- ✓Accepted block effects recheck durable prerequisiteswork::blocks::properties::accepted_block_effects_recheck_durable_prerequisites390 ms
- ✓Cache histories preserve accounting and protected blockswork::blocks::properties::cache_histories_preserve_accounting_and_protected_blocks14 ms
- ✓Every late commit boundary is exercised with and without stagingwork::blocks::properties::every_late_commit_boundary_is_exercised_with_and_without_staging154 ms
- ✓Cache histories preserve accounting and protected blocks 512 caseswork::blocks::properties::cache_histories_preserve_accounting_and_protected_blocks21 ms
- ✓Every late commit boundary is exercised with and without staging 512 caseswork::blocks::properties::every_late_commit_boundary_is_exercised_with_and_without_staging220 ms
- ✓Accepted block effects recheck durable prerequisites 512 caseswork::blocks::properties::accepted_block_effects_recheck_durable_prerequisites4.1 s
engine::work::blocks::scale131 ms
- ✓Thousands of cached headers obey the budget and anchor exceptionwork::blocks::scale::thousands_of_cached_headers_obey_the_budget_and_anchor_exception31 ms
engine::work::chain::decide_tests16 ms
- ✓Reconciliation follows the transaction and voids only on proofwork::chain::decide_tests::reconciliation_follows_the_transaction_and_voids_only_on_proof6 ms
engine::work::mempool212 ms
- ✓Arrivals join behind waiting transactionswork::mempool::tests::arrivals_join_behind_waiting_transactions6 ms
- ✓Remembered bodies stop at the count or byte capwork::mempool::tests::remembered_bodies_stop_at_the_count_or_byte_cap6 ms
engine::work::mempool::properties3222.8 s
- ✓A completion for another window cannot publish or release its ownerwork::mempool::properties::a_completion_for_another_window_cannot_publish_or_release_its_owner8 ms
- ✓Both entry points cover owner success and cancellationwork::mempool::properties::both_entry_points_cover_owner_success_and_cancellation74 ms
- ✓Cache accounting obeys full width budgetswork::mempool::properties::cache_accounting_obeys_full_width_budgets12 ms
- ✓Competing scans release on success failure and cancellationwork::mempool::properties::competing_scans_release_on_success_failure_and_cancellation57 ms
- ✓Every mixed batch failure boundary runs in both orderswork::mempool::properties::every_mixed_batch_failure_boundary_runs_in_both_orders108 ms
- ✓Batch reservations and cache historieswork::mempool::properties::batch_reservations_and_cache_histories890 ms
- ✓Overlapping thread batches have exactly one owner per keywork::mempool::properties::overlapping_thread_batches_have_exactly_one_owner_per_key53 ms
- ✓Ownership survives pool eviction and serializes changed windowswork::mempool::properties::ownership_survives_pool_eviction_and_serializes_changed_windows7 ms
- ✓Partially completed batches and panics release only unfinished workwork::mempool::properties::partially_completed_batches_and_panics_release_only_unfinished_work7 ms
- ✓Mixed tenant success failure and empty matches retry independentlywork::mempool::properties::mixed_tenant_success_failure_and_empty_matches_retry_independently512 ms
- ✓Reservation decision grid checks completed busy and changed windowswork::mempool::properties::reservation_decision_grid_checks_completed_busy_and_changed_windows7 ms
- ✓Reservation histories match independent ownershipwork::mempool::properties::reservation_histories_match_independent_ownership15 ms
- ✓Reviewed fuzz histories remain valid regressionswork::mempool::properties::reviewed_fuzz_histories_remain_valid_regressions8 ms
- ✓Simultaneous threads cannot both reserve the same scanwork::mempool::properties::simultaneous_threads_cannot_both_reserve_the_same_scan8 ms
- ✓Unrelated transactions and tenants are not serializedwork::mempool::properties::unrelated_transactions_and_tenants_are_not_serialized7 ms
- ✓Real fast and round callers share reservationswork::mempool::properties::real_fast_and_round_callers_share_reservations857 ms
- ✓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
- ✓Both entry points cover owner success and cancellation 512 caseswork::mempool::properties::both_entry_points_cover_owner_success_and_cancellation112 ms
- ✓Cache accounting obeys full width budgets 512 caseswork::mempool::properties::cache_accounting_obeys_full_width_budgets25 ms
- ✓Competing scans release on success failure and cancellation 512 caseswork::mempool::properties::competing_scans_release_on_success_failure_and_cancellation89 ms
- ✓Every mixed batch failure boundary runs in both orders 512 caseswork::mempool::properties::every_mixed_batch_failure_boundary_runs_in_both_orders152 ms
- ✓Batch reservations and cache histories 512 caseswork::mempool::properties::batch_reservations_and_cache_histories3.1 s
- ✓Overlapping thread batches have exactly one owner per key 512 caseswork::mempool::properties::overlapping_thread_batches_have_exactly_one_owner_per_key755 ms
- ✓Ownership survives pool eviction and serializes changed windows 512 caseswork::mempool::properties::ownership_survives_pool_eviction_and_serializes_changed_windows11 ms
- ✓Partially completed batches and panics release only unfinished work 512 caseswork::mempool::properties::partially_completed_batches_and_panics_release_only_unfinished_work10 ms
- ✓Mixed tenant success failure and empty matches retry independently 512 caseswork::mempool::properties::mixed_tenant_success_failure_and_empty_matches_retry_independently5.7 s
- ✓Reservation decision grid checks completed busy and changed windows 512 caseswork::mempool::properties::reservation_decision_grid_checks_completed_busy_and_changed_windows8 ms
- ✓Reservation histories match independent ownership 512 caseswork::mempool::properties::reservation_histories_match_independent_ownership62 ms
- ✓Reviewed fuzz histories remain valid regressions 512 caseswork::mempool::properties::reviewed_fuzz_histories_remain_valid_regressions9 ms
- ✓Simultaneous threads cannot both reserve the same scan 512 caseswork::mempool::properties::simultaneous_threads_cannot_both_reserve_the_same_scan9 ms
- ✓Unrelated transactions and tenants are not serialized 512 caseswork::mempool::properties::unrelated_transactions_and_tenants_are_not_serialized8 ms
- ✓Real fast and round callers share reservations 512 caseswork::mempool::properties::real_fast_and_round_callers_share_reservations10.1 s
engine::work::mempool::properties::scale124 min
- ✓Arrivals cannot increase existing work waitwork::mempool::properties::scale::arrivals_cannot_increase_existing_work_wait610 ms
- ✓Expanded windows are served during continuous new transaction floodswork::mempool::properties::scale::expanded_windows_are_served_during_continuous_new_transaction_floods2.5 s
- ✓Production body caps reject overflow and reuse freed spacework::mempool::properties::scale::production_body_caps_reject_overflow_and_reuse_freed_space467 ms
- ✓Transaction cursors cannot be shared between three transactionswork::mempool::properties::scale::transaction_cursors_cannot_be_shared_between_three_transactions803 ms
- ✓Parallel pool backlogs recover and release cachework::mempool::properties::scale::parallel_pool_backlogs_recover_and_release_cache5.6 s
- ✓Each transaction visits each tenant independentlywork::mempool::properties::scale::each_transaction_visits_each_tenant_independently18.3 s
- ✓Arrivals cannot increase existing work wait 512 caseswork::mempool::properties::scale::arrivals_cannot_increase_existing_work_wait1.7 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_floods2.6 s
- ✓Parallel pool backlogs recover and release cache 512 caseswork::mempool::properties::scale::parallel_pool_backlogs_recover_and_release_cache46.1 s
- ✓Production body caps reject overflow and reuse freed space 512 caseswork::mempool::properties::scale::production_body_caps_reject_overflow_and_reuse_freed_space120 ms
- ✓Transaction cursors cannot be shared between three transactions 512 caseswork::mempool::properties::scale::transaction_cursors_cannot_be_shared_between_three_transactions603 ms
engine::work::properties488 min
- ✓Every recorded ringct variant runs complete money historieswork::tests::properties::every_recorded_ringct_variant_runs_complete_money_histories12.3 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_height74 ms
- ✓A payment block dropped by a shorter chain unconfirms the paymentwork::tests::properties::a_payment_block_dropped_by_a_shorter_chain_unconfirms_the_payment61 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_order104 ms
- ✓A second fork after reconciliation cannot keep a discarded payment heightwork::tests::properties::a_second_fork_after_reconciliation_cannot_keep_a_discarded_payment_height68 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_unchanged64 ms
- ✓A shorter branch reopens a settled payment below the forkwork::tests::properties::a_shorter_branch_reopens_a_settled_payment_below_the_fork72 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_failure66 ms
- ✓A shorter tip above scanned history recomputes depth after restartwork::tests::properties::a_shorter_tip_above_scanned_history_recomputes_depth_after_restart113 ms
- ✓Combined portfolio interactions have fixed positive controlswork::tests::properties::combined_portfolio_interactions_have_fixed_positive_controls1.3 s
- ✓An interrupted block replaced by a fork never leaks staged paymentswork::tests::properties::an_interrupted_block_replaced_by_a_fork_never_leaks_staged_payments2.3 s
- ✓Coverage guided histories recover with real scannerwork::tests::properties::coverage_guided_histories_recover_with_real_scanner6.4 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_restart5.3 s
- ✓Portfolio composes arrival extension reorg proof expiry and faultswork::tests::properties::portfolio_composes_arrival_extension_reorg_proof_expiry_and_faults394 ms
- ✓Portfolio reorg retains pending settlement until branch is provenwork::tests::properties::portfolio_reorg_retains_pending_settlement_until_branch_is_proven480 ms
- ✓Portfolio reports selected applied and skipped commands separatelywork::tests::properties::portfolio_reports_selected_applied_and_skipped_commands_separately122 ms
- ✓Recorded ringct shapes and recipient expectations are frozenwork::tests::properties::recorded_ringct_shapes_and_recipient_expectations_are_frozen29 ms
- ✓Portfolio selects every sql operation class and positionwork::tests::properties::portfolio_selects_every_sql_operation_class_and_position928 ms
- ✓Reviewed engine history seeds replaywork::tests::properties::reviewed_engine_history_seeds_replay807 ms
- ✓Reviewed portfolio seeds are the encoded reviewed scenarioswork::tests::properties::reviewed_portfolio_seeds_are_the_encoded_reviewed_scenarios9 ms
- ✓Replacement chains of different lengths recompute payment depthwork::tests::properties::replacement_chains_of_different_lengths_recompute_payment_depth3.7 s
- ✓Reorg jobs survive outages and restore payments when evidence changeswork::tests::properties::reorg_jobs_survive_outages_and_restore_payments_when_evidence_changes5.1 s
- ✓Scanner histories converge after reorgs failures and restartswork::tests::properties::scanner_histories_converge_after_reorgs_failures_and_restarts6.0 s
- ✓Portfolio histories match independent ledgerwork::tests::properties::portfolio_histories_match_independent_ledger12.0 s
- ✓Every recorded ringct variant runs complete money histories 512 caseswork::tests::properties::every_recorded_ringct_variant_runs_complete_money_histories15.3 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_height103 ms
- ✓A payment block dropped by a shorter chain unconfirms the payment 512 caseswork::tests::properties::a_payment_block_dropped_by_a_shorter_chain_unconfirms_the_payment92 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_order161 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_height101 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_unchanged95 ms
- ✓A shorter branch reopens a settled payment below the fork 512 caseswork::tests::properties::a_shorter_branch_reopens_a_settled_payment_below_the_fork102 ms
- ✓A shorter tip above scanned history recomputes depth after restart 512 caseswork::tests::properties::a_shorter_tip_above_scanned_history_recomputes_depth_after_restart127 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_failure100 ms
- ✓Combined portfolio interactions have fixed positive controls 512 caseswork::tests::properties::combined_portfolio_interactions_have_fixed_positive_controls1.9 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_payments23.6 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_restart50.0 s
- ✓Coverage guided histories recover with real scanner 512 caseswork::tests::properties::coverage_guided_histories_recover_with_real_scanner1 min
- ✓Portfolio composes arrival extension reorg proof expiry and faults 512 caseswork::tests::properties::portfolio_composes_arrival_extension_reorg_proof_expiry_and_faults552 ms
- ✓Portfolio reorg retains pending settlement until branch is proven 512 caseswork::tests::properties::portfolio_reorg_retains_pending_settlement_until_branch_is_proven687 ms
- ✓Portfolio reports selected applied and skipped commands separately 512 caseswork::tests::properties::portfolio_reports_selected_applied_and_skipped_commands_separately185 ms
- ✓Portfolio selects every sql operation class and position 512 caseswork::tests::properties::portfolio_selects_every_sql_operation_class_and_position1.3 s
- ✓Recorded ringct shapes and recipient expectations are frozen 512 caseswork::tests::properties::recorded_ringct_shapes_and_recipient_expectations_are_frozen58 ms
- ✓Reorg jobs survive outages and restore payments when evidence changes 512 caseswork::tests::properties::reorg_jobs_survive_outages_and_restore_payments_when_evidence_changes50.6 s
- ✓Reviewed engine history seeds replay 512 caseswork::tests::properties::reviewed_engine_history_seeds_replay1.1 s
- ✓Reviewed portfolio seeds are the encoded reviewed scenarios 512 caseswork::tests::properties::reviewed_portfolio_seeds_are_the_encoded_reviewed_scenarios11 ms
- ✓Replacement chains of different lengths recompute payment depth 512 caseswork::tests::properties::replacement_chains_of_different_lengths_recompute_payment_depth39.7 s
- ✓Portfolio histories match independent ledger 512 caseswork::tests::properties::portfolio_histories_match_independent_ledger2 min
- ✓Scanner histories converge after reorgs failures and restarts 512 caseswork::tests::properties::scanner_histories_converge_after_reorgs_failures_and_restarts57.1 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.0 s
- ✓Proof config and generation histories preserve settlementwork::tests::properties::concurrency::proof_config_and_generation_histories_preserve_settlement2.1 s
- ✓Combined worker histories preserve moneywork::tests::properties::concurrency::combined_worker_histories_preserve_money5.0 s
- ✓Every proof config shutdown admission schedule recoverswork::tests::properties::concurrency::every_proof_config_shutdown_admission_schedule_recovers4.8 s
- ✓Every overlap admission order and abandoned caller recovers 512 caseswork::tests::properties::concurrency::every_overlap_admission_order_and_abandoned_caller_recovers1.3 s
- ✓Every proof config shutdown admission schedule recovers 512 caseswork::tests::properties::concurrency::every_proof_config_shutdown_admission_schedule_recovers6.6 s
- ✓Proof config and generation histories preserve settlement 512 caseswork::tests::properties::concurrency::proof_config_and_generation_histories_preserve_settlement23.3 s
- ✓Combined worker histories preserve money 512 caseswork::tests::properties::concurrency::combined_worker_histories_preserve_money52.5 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_chains3.2 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_limit3.3 s
- ✓Genesis divergence recovers through generated failures and restartswork::tests::properties::lifecycle::genesis_divergence_recovers_through_generated_failures_and_restarts2.9 s
- ✓Bootstrap histories recover from empty short and unservable chains 512 caseswork::tests::properties::lifecycle::bootstrap_histories_recover_from_empty_short_and_unservable_chains32.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_limit37.1 s
- ✓Genesis divergence recovers through generated failures and restarts 512 caseswork::tests::properties::lifecycle::genesis_divergence_recovers_through_generated_failures_and_restarts33.2 s
engine::work::properties::money348 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_winner78 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_page66 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_transaction1.3 s
- ✓Closed order grace boundary controls late pool scanningwork::tests::properties::money::closed_order_grace_boundary_controls_late_pool_scanning1.3 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_payment2.0 s
- ✓Distinct wallets cannot credit each others outputswork::tests::properties::money::distinct_wallets_cannot_credit_each_others_outputs2.1 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_credit4.4 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_policy2.6 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_restarts3.4 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_funds1.8 s
- ✓Missing or ambiguous evidence cannot void moneywork::tests::properties::money::missing_or_ambiguous_evidence_cannot_void_money1.6 s
- ✓Independent payments are routed and credited once across reorgswork::tests::properties::money::independent_payments_are_routed_and_credited_once_across_reorgs5.4 s
- ✓One networks rounds cannot scan or credit another networks orderswork::tests::properties::money::one_networks_rounds_cannot_scan_or_credit_another_networks_orders2.3 s
- ✓Late key registration cannot starve healthy catch up tenantswork::tests::properties::money::late_key_registration_cannot_starve_healthy_catch_up_tenants4.3 s
- ✓Settlement waits for verified depth and the payments attested blockwork::tests::properties::money::settlement_waits_for_verified_depth_and_the_payments_attested_block2.0 s
- ✓Transaction paging and fetch failures cannot credit unfinished blockswork::tests::properties::money::transaction_paging_and_fetch_failures_cannot_credit_unfinished_blocks3.1 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_reorgs4.3 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_transaction14.1 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_winner118 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_page90 ms
- ✓Closed order grace boundary controls late pool scanning 512 caseswork::tests::properties::money::closed_order_grace_boundary_controls_late_pool_scanning14.7 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_payment20.9 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_credit41.8 s
- ✓Distinct wallets cannot credit each others outputs 512 caseswork::tests::properties::money::distinct_wallets_cannot_credit_each_others_outputs22.6 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_policy29.3 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_restarts34.7 s
- ✓Independent payments are routed and credited once across reorgs 512 caseswork::tests::properties::money::independent_payments_are_routed_and_credited_once_across_reorgs58.1 s
- ✓Late key registration cannot starve healthy catch up tenants 512 caseswork::tests::properties::money::late_key_registration_cannot_starve_healthy_catch_up_tenants52.5 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_funds19.1 s
- ✓Missing or ambiguous evidence cannot void money 512 caseswork::tests::properties::money::missing_or_ambiguous_evidence_cannot_void_money17.3 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_orders25.6 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_block21.4 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_reorgs44.5 s
- ✓Transaction paging and fetch failures cannot credit unfinished blocks 512 caseswork::tests::properties::money::transaction_paging_and_fetch_failures_cannot_credit_unfinished_blocks27.4 s
engine::work::properties::money::expansions3018 min
- ✓An aggregate one piconero above the storage limit rolls backwork::tests::properties::money::expansions::an_aggregate_one_piconero_above_the_storage_limit_rolls_back34 ms
- ✓Crash process childwork::tests::properties::money::expansions::crash_process_child8 ms
- ✓Every worker crash boundary and the full recovery pipeline runwork::tests::properties::money::expansions::every_worker_crash_boundary_and_the_full_recovery_pipeline_run753 ms
- ✓Named money durability boundaries recover after process deathwork::tests::properties::money::expansions::named_money_durability_boundaries_recover_after_process_death467 ms
- ✓Oversized invoices do not consume an address or idempotency keywork::tests::properties::money::expansions::oversized_invoices_do_not_consume_an_address_or_idempotency_key730 ms
- ✓Process death during sqlite work recovers exactly once moneywork::tests::properties::money::expansions::process_death_during_sqlite_work_recovers_exactly_once_money3.0 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_once279 ms
- ✓Production worker crashes preserve atomic moneywork::tests::properties::money::expansions::production_worker_crashes_preserve_atomic_money4.6 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_outputs9.7 s
- ✓Repeated recovery process deaths preserve obligationswork::tests::properties::money::expansions::repeated_recovery_process_deaths_preserve_obligations9.9 s
- ✓Stored amount boundaries survive scanning mining and restartswork::tests::properties::money::expansions::stored_amount_boundaries_survive_scanning_mining_and_restarts2.3 s
- ✓Unrepresentable amounts fail without corrupting stored moneywork::tests::properties::money::expansions::unrepresentable_amounts_fail_without_corrupting_stored_money810 ms
- ✓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_outputs16.5 s
- ✓Repeated multi order forks faults and restarts preserve moneywork::tests::properties::money::expansions::repeated_multi_order_forks_faults_and_restarts_preserve_money16.6 s
- ✓Settlement queue wraparound recomputes every order oncework::tests::properties::money::expansions::settlement_queue_wraparound_recomputes_every_order_once11.1 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_back52 ms
- ✓Crash process child 512 caseswork::tests::properties::money::expansions::crash_process_child9 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_run833 ms
- ✓Named money durability boundaries recover after process death 512 caseswork::tests::properties::money::expansions::named_money_durability_boundaries_recover_after_process_death457 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_key6.0 s
- ✓Process death during sqlite work recovers exactly once money 512 caseswork::tests::properties::money::expansions::process_death_during_sqlite_work_recovers_exactly_once_money26.6 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_once488 ms
- ✓Production worker crashes preserve atomic money 512 caseswork::tests::properties::money::expansions::production_worker_crashes_preserve_atomic_money37.1 s
- ✓Repeated recovery process deaths preserve obligations 512 caseswork::tests::properties::money::expansions::repeated_recovery_process_deaths_preserve_obligations1 min
- ✓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
- ✓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_outputs4 min
- ✓Stored amount boundaries survive scanning mining and restarts 512 caseswork::tests::properties::money::expansions::stored_amount_boundaries_survive_scanning_mining_and_restarts20.7 s
- ✓Unrepresentable amounts fail without corrupting stored money 512 caseswork::tests::properties::money::expansions::unrepresentable_amounts_fail_without_corrupting_stored_money6.1 s
- ✓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_outputs5 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::nodes4230 min
- ✓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.0 s
- ✓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_fallback41 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_hangs9 ms
- ✓Corroborated locations preserve positive evidence and bound unreachable nodeswork::tests::properties::money::nodes::corroborated_locations_preserve_positive_evidence_and_bound_unreachable_nodes12 ms
- ✓Every malformed response shape is checked with a restartwork::tests::properties::money::nodes::every_malformed_response_shape_is_checked_with_a_restart378 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_node10 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_answers749 ms
- ✓Hanging peers do not discard healthy location or spent answerswork::tests::properties::money::nodes::hanging_peers_do_not_discard_healthy_location_or_spent_answers8 ms
- ✓Hanging secondary retracts double spends within the settlement budgetwork::tests::properties::money::nodes::hanging_secondary_retracts_double_spends_within_the_settlement_budget1.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_recovery2.3 s
- ✓False mining locations without block membership cannot unlock verified settlementwork::tests::properties::money::nodes::false_mining_locations_without_block_membership_cannot_unlock_verified_settlement2.9 s
- ✓Inflated tips and false attestations cannot bypass enabled verificationwork::tests::properties::money::nodes::inflated_tips_and_false_attestations_cannot_bypass_enabled_verification2.3 s
- ✓Malformed missing and reordered bodies never publish an unfinished blockwork::tests::properties::money::nodes::malformed_missing_and_reordered_bodies_never_publish_an_unfinished_block1.9 s
- ✓Omitted pool transactions delay detection without creating false paymentswork::tests::properties::money::nodes::omitted_pool_transactions_delay_detection_without_creating_false_payments1.3 s
- ✓Responses at transport deadline boundaries preserve failover and recoverywork::tests::properties::money::nodes::responses_at_transport_deadline_boundaries_preserve_failover_and_recovery11 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_limit107 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_restarts4.4 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_money2.7 s
- ✓Zero confirmation and unverified height trust boundaries are explicitwork::tests::properties::money::nodes::zero_confirmation_and_unverified_height_trust_boundaries_are_explicit1.3 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_restarts12.8 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_primary13.7 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_fallback67 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_answers6.1 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_hangs24 ms
- ✓Corroborated locations preserve positive evidence and bound unreachable nodes 512 caseswork::tests::properties::money::nodes::corroborated_locations_preserve_positive_evidence_and_bound_unreachable_nodes23 ms
- ✓Every malformed response shape is checked with a restart 512 caseswork::tests::properties::money::nodes::every_malformed_response_shape_is_checked_with_a_restart414 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_node23 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_returns18.2 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_answers9 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_settlement27.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_recovery20.1 s
- ✓Hanging secondary retracts double spends within the settlement budget 512 caseswork::tests::properties::money::nodes::hanging_secondary_retracts_double_spends_within_the_settlement_budget13.2 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_block16.5 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.5 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.5 s
- ✓Responses at transport deadline boundaries preserve failover and recovery 512 caseswork::tests::properties::money::nodes::responses_at_transport_deadline_boundaries_preserve_failover_and_recovery26 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_limit159 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_restarts47.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_money32.5 s
- ✓Zero confirmation and unverified height trust boundaries are explicit 512 caseswork::tests::properties::money::nodes::zero_confirmation_and_unverified_height_trust_boundaries_are_explicit14.5 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_restarts12 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_primary13 min
engine::work::scale110.2 s
- ✓Tenant groups recover without cross creditwork::tests::scale::tenant_groups_recover_without_cross_credit10.2 s
engine::work::scheduler::properties22281 ms
- ✓Backwards clock observations cannot extend an expired sharework::scheduler::properties::backwards_clock_observations_cannot_extend_an_expired_share6 ms
- ✓Every combination of tier results preserves the progress floorwork::scheduler::properties::every_combination_of_tier_results_preserves_the_progress_floor11 ms
- ✓Full width round budgets preserve share deadlineswork::scheduler::properties::full_width_round_budgets_preserve_share_deadlines7 ms
- ✓Late completions from another round are rejectedwork::scheduler::properties::late_completions_from_another_round_are_rejected6 ms
- ✓Outstanding and duplicate completions cannot change progresswork::scheduler::properties::outstanding_and_duplicate_completions_cannot_change_progress7 ms
- ✓Retry boundaries saturate and never wrapwork::scheduler::properties::retry_boundaries_saturate_and_never_wrap6 ms
- ✓Retry count at u32 max stays cappedwork::scheduler::properties::retry_count_at_u32_max_stays_capped7 ms
- ✓Retry expiry boundaries use production upkeepwork::scheduler::properties::retry_expiry_boundaries_use_production_upkeep6 ms
- ✓Retry histories reset and expire independentlywork::scheduler::properties::retry_histories_reset_and_expire_independently22 ms
- ✓Retry policy decision grid checks free attempts and deadlineswork::scheduler::properties::retry_policy_decision_grid_checks_free_attempts_and_deadlines6 ms
- ✓Scheduler matches the two pass contractwork::scheduler::properties::scheduler_matches_the_two_pass_contract8 ms
- ✓Backwards clock observations cannot extend an expired share 512 caseswork::scheduler::properties::backwards_clock_observations_cannot_extend_an_expired_share8 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_rejected8 ms
- ✓Outstanding and duplicate completions cannot change progress 512 caseswork::scheduler::properties::outstanding_and_duplicate_completions_cannot_change_progress9 ms
- ✓Retry boundaries saturate and never wrap 512 caseswork::scheduler::properties::retry_boundaries_saturate_and_never_wrap9 ms
- ✓Retry count at u32 max stays capped 512 caseswork::scheduler::properties::retry_count_at_u32_max_stays_capped9 ms
- ✓Retry expiry boundaries use production upkeep 512 caseswork::scheduler::properties::retry_expiry_boundaries_use_production_upkeep8 ms
- ✓Retry histories reset and expire independently 512 caseswork::scheduler::properties::retry_histories_reset_and_expire_independently100 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_contract13 ms
engine::work::tuning439 ms
- ✓A tuning that breaks a relation is refusedwork::tuning::tests::a_tuning_that_breaks_a_relation_is_refused10 ms
- ✓Response caps follow the budget and the groupswork::tuning::tests::response_caps_follow_the_budget_and_the_groups9 ms
- ✓The default shares out a ten second roundwork::tuning::tests::the_default_shares_out_a_ten_second_round10 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_share10 ms
Webhooks 7 groups6546.4 s
monokulo::http::webhooks191.6 s
- ✓A deliverys detail is a page without javascripthttp::webhooks::tests::a_deliverys_detail_is_a_page_without_javascript91 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_connection122 ms
- ✓A webhooks deliveries page twenty at a timehttp::webhooks::tests::a_webhooks_deliveries_page_twenty_at_a_time110 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_one147 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_signature183 ms
- ✓Another accounts webhooks and deliveries are not foundhttp::webhooks::tests::another_accounts_webhooks_and_deliveries_are_not_found119 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_afterward88 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_nothing88 ms
- ✓Creating a webhook with an empty url shows a clear errorhttp::webhooks::tests::creating_a_webhook_with_an_empty_url_shows_a_clear_error98 ms
- ✓Creating a webhook with an invalid url says whyhttp::webhooks::tests::creating_a_webhook_with_an_invalid_url_says_why93 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_error10 ms
- ✓Parse extra headers reads one header name value pair per linehttp::webhooks::tests::parse_extra_headers_reads_one_header_name_value_pair_per_line11 ms
- ✓Parse extra headers rejects a line with no colonhttp::webhooks::tests::parse_extra_headers_rejects_a_line_with_no_colon10 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_deliveries90 ms
- ✓Creating a webhook with custom headers keeps themhttp::webhooks::tests::creating_a_webhook_with_custom_headers_keeps_them94 ms
- ✓Parse extra headers rejects an empty header namehttp::webhooks::tests::parse_extra_headers_rejects_an_empty_header_name11 ms
- ✓Deleting a webhook removes it from the listhttp::webhooks::tests::deleting_a_webhook_removes_it_from_the_list90 ms
- ✓Send again and retry failed work as plain form postshttp::webhooks::tests::send_again_and_retry_failed_work_as_plain_form_posts89 ms
- ✓The card shows each webhooks health and its deliverieshttp::webhooks::tests::the_card_shows_each_webhooks_health_and_its_deliveries89 ms
monokulo::views::webhooks17 ms
- ✓A body is laid out in the order it was sentviews::webhooks::tests::a_body_is_laid_out_in_the_order_it_was_sent7 ms
monokulo::webhooks12750 ms
- ✓A failing delivery follows the schedule then gives upwebhooks::tests::a_failing_delivery_follows_the_schedule_then_gives_up27 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_event30 ms
- ✓A delivery to a private address is refused unless allowedwebhooks::tests::a_delivery_to_a_private_address_is_refused_unless_allowed30 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_http18 ms
- ✓A redirect is not followedwebhooks::tests::a_redirect_is_not_followed26 ms
- ✓Deliveries go one per order oldest first and fairly across storeswebhooks::tests::deliveries_go_one_per_order_oldest_first_and_fairly_across_stores18 ms
- ✓Events without webhooks move the position and old events are ignoredwebhooks::tests::events_without_webhooks_move_the_position_and_old_events_are_ignored19 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_9018 ms
- ✓Send again and retry failed start the schedule overwebhooks::tests::send_again_and_retry_failed_start_the_schedule_over34 ms
- ✓An engine event reaches the endpoint oncewebhooks::tests::an_engine_event_reaches_the_endpoint_once131 ms
- ✓The subscriber skips events the engine no longer haswebhooks::tests::the_subscriber_skips_events_the_engine_no_longer_has86 ms
- ✓The subscriber queues each event once across a restartwebhooks::tests::the_subscriber_queues_each_event_once_across_a_restart313 ms
monokulo::webhooks::body430 ms
- ✓An order monokulo has no record of still gets a bodywebhooks::body::tests::an_order_monokulo_has_no_record_of_still_gets_a_body7 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_places6 ms
- ✓An xmr orders body has no exchange ratewebhooks::body::tests::an_xmr_orders_body_has_no_exchange_rate8 ms
monokulo::webhooks::delivery431 ms
- ✓An ip literal url is classified before the requestwebhooks::delivery::tests::an_ip_literal_url_is_classified_before_the_request7 ms
- ✓Monokulos own headers are reservedwebhooks::delivery::tests::monokulos_own_headers_are_reserved8 ms
- ✓The wait doubles from a minute to 64 minuteswebhooks::delivery::tests::the_wait_doubles_from_a_minute_to_64_minutes7 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_otherwise9 ms
shared::webhook_sign1781 ms
- ✓Cgnat shared address space is rejectedwebhook_sign::tests::cgnat_shared_address_space_is_rejected5 ms
- ✓Cloud metadata address is rejectedwebhook_sign::tests::cloud_metadata_address_is_rejected4 ms
- ✓Ipv4 compatible ipv6 is unmapped exactly like the ipv4 mapped formwebhook_sign::tests::ipv4_compatible_ipv6_is_unmapped_exactly_like_the_ipv4_mapped_form5 ms
- ✓Ipv4 mapped ipv6 loopback is rejectedwebhook_sign::tests::ipv4_mapped_ipv6_loopback_is_rejected4 ms
- ✓Ipv6 link local is rejectedwebhook_sign::tests::ipv6_link_local_is_rejected5 ms
- ✓Known vector for cross language php verificationwebhook_sign::tests::known_vector_for_cross_language_php_verification5 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_families5 ms
- ✓Public https url with a public ip is allowedwebhook_sign::tests::public_https_url_with_a_public_ip_is_allowed4 ms
- ✓Private lan resolved address is rejectedwebhook_sign::tests::private_lan_resolved_address_is_rejected5 ms
- ✓Signature is sensitive to the secret the payload and the timewebhook_sign::tests::signature_is_sensitive_to_the_secret_the_payload_and_the_time4 ms
- ✓Signature matches a fixed test vectorwebhook_sign::tests::signature_matches_a_fixed_test_vector5 ms
- ✓The whole zero network is rejected not just the unspecified addresswebhook_sign::tests::the_whole_zero_network_is_rejected_not_just_the_unspecified_address5 ms
- ✓Translation prefixes are classified by the ipv4 address they embedwebhook_sign::tests::translation_prefixes_are_classified_by_the_ipv4_address_they_embed5 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_miss5 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_ahead5 ms
- ✓Verify rejects a tampered payload or timestampwebhook_sign::tests::verify_rejects_a_tampered_payload_or_timestamp5 ms
store-webhooks843.9 s
- ✓Each webhook says how it is doing; the deliveries of one that needs you are openstore-webhooks.spec.js18.7 s
- ✓The All deliveries page keeps Details and Send again in fixed columns, wide and on a phonestore-webhooks.spec.js1.1 s
- ✓Retry failed queues the given-up deliveries again and says sostore-webhooks.spec.js1.1 s
- ✓A delivery's details open as a dialog, with its attempts, request and last responsestore-webhooks.spec.js7.5 s
- ✓A webhook with many deliveries pages through them in place, 20 at a timestore-webhooks.spec.js6.5 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.js4.6 s
- ✓Without JavaScript, Details and Delete are pages and Send again is a formstore-webhooks.spec.js3.4 s
Checkout and POS 16 groups22113 min
checkout281 min
- ✓Real checkout saves a QR refund address and restores a saved address after editingcheckout.spec.js4.2 s
- ✓Real checkout validates, shows saving, rejects a response, and retriescheckout.spec.js5.1 s
- ✓Real checkout live update preserves a focused partial refund addresscheckout.spec.js802 ms
- ✓Real checkout keeps retry and camera upload paths after failurescheckout.spec.js4.6 s
- ✓Real checkout shows the whole payment address in groups, copies it, and keeps it whole at narrow and wide widthscheckout.spec.js863 ms
- ✓Real compact checkout keeps the refund controls inside a full width fieldcheckout.spec.js3.5 s
- ✓Real tall checkout keeps one background and a readable progress barcheckout.spec.js621 ms
- ✓Real checkout renders a paid order without opening a live streamcheckout.spec.js3.7 s
- ✓Real checkout retains manual refund entry without JavaScriptcheckout.spec.js2.5 s
- ✓Client refund option frames the real checkout and retains its status streamcheckout.spec.js883 ms
- ✓Client falls back to status polling when its stream is refusedcheckout.spec.js836 ms
- ✓Real restricted checkout permits its own origin and blocks another origincheckout.spec.js736 ms
- ✓Real frame-only checkout refuses a top-level navigationcheckout.spec.js861 ms
- ✓Real checkout open while the customer pays shows paid and stops following the ordercheckout.spec.js880 ms
- ✓Real checkout keeps retrying a refused live stream with backoff and then follows the ordercheckout.spec.js1.2 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.js5.3 s
- ✓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.js973 ms
- ✓Real checkout reads a wallet payment-URI QR and explains images it cannot usecheckout.spec.js1.2 s
- ✓Real checkout follows the customer payment from the mempool to confirmed and lists itcheckout.spec.js3.7 s
- ✓Real checkout guides a customer who underpays and then sends too muchcheckout.spec.js642 ms
- ✓Real checkout says so when the chosen refund QR photo cannot be readcheckout.spec.js682 ms
- ✓Real checkout keeps the amount and XMR on one line and shows a fiat equivalent only for fiat orderscheckout.spec.js4.0 s
- ✓Real checkout takes its theme from ?theme=, the embed option, and the signed-in viewer on the share pagecheckout.spec.js3.8 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.js10.6 s
- ✓Real checkout leads with the stage in one column and fades the code once paidcheckout.spec.js5.1 s
- ✓Real checkout shows times in the customer's own zone, or the one ?timezone= namescheckout.spec.js1.4 s
live-view1757.0 s
- ✓The engine page follows the engine live, scrubs, replays and moves its windowlive-view.spec.js22.6 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.2 s
- ✓The network picker goes at once with JavaScript, with Go withoutlive-view.spec.js3.1 s
- ✓The machine strip and the Scanning panel follow the engine livelive-view.spec.js10.6 s
- ✓The chain strip labels its blocks from above, at the right blockslive-view.spec.js2.5 s
- ✓The round card has room: inset bars, its end marker, chips apartlive-view.spec.js1.2 s
- ✓On a phone a gap between the thresholds is joinedlive-view.spec.js1.1 s
- ✓1280px, as served: an outline and a unit back to back are one runlive-view.spec.js771 ms
- ✓1280px, drawn by the script: an outline and a unit back to back are one runlive-view.spec.js1.0 s
- ✓390px, as served: an outline and a unit back to back are one runlive-view.spec.js570 ms
- ✓390px, drawn by the script: an outline and a unit back to back are one runlive-view.spec.js898 ms
- ✓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.9 s
- ✓The timeline scrub bar reaches the playback controllive-view.spec.js3.2 s
- ✓Without JavaScript the engine page is the network as of nowlive-view.spec.js2.3 s
- ✓The engine page is for admins onlylive-view.spec.js201 ms
live-view-performance13.6 s
- ✓Live view remains responsive and bounded through sustained activity and stream recoverylive-view-performance.spec.js3.6 s
merchant-client75.3 s
- ✓Merchant site creates an order, mounts the checkout, and is told once when it is paidmerchant-client.spec.js983 ms
- ✓Merchant site is told when an unpaid order expiresmerchant-client.spec.js932 ms
- ✓Merchant site gets the server's reason when an order cannot be createdmerchant-client.spec.js257 ms
- ✓Merchant single-page app re-rendering the payment widget keeps one live checkoutmerchant-client.spec.js722 ms
- ✓Merchant site keeps following an order through a status outage when its stream is refusedmerchant-client.spec.js1.3 s
- ✓A visitor past the rate limit, or asked for proof on a plain-HTTP shop, gets a clear failuremerchant-client.spec.js505 ms
- ✓A merchant wiring up the library wrongly gets an error saying what to fixmerchant-client.spec.js590 ms
pos-responsive-layout1538.5 s
- ✓Real POS fits iPhone SE portrait (375x667)pos-responsive-layout.spec.js2.4 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.js2.2 s
- ✓Real POS fits iPhone 14 landscape (844x390)pos-responsive-layout.spec.js2.3 s
- ✓Real POS fits iPad portrait (768x1024)pos-responsive-layout.spec.js2.7 s
- ✓Real POS fits iPad landscape (1024x768)pos-responsive-layout.spec.js2.9 s
- ✓Real POS fits iPad Pro portrait (1024x1366)pos-responsive-layout.spec.js2.8 s
- ✓Real POS fits iPad Pro landscape (1366x1024)pos-responsive-layout.spec.js2.6 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.6 s
- ✓Real POS fits Galaxy S8 portrait (360x740)pos-responsive-layout.spec.js2.5 s
- ✓Real POS fits Galaxy S8 landscape (740x360)pos-responsive-layout.spec.js2.7 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.js1.8 s
pos-responsive-layout (Firefox)151 min
- ✓Real POS fits iPhone SE portrait (375x667)pos-responsive-layout.spec.js5.3 s
- ✓Real POS fits iPhone SE landscape (667x375)pos-responsive-layout.spec.js3.9 s
- ✓Real POS fits iPhone 14 portrait (390x844)pos-responsive-layout.spec.js3.6 s
- ✓Real POS fits iPhone 14 landscape (844x390)pos-responsive-layout.spec.js4.4 s
- ✓Real POS fits iPad portrait (768x1024)pos-responsive-layout.spec.js3.7 s
- ✓Real POS fits iPad landscape (1024x768)pos-responsive-layout.spec.js4.2 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.js5.6 s
- ✓Real POS fits Pixel 7 portrait (412x915)pos-responsive-layout.spec.js3.3 s
- ✓Real POS fits Pixel 7 landscape (915x412)pos-responsive-layout.spec.js4.8 s
- ✓Real POS fits Galaxy S8 portrait (360x740)pos-responsive-layout.spec.js3.3 s
- ✓Real POS fits Galaxy S8 landscape (740x360)pos-responsive-layout.spec.js5.4 s
- ✓Real POS fits Galaxy Tab portrait (800x1280)pos-responsive-layout.spec.js3.6 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.js2.8 s
pos-responsive-layout (WebKit)1559.2 s
- ✓Real POS fits iPhone SE portrait (375x667)pos-responsive-layout.spec.js6.8 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.js3.8 s
- ✓Real POS fits iPhone 14 landscape (844x390)pos-responsive-layout.spec.js3.7 s
- ✓Real POS fits iPad portrait (768x1024)pos-responsive-layout.spec.js4.0 s
- ✓Real POS fits iPad landscape (1024x768)pos-responsive-layout.spec.js3.8 s
- ✓Real POS fits iPad Pro portrait (1024x1366)pos-responsive-layout.spec.js3.5 s
- ✓Real POS fits iPad Pro landscape (1366x1024)pos-responsive-layout.spec.js3.9 s
- ✓Real POS fits Pixel 7 portrait (412x915)pos-responsive-layout.spec.js3.8 s
- ✓Real POS fits Pixel 7 landscape (915x412)pos-responsive-layout.spec.js4.1 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.1 s
- ✓Real POS fits Galaxy Tab portrait (800x1280)pos-responsive-layout.spec.js3.5 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.js3.2 s
pos-session-diagnostics (real binaries)219.7 s
- ✓A POS session reads as one timeline, from opting in to the last eventpos-session-diagnostics.spec.js19.4 s
- ✓Log reports past their limit are dropped with a 429, never a challenge, and nothing else is held uppos-session-diagnostics.spec.js324 ms
pos-session-diagnostics (real binaries, Firefox)221.2 s
- ✓A POS session reads as one timeline, from opting in to the last eventpos-session-diagnostics.spec.js20.9 s
- ✓Log reports past their limit are dropped with a 429, never a challenge, and nothing else is held uppos-session-diagnostics.spec.js279 ms
pos-session-diagnostics (real binaries, WebKit)210.7 s
- ✓A POS session reads as one timeline, from opting in to the last eventpos-session-diagnostics.spec.js10.6 s
- ✓Log reports past their limit are dropped with a 429, never a challenge, and nothing else is held uppos-session-diagnostics.spec.js136 ms
pos-terminal352 min
- ✓Real POS backgrounds, reloads, reopens, cancels, and searches an orderpos-terminal.spec.js8.8 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.1 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.js1.8 s
- ✓Real POS payment card copies the address and saves a refund addresspos-terminal.spec.js3.5 s
- ✓Real POS copies the address from a selection where the clipboard API is missing, and says when it could not copypos-terminal.spec.js1.6 s
- ✓Real POS uses the site theme toggle, applies it in place and remembers itpos-terminal.spec.js3.1 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.2 s
- ✓Real dashboard health indicator follows healthy and unavailable pollspos-terminal.spec.js1.3 s
- ✓Merchant rings up a sale on a physical keyboardpos-terminal.spec.js7.5 s
- ✓Customer pays while the order is on screen and the merchant starts the next salepos-terminal.spec.js7.2 s
- ✓A delayed order read cannot undo a live payment, but a later reorg canpos-terminal.spec.js1.9 s
- ✓Customer underpays: the card asks for the rest and the order cannot be cancelledpos-terminal.spec.js5.0 s
- ✓Customer walks away: the order on screen expirespos-terminal.spec.js4.4 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.8 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.js2.3 s
- ✓Busy store sees every open order at once and narrows them by searchpos-terminal.spec.js2.5 s
- ✓An order list that failed to load when the POS opened comes back with Retrypos-terminal.spec.js2.1 s
- ✓Merchant records the customer refund address from a QR image, with clear failurespos-terminal.spec.js4.5 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.9 s
- ✓Double spend on the order on screen warns the merchant not to hand over goodspos-terminal.spec.js4.3 s
- ✓Store priced in AUD: the merchant keys in dollars and cents and sees both amounts throughoutpos-terminal.spec.js2.3 s
- ✓Payment countdown keeps ticking down while the customer finds their walletpos-terminal.spec.js21.3 s
- ✓Merchant moves between the keypad, the stack and the order listpos-terminal.spec.js2.3 s
- ✓Merchant denies the camera or picks a broken photo: the card says what to do insteadpos-terminal.spec.js1.8 s
- ✓Clearing a search brings the whole order list backpos-terminal.spec.js1.9 s
- ✓An order finished at the counter moves to Finished for this session onlypos-terminal.spec.js5.2 s
- ✓A backgrounded order that is paid while the merchant serves someone else moves to Finishedpos-terminal.spec.js2.2 s
- ✓Finished orders drop off the tab 24 hours after they finishedpos-terminal.spec.js2.3 s
- ✓A search with no match in this session links to searching all orderspos-terminal.spec.js2.4 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.js5.2 s
pos-terminal (Firefox)352 min
- ✓Real POS backgrounds, reloads, reopens, cancels, and searches an orderpos-terminal.spec.js4.5 s
- ✓Real POS header stays above its payment card and its actions stay reachablepos-terminal.spec.js3.0 s
- ✓Real POS displays a shortened ID for an order without a referencepos-terminal.spec.js2.9 s
- ✓Real POS opens an empty keypad when its order list is emptypos-terminal.spec.js1.9 s
- ✓Real POS shows pending, partial, confirming, and terminal badge symbolspos-terminal.spec.js2.7 s
- ✓Real POS payment card copies the address and saves a refund addresspos-terminal.spec.js4.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.3 s
- ✓Real POS uses the site theme toggle, applies it in place and remembers itpos-terminal.spec.js4.0 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.9 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.8 s
- ✓A delayed order read cannot undo a live payment, but a later reorg canpos-terminal.spec.js2.8 s
- ✓Customer underpays: the card asks for the rest and the order cannot be cancelledpos-terminal.spec.js2.6 s
- ✓Customer walks away: the order on screen expirespos-terminal.spec.js2.5 s
- ✓Counter loses its connection: the order shows connection lost, then recovers by itselfpos-terminal.spec.js10.0 s
- ✓The server refuses the counter's update stream: the POS opens another itself, and the payment comes inpos-terminal.spec.js2.2 s
- ✓Merchant opens Cancel order then keeps the order: nothing happens until they confirmpos-terminal.spec.js2.4 s
- ✓Payment lands just before the merchant confirms a cancel: the server refuses and says whypos-terminal.spec.js2.1 s
- ✓Busy store sees every open order at once and narrows them by searchpos-terminal.spec.js4.2 s
- ✓An order list that failed to load when the POS opened comes back with Retrypos-terminal.spec.js1.9 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.6 s
- ✓Payment waiting on the store's confirmations shows its progresspos-terminal.spec.js2.4 s
- ✓Double spend on the order on screen warns the merchant not to hand over goodspos-terminal.spec.js3.5 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.js23.8 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.3 s
- ✓Clearing a search brings the whole order list backpos-terminal.spec.js2.2 s
- ✓An order finished at the counter moves to Finished for this session onlypos-terminal.spec.js3.5 s
- ✓A backgrounded order that is paid while the merchant serves someone else moves to Finishedpos-terminal.spec.js2.2 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.3 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.4 s
pos-terminal (WebKit)353 min
- ✓Real POS backgrounds, reloads, reopens, cancels, and searches an orderpos-terminal.spec.js5.1 s
- ✓Real POS header stays above its payment card and its actions stay reachablepos-terminal.spec.js2.7 s
- ✓Real POS displays a shortened ID for an order without a referencepos-terminal.spec.js2.9 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.js4.7 s
- ✓Real POS payment card copies the address and saves a refund addresspos-terminal.spec.js4.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.3 s
- ✓Real POS uses the site theme toggle, applies it in place and remembers itpos-terminal.spec.js5.5 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.2 s
- ✓Real dashboard health indicator follows healthy and unavailable pollspos-terminal.spec.js2.2 s
- ✓Merchant rings up a sale on a physical keyboardpos-terminal.spec.js3.2 s
- ✓Customer pays while the order is on screen and the merchant starts the next salepos-terminal.spec.js2.9 s
- ✓A delayed order read cannot undo a live payment, but a later reorg canpos-terminal.spec.js3.0 s
- ✓Customer underpays: the card asks for the rest and the order cannot be cancelledpos-terminal.spec.js2.4 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.js6.4 s
- ✓The server refuses the counter's update stream: the POS opens another itself, and the payment comes inpos-terminal.spec.js2.6 s
- ✓Merchant opens Cancel order then keeps the order: nothing happens until they confirmpos-terminal.spec.js3.2 s
- ✓Payment lands just before the merchant confirms a cancel: the server refuses and says whypos-terminal.spec.js2.8 s
- ✓Busy store sees every open order at once and narrows them by searchpos-terminal.spec.js3.7 s
- ✓An order list that failed to load when the POS opened comes back with Retrypos-terminal.spec.js2.5 s
- ✓Merchant records the customer refund address from a QR image, with clear failurespos-terminal.spec.js5.8 s
- ✓Charge whose response is lost is retried without creating a second orderpos-terminal.spec.js4.0 s
- ✓Payment waiting on the store's confirmations shows its progresspos-terminal.spec.js3.3 s
- ✓Double spend on the order on screen warns the merchant not to hand over goodspos-terminal.spec.js2.8 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.js33.4 s
- ✓Merchant moves between the keypad, the stack and the order listpos-terminal.spec.js4.3 s
- ✓Merchant denies the camera or picks a broken photo: the card says what to do insteadpos-terminal.spec.js2.9 s
- ✓Clearing a search brings the whole order list backpos-terminal.spec.js2.8 s
- ✓An order finished at the counter moves to Finished for this session onlypos-terminal.spec.js4.9 s
- ✓A backgrounded order that is paid while the merchant serves someone else moves to Finishedpos-terminal.spec.js3.2 s
- ✓Finished orders drop off the tab 24 hours after they finishedpos-terminal.spec.js3.4 s
- ✓A search with no match in this session links to searching all orderspos-terminal.spec.js3.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.js5.1 s
refund-camera45.5 s
- ✓Real checkout scans a refund QR with the camera, then stops the camerarefund-camera.spec.js1.2 s
- ✓Real checkout camera can be stopped by the customer before it finds a coderefund-camera.spec.js1.1 s
- ✓Merchant scans the customer refund QR with the POS tablet camerarefund-camera.spec.js1.7 s
- ✓POS tablet camera stopped before it finds a code leaves the field as it wasrefund-camera.spec.js1.6 s
refund-camera (Firefox)49.6 s
- ✓Real checkout scans a refund QR with the camera, then stops the camerarefund-camera.spec.js2.9 s
- ✓Real checkout camera can be stopped by the customer before it finds a coderefund-camera.spec.js3.0 s
- ✓Merchant scans the customer refund QR with the POS tablet camerarefund-camera.spec.js1.9 s
- ✓POS tablet camera stopped before it finds a code leaves the field as it wasrefund-camera.spec.js1.7 s
refund-camera (WebKit)49.2 s
- ✓Real checkout scans a refund QR with the camera, then stops the camerarefund-camera.spec.js2.4 s
- ✓Real checkout camera can be stopped by the customer before it finds a coderefund-camera.spec.js1.9 s
- ✓Merchant scans the customer refund QR with the POS tablet camerarefund-camera.spec.js2.5 s
- ✓POS tablet camera stopped before it finds a code leaves the field as it wasrefund-camera.spec.js2.4 s
Dashboard and settings 81 groups9155 min
admin-query (real binaries)329.3 s
- ✓Without JavaScript a query runs, a write is refused, and the rows downloadadmin-query.spec.js2.4 s
- ✓With JavaScript Ctrl+Enter swaps the results, and the engine swaps the tablesadmin-query.spec.js21.6 s
- ✓On a phone the editor comes first, the tables fold, and nothing scrolls sidewaysadmin-query.spec.js5.4 s
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.6 s
- ✓A node is added, moved up to primary and removed (with JavaScript)admin-settings-and-nodes.spec.js6.6 s
- ✓A node on another network is refused and nothing changes (with JavaScript)admin-settings-and-nodes.spec.js3.9 s
- ✓The tab bar switches tabs, and Back returns to the one before (without JavaScript)admin-settings-and-nodes.spec.js2.0 s
- ✓A node is added, moved up to primary and removed (without JavaScript)admin-settings-and-nodes.spec.js4.5 s
- ✓A node on another network is refused and nothing changes (without JavaScript)admin-settings-and-nodes.spec.js3.5 s
- ✓Use TLS shows and hides its row's self-signed boxadmin-settings-and-nodes.spec.js1.9 s
- ✓Saving without the last node of a network stores use asks firstadmin-settings-and-nodes.spec.js5.5 s
- ✓The Monero nodes tab is marked while the only node of a network stores use is downadmin-settings-and-nodes.spec.js18.1 s
- ✓Every tab, for the galleryadmin-settings-and-nodes.spec.js21.3 s
admin-settings-layout (real binaries)1259.5 s
- ✓Every setting is described, with examples, and nothing scrolls sideways (small phone)admin-settings-layout.spec.js5.3 s
- ✓Every setting is described, with examples, and nothing scrolls sideways (phone)admin-settings-layout.spec.js4.4 s
- ✓Every setting is described, with examples, and nothing scrolls sideways (desktop)admin-settings-layout.spec.js4.9 s
- ✓Clearing a network stores use asks first; one no store uses does notadmin-settings-layout.spec.js7.4 s
- ✓Banners fit and the red one uses the error colour (light, small phone)admin-settings-layout.spec.js4.4 s
- ✓Banners fit and the red one uses the error colour (light, phone)admin-settings-layout.spec.js4.7 s
- ✓Banners fit and the red one uses the error colour (light, desktop)admin-settings-layout.spec.js5.1 s
- ✓Banners fit and the red one uses the error colour (dark, small phone)admin-settings-layout.spec.js4.3 s
- ✓Banners fit and the red one uses the error colour (dark, phone)admin-settings-layout.spec.js4.6 s
- ✓Banners fit and the red one uses the error colour (dark, desktop)admin-settings-layout.spec.js5.3 s
- ✓An on/off setting is a switch: on and off both saveadmin-settings-layout.spec.js4.2 s
- ✓The count of monokulo's own requests follows its switch, and saves either wayadmin-settings-layout.spec.js4.9 s
live-settings::nested_options732 ms
- ✓A mistake in a nested table names the whole keytests::nested_options::a_mistake_in_a_nested_table_names_the_whole_key4 ms
- ✓Each handle reads only its own keystests::nested_options::each_handle_reads_only_its_own_keys4 ms
- ✓A first nested save writes only the table it needstests::nested_options::a_first_nested_save_writes_only_the_table_it_needs5 ms
- ✓Nested settings get their own options and keep their own keystests::nested_options::nested_settings_get_their_own_options_and_keep_their_own_keys4 ms
- ✓Init lists nested settings under their tabletests::nested_options::init_lists_nested_settings_under_their_table5 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_hint4 ms
- ✓Saves through both handles keep each others keystests::nested_options::saves_through_both_handles_keep_each_others_keys6 ms
live-settings::paths14 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_directory4 ms
live-settings::sources1889 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_recreated5 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_was5 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 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_it5 ms
- ✓A save writes through a symlink and keeps the files permissionstests::sources::a_save_writes_through_a_symlink_and_keeps_the_files_permissions5 ms
- ✓A save of the values already in effect writes nothingtests::sources::a_save_of_the_values_already_in_effect_writes_nothing6 ms
- ✓A secret is read without the store at starttests::sources::a_secret_is_read_without_the_store_at_start4 ms
- ✓An invalid value anywhere stops the starttests::sources::an_invalid_value_anywhere_stops_the_start5 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_default6 ms
- ✓An unreadable file stops the start and is never half appliedtests::sources::an_unreadable_file_stops_the_start_and_is_never_half_applied5 ms
- ✓Declarations keep each source to its kind of settingtests::sources::declarations_keep_each_source_to_its_kind_of_setting4 ms
- ✓Each source wins over the ones below ittests::sources::each_source_wins_over_the_ones_below_it5 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_declaration4 ms
- ✓Init writes a commented file that changes nothingtests::sources::init_writes_a_commented_file_that_changes_nothing4 ms
- ✓The options file refuses what it may not holdtests::sources::the_options_file_refuses_what_it_may_not_hold4 ms
- ✓Saves write the file in place and reloads apply editstests::sources::saves_write_the_file_in_place_and_reloads_apply_edits7 ms
- ✓The page cannot change what is given at starttests::sources::the_page_cannot_change_what_is_given_at_start5 ms
- ✓Two settings with one option are refusedtests::sources::two_settings_with_one_option_are_refused4 ms
live-settings::tests38173 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_nothing5 ms
- ✓A check refuses what a save would with the same errorstests::a_check_refuses_what_a_save_would_with_the_same_errors5 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_nothing4 ms
- ✓A cross field rule refuses the savetests::a_cross_field_rule_refuses_the_save4 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_prepared5 ms
- ✓A failing write installs nothingtests::a_failing_write_installs_nothing5 ms
- ✓A hosts own default replaces the declared one but not a set valuetests::a_hosts_own_default_replaces_the_declared_one_but_not_a_set_value5 ms
- ✓A key submitted twice is refusedtests::a_key_submitted_twice_is_refused4 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_registry5 ms
- ✓A save with one bad value changes nothing including the valid valuestests::a_save_with_one_bad_value_changes_nothing_including_the_valid_values4 ms
- ✓A save before boot is refusedtests::a_save_before_boot_is_refused4 ms
- ✓A secret comes from the environment and is never saved or showntests::a_secret_comes_from_the_environment_and_is_never_saved_or_shown5 ms
- ✓A setting applies its range and check on top of its typetests::a_setting_applies_its_range_and_check_on_top_of_its_type4 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_refused4 ms
- ✓A successful save installs and readers see the new valuetests::a_successful_save_installs_and_readers_see_the_new_value5 ms
- ✓An install finishes even if the caller stops waitingtests::an_install_finishes_even_if_the_caller_stops_waiting4 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_source5 ms
- ✓At boot a section whose values break a rule stops the starttests::at_boot_a_section_whose_values_break_a_rule_stops_the_start5 ms
- ✓At boot any invalid value stops the starttests::at_boot_any_invalid_value_stops_the_start5 ms
- ✓Bind addr round trips and refuses an address without a porttests::bind_addr_round_trips_and_refuses_an_address_without_a_port5 ms
- ✓Boot follows each reloadables boot policytests::boot_follows_each_reloadables_boot_policy5 ms
- ✓Build fails if the store cannot be readtests::build_fails_if_the_store_cannot_be_read5 ms
- ✓Build fails if a declared setting is in no sectiontests::build_fails_if_a_declared_setting_is_in_no_section5 ms
- ✓Build fails on mistakes in the declarationstests::build_fails_on_mistakes_in_the_declarations4 ms
- ✓Comma list round trips and names the bad itemtests::comma_list_round_trips_and_names_the_bad_item5 ms
- ✓Build refuses a hosts default that names no setting or is invalidtests::build_refuses_a_hosts_default_that_names_no_setting_or_is_invalid5 ms
- ✓Deleting a stored value goes back to the defaulttests::deleting_a_stored_value_goes_back_to_the_default4 ms
- ✓Http url round trips and refuses other schemestests::http_url_round_trips_and_refuses_other_schemes4 ms
- ✓Describe reports metadata and masks secretstests::describe_reports_metadata_and_masks_secrets6 ms
- ✓Install is awaited under the save mutextests::install_is_awaited_under_the_save_mutex4 ms
- ✓Integers and bools parse render and refuse bad inputtests::integers_and_bools_parse_render_and_refuse_bad_input4 ms
- ✓Json round trips and refuses invalid documentstests::json_round_trips_and_refuses_invalid_documents4 ms
- ✓Live new holds a fixed valuetests::live_new_holds_a_fixed_value4 ms
- ✓Read sync returns the same section value the registry wouldtests::read_sync_returns_the_same_section_value_the_registry_would4 ms
- ✓Secret masks itself everywhere but the storetests::secret_masks_itself_everywhere_but_the_store4 ms
- ✓Two concurrent saves run one after the othertests::two_concurrent_saves_run_one_after_the_other5 ms
- ✓Unknown keys are refusedtests::unknown_keys_are_refused4 ms
monokulo::admin_nodes1169 ms
- ✓A button value round tripsadmin_nodes::tests::a_button_value_round_trips6 ms
- ✓A bad address says what to fixadmin_nodes::tests::a_bad_address_says_what_to_fix6 ms
- ✓A saved node uses the engines defaults and its labeladmin_nodes::tests::a_saved_node_uses_the_engines_defaults_and_its_label6 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_scheme7 ms
- ✓Addresses are host and port with an optional schemeadmin_nodes::tests::addresses_are_host_and_port_with_an_optional_scheme6 ms
- ✓Bad and repeated addresses are marked on their own rowadmin_nodes::tests::bad_and_repeated_addresses_are_marked_on_their_own_row6 ms
- ✓Only node form fields are node fieldsadmin_nodes::tests::only_node_form_fields_are_node_fields6 ms
- ✓Every row button including at the edgesadmin_nodes::tests::every_row_button_including_at_the_edges7 ms
- ✓Rows are ordered by their index not the forms orderadmin_nodes::tests::rows_are_ordered_by_their_index_not_the_forms_order6 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_order6 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_ignored7 ms
monokulo::confirmation_thresholds1497 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_store8 ms
- ✓Amount spellings canonicalize without floating pointconfirmation_thresholds::tests::amount_spellings_canonicalize_without_floating_point7 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_count7 ms
- ✓An amount below every threshold uses the defaultconfirmation_thresholds::tests::an_amount_below_every_threshold_uses_the_default7 ms
- ✓An amount between two thresholds uses the lower ones countconfirmation_thresholds::tests::an_amount_between_two_thresholds_uses_the_lower_ones_count7 ms
- ✓An amount exactly at a thresholds boundary uses that thresholdconfirmation_thresholds::tests::an_amount_exactly_at_a_thresholds_boundary_uses_that_threshold7 ms
- ✓Concurrent lookups share one tenants lockconfirmation_thresholds::tests::concurrent_lookups_share_one_tenants_lock9 ms
- ✓Duplicate decimal spellings are rejected even in stored rowsconfirmation_thresholds::tests::duplicate_decimal_spellings_are_rejected_even_in_stored_rows6 ms
- ✓No custom thresholds at all always uses the defaultconfirmation_thresholds::tests::no_custom_thresholds_at_all_always_uses_the_default6 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_tier7 ms
- ✓Policy lock serializes one tenant without blocking anotherconfirmation_thresholds::tests::policy_lock_serializes_one_tenant_without_blocking_another6 ms
- ✓Thresholds out of order in the slice are still resolved correctlyconfirmation_thresholds::tests::thresholds_out_of_order_in_the_slice_are_still_resolved_correctly6 ms
- ✓Zero amount thresholds and zero order amounts are handledconfirmation_thresholds::tests::zero_amount_thresholds_and_zero_order_amounts_are_handled6 ms
monokulo::currencies10247 ms
- ✓A browsers first language with a known region names the currencycurrencies::tests::a_browsers_first_language_with_a_known_region_names_the_currency97 ms
- ✓An unknown input resolves to nonecurrencies::tests::an_unknown_input_resolves_to_none14 ms
- ✓A known ticker alias resolves to its canonical codecurrencies::tests::a_known_ticker_alias_resolves_to_its_canonical_code17 ms
- ✓Currency options marks exactly one option selected by canonical codecurrencies::tests::currency_options_marks_exactly_one_option_selected_by_canonical_code18 ms
- ✓Currency options marks the matching option selected from a ticker aliascurrencies::tests::currency_options_marks_the_matching_option_selected_from_a_ticker_alias16 ms
- ✓Currency options selects nothing for an unknown inputcurrencies::tests::currency_options_selects_nothing_for_an_unknown_input18 ms
- ✓Every seeded currency is individually resolvable by its own canonical codecurrencies::tests::every_seeded_currency_is_individually_resolvable_by_its_own_canonical_code19 ms
- ✓Is known currency mirrors resolve currencys own answercurrencies::tests::is_known_currency_mirrors_resolve_currencys_own_answer16 ms
- ✓The canonical code itself resolves case insensitivelycurrencies::tests::the_canonical_code_itself_resolves_case_insensitively15 ms
- ✓Xmr is itself a selectable currencycurrencies::tests::xmr_is_itself_a_selectable_currency17 ms
monokulo::db701.6 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_list6 ms
- ✓A connection that cannot announce pos order changes cannot make themdb::tests::a_connection_that_cannot_announce_pos_order_changes_cannot_make_them15 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_lookup18 ms
- ✓A created confirmation threshold round tripsdb::tests::a_created_confirmation_threshold_round_trips17 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_user16 ms
- ✓A duplicate email leaves the invite unclaimed for another trydb::tests::a_duplicate_email_leaves_the_invite_unclaimed_for_another_try17 ms
- ✓A duplicate email is rejected as a unique violationdb::tests::a_duplicate_email_is_rejected_as_a_unique_violation18 ms
- ✓A failed threshold replacement rolls back deletionsdb::tests::a_failed_threshold_replacement_rolls_back_deletions16 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_made17 ms
- ✓A new store has default provider settingsdb::tests::a_new_store_has_default_provider_settings19 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_created15 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_erroring15 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_login17 ms
- ✓A setting that was never saved reads as nonedb::tests::a_setting_that_was_never_saved_reads_as_none15 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_many18 ms
- ✓An inline read cannot write eitherdb::tests::an_inline_read_cannot_write_either13 ms
- ✓A valid invite token redeems exactly oncedb::tests::a_valid_invite_token_redeems_exactly_once18 ms
- ✓An invite link expiresdb::tests::an_invite_link_expires16 ms
- ✓An unknown token is rejected without creating an accountdb::tests::an_unknown_token_is_rejected_without_creating_an_account14 ms
- ✓An out of range rate is refused not panicked ondb::tests::an_out_of_range_rate_is_refused_not_panicked_on17 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_thresholds18 ms
- ✓Client logging is off until the store opts indb::tests::client_logging_is_off_until_the_store_opts_in17 ms
- ✓Concurrent threshold adds never exceed fivedb::tests::concurrent_threshold_adds_never_exceed_five17 ms
- ✓Confirmation thresholds preserve adjacent twelve decimal orderdb::tests::confirmation_thresholds_preserve_adjacent_twelve_decimal_order14 ms
- ✓Consuming an expired connect token fails as if it never existeddb::tests::consuming_an_expired_connect_token_fails_as_if_it_never_existed88 ms
- ✓Consuming an unknown connect token returns nonedb::tests::consuming_an_unknown_connect_token_returns_none75 ms
- ✓Confirmation thresholds list in ascending numeric order not lexicographicdb::tests::confirmation_thresholds_list_in_ascending_numeric_order_not_lexicographic90 ms
- ✓Creating a connect token then consuming it returns its connection iddb::tests::creating_a_connect_token_then_consuming_it_returns_its_connection_id16 ms
- ✓Count confirmation thresholds reflects the real countdb::tests::count_confirmation_thresholds_reflects_the_real_count18 ms
- ✓Consuming the same connect token twice only succeeds oncedb::tests::consuming_the_same_connect_token_twice_only_succeeds_once19 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_violation14 ms
- ✓Creating a store connection then reading it back round tripsdb::tests::creating_a_store_connection_then_reading_it_back_round_trips16 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_trips17 ms
- ✓Creating a user then reading it back round tripsdb::tests::creating_a_user_then_reading_it_back_round_trips15 ms
- ✓Creating order fiat metadata then reading it back round tripsdb::tests::creating_order_fiat_metadata_then_reading_it_back_round_trips16 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_flag17 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_alone13 ms
- ✓Deleting a confirmation threshold is scoped to the owning connectiondb::tests::deleting_a_confirmation_threshold_is_scoped_to_the_owning_connection18 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_used17 ms
- ✓Deleting a request hides it and revokes its own unused linkdb::tests::deleting_a_request_hides_it_and_revokes_its_own_unused_link14 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_deleted15 ms
- ✓Deleting a setting removes its row entirelydb::tests::deleting_a_setting_removes_its_row_entirely18 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_id17 ms
- ✓First run setup creates one admin and completes setup atomicallydb::tests::first_run_setup_creates_one_admin_and_completes_setup_atomically15 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_actioned16 ms
- ✓List currencies returns the seeded reference data in alphabetical orderdb::tests::list_currencies_returns_the_seeded_reference_data_in_alphabetical_order17 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_id15 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_error17 ms
- ✓Looking up an unknown email returns none rather than an errordb::tests::looking_up_an_unknown_email_returns_none_rather_than_an_error14 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_error15 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_error15 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_error16 ms
- ✓Looking up fiat metadata for an unknown order id returns nonedb::tests::looking_up_fiat_metadata_for_an_unknown_order_id_returns_none16 ms
- ✓Migration 0008 backfills a stale fixed fx provider to coingeckodb::tests::migration_0008_backfills_a_stale_fixed_fx_provider_to_coingecko15 ms
- ✓Migration 0027 turns the single provider into a one element listdb::tests::migration_0027_turns_the_single_provider_into_a_one_element_list16 ms
- ✓Migration 0028 gives existing stores the default settingsdb::tests::migration_0028_gives_existing_stores_the_default_settings17 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_it16 ms
- ✓Pagination helpers respect limit offset and orderingdb::tests::pagination_helpers_respect_limit_offset_and_ordering15 ms
- ✓Pos orders are store scoped persist background and cancel statedb::tests::pos_orders_are_store_scoped_persist_background_and_cancel_state17 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_lookup17 ms
- ✓Redeeming a request linked token auto actions its requestdb::tests::redeeming_a_request_linked_token_auto_actions_its_request13 ms
- ✓Replacing confirmation thresholds at the cap is atomicdb::tests::replacing_confirmation_thresholds_at_the_cap_is_atomic13 ms
- ✓Saving one stores settings leaves every other store untoucheddb::tests::saving_one_stores_settings_leaves_every_other_store_untouched13 ms
- ✓Setup is not complete until explicitly markeddb::tests::setup_is_not_complete_until_explicitly_marked13 ms
- ✓The same amount is allowed again on a different connectiondb::tests::the_same_amount_is_allowed_again_on_a_different_connection50 ms
- ✓The test admin hash matches the test admin passworddb::tests::the_test_admin_hash_matches_the_test_admin_password21 ms
- ✓Reopening an existing database file does not reapply migrationsdb::tests::reopening_an_existing_database_file_does_not_reapply_migrations134 ms
- ✓Readers see the writers commits and cannot writedb::tests::readers_see_the_writers_commits_and_cannot_write148 ms
- ✓Updating a store connections fx providers only touches that fielddb::tests::updating_a_store_connections_fx_providers_only_touches_that_field16 ms
- ✓Wallets list mainnet first then each test network by namedb::tests::wallets_list_mainnet_first_then_each_test_network_by_name17 ms
monokulo::engine_client11172 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_sent7 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_server12 ms
- ✓A status parses with and without each nodes networkengine_client::tests::a_status_parses_with_and_without_each_nodes_network7 ms
- ✓An id that could name another engine route is refusedengine_client::tests::an_id_that_could_name_another_engine_route_is_refused8 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_order25 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_unset22 ms
- ✓Get order detail is never cached over httpengine_client::tests::get_order_detail_is_never_cached_over_http12 ms
- ✓Create tenant then get tenant round trips against a real engineengine_client::tests::create_tenant_then_get_tenant_round_trips_against_a_real_engine22 ms
- ✓Get status round trips against a real engineengine_client::tests::get_status_round_trips_against_a_real_engine21 ms
- ✓Lookup payment round trips against a real engineengine_client::tests::lookup_payment_round_trips_against_a_real_engine22 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_client14 ms
monokulo::engine_client::contract_tests2711 ms
- ✓A watched order is woken over the embedded transportengine_client::contract_tests::a_watched_order_is_woken_over_the_embedded_transport31 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_process680 ms
monokulo::engine_view::history8140 ms
- ✓A restart or a gap starts the history overengine_view::history::tests::a_restart_or_a_gap_starts_the_history_over8 ms
- ✓A past round is rebuilt as it endedengine_view::history::tests::a_past_round_is_rebuilt_as_it_ended19 ms
- ✓Any moment asked for is answeredengine_view::history::tests::any_moment_asked_for_is_answered8 ms
- ✓New events make a frame and old ones nothingengine_view::history::tests::new_events_make_a_frame_and_old_ones_nothing12 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_state18 ms
- ✓The engine clock moves on between pagesengine_view::history::tests::the_engine_clock_moves_on_between_pages9 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_rebuilds31 ms
- ✓The state at any moment is what the events giveengine_view::history::tests::the_state_at_any_moment_is_what_the_events_give35 ms
monokulo::engine_view::machine30852 ms
- ✓A big group moves a page at a timeengine_view::machine::tests::a_big_group_moves_a_page_at_a_time7 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_ahead7 ms
- ✓A diverged block is marked replacedengine_view::machine::tests::a_diverged_block_is_marked_replaced6 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_mark6 ms
- ✓A header only commit reads as recorded from its headerengine_view::machine::tests::a_header_only_commit_reads_as_recorded_from_its_header7 ms
- ✓A later snapshot corrects the page but keeps identitiesengine_view::machine::tests::a_later_snapshot_corrects_the_page_but_keeps_identities6 ms
- ✓A paying pool transaction flies to order statusengine_view::machine::tests::a_paying_pool_transaction_flies_to_order_status7 ms
- ✓A one block rewind reads in the singularengine_view::machine::tests::a_one_block_rewind_reads_in_the_singular7 ms
- ✓A reorg check probes the high water markengine_view::machine::tests::a_reorg_check_probes_the_high_water_mark6 ms
- ✓A reorg runs from detection to rewindengine_view::machine::tests::a_reorg_runs_from_detection_to_rewind6 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_open9 ms
- ✓A round collects its units and ends on the ribbonengine_view::machine::tests::a_round_collects_its_units_and_ends_on_the_ribbon10 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_round7 ms
- ✓A scan follows its block and a checkpoint saves itengine_view::machine::tests::a_scan_follows_its_block_and_a_checkpoint_saves_it9 ms
- ✓A snapshot sets what the page drawsengine_view::machine::tests::a_snapshot_sets_what_the_page_draws8 ms
- ✓Catching up onto the frontier is a key eventengine_view::machine::tests::catching_up_onto_the_frontier_is_a_key_event7 ms
- ✓Fetched blocks are held and the packet lands mid runengine_view::machine::tests::fetched_blocks_are_held_and_the_packet_lands_mid_run83 ms
- ✓Failing units are key events and strays are ignoredengine_view::machine::tests::failing_units_are_key_events_and_strays_are_ignored84 ms
- ✓New blocks arrive when a round reads a higher tipengine_view::machine::tests::new_blocks_arrive_when_a_round_reads_a_higher_tip8 ms
- ✓Idle stores fly to where they landengine_view::machine::tests::idle_stores_fly_to_where_they_land8 ms
- ✓Payments found in a block fly to order statusengine_view::machine::tests::payments_found_in_a_block_fly_to_order_status7 ms
- ✓Pool passes flash count and callengine_view::machine::tests::pool_passes_flash_count_and_call7 ms
- ✓Recomputes list their changesengine_view::machine::tests::recomputes_list_their_changes7 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_place7 ms
- ✓Snapshots during and after a reorgengine_view::machine::tests::snapshots_during_and_after_a_reorg6 ms
- ✓The first run s seed is a key eventengine_view::machine::tests::the_first_run_s_seed_is_a_key_event6 ms
- ✓The node s pool fills the next blockengine_view::machine::tests::the_node_s_pool_fills_the_next_block6 ms
- ✓The ribbon keeps its last entriesengine_view::machine::tests::the_ribbon_keeps_its_last_entries7 ms
- ✓The vanished check and upkeep are notedengine_view::machine::tests::the_vanished_check_and_upkeep_are_noted8 ms
- ✓No sequence of events breaks the page s invariantsengine_view::machine::tests::no_sequence_of_events_breaks_the_page_s_invariants493 ms
monokulo::engine_view::present17140 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_scale9 ms
- ✓A round s lanes are drawn to scaleengine_view::present::tests::a_round_s_lanes_are_drawn_to_scale10 ms
- ✓A very short round is drawn to a 10ms scaleengine_view::present::tests::a_very_short_round_is_drawn_to_a_10ms_scale11 ms
- ✓A caught up network reads as caught upengine_view::present::tests::a_caught_up_network_reads_as_caught_up7 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_ended8 ms
- ✓A round s parts add up to itengine_view::present::tests::a_round_s_parts_add_up_to_it9 ms
- ✓An empty state reads as not yet knownengine_view::present::tests::an_empty_state_reads_as_not_yet_known6 ms
- ✓An open reorg draws attentionengine_view::present::tests::an_open_reorg_draws_attention8 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_join7 ms
- ✓Seconds read to two places under one and one overengine_view::present::tests::seconds_read_to_two_places_under_one_and_one_over6 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_details13 ms
- ✓Shapes back to back meet and a gap or a thread keeps them apartengine_view::present::tests::shapes_back_to_back_meet_and_a_gap_or_a_thread_keeps_them_apart8 ms
- ✓Stores catching up read as catching upengine_view::present::tests::stores_catching_up_read_as_catching_up8 ms
- ✓The next block fills with the node s poolengine_view::present::tests::the_next_block_fills_with_the_node_s_pool8 ms
- ✓The pool panel says whether the engine looksengine_view::present::tests::the_pool_panel_says_whether_the_engine_looks7 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_them8 ms
- ✓The side summarises the pool orders upkeep and savesengine_view::present::tests::the_side_summarises_the_pool_orders_upkeep_and_saves7 ms
monokulo::engine_view::relay71.8 s
- ✓An engine that is down is unreachable until it is backengine_view::relay::tests::an_engine_that_is_down_is_unreachable_until_it_is_back93 ms
- ✓Timing is validatedengine_view::relay::tests::timing_is_validated6 ms
- ✓An engine restart starts the history overengine_view::relay::tests::an_engine_restart_starts_the_history_over452 ms
- ✓Watching for a minute costs one requestengine_view::relay::tests::watching_for_a_minute_costs_one_request25 ms
- ✓The stream closes a linger after the last viewer leavesengine_view::relay::tests::the_stream_closes_a_linger_after_the_last_viewer_leaves339 ms
- ✓Viewers get the engine s history then its new eventsengine_view::relay::tests::viewers_get_the_engine_s_history_then_its_new_events222 ms
- ✓Reads alone keep the history current then let it goengine_view::relay::tests::reads_alone_keep_the_history_current_then_let_it_go669 ms
monokulo::http462.3 s
- ✓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_40143 ms
- ✓A correct login returns a non empty session tokenhttp::tests::a_correct_login_returns_a_non_empty_session_token59 ms
- ✓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_has27 ms
- ✓A store is owned only by the user it belongs tohttp::tests::a_store_is_owned_only_by_the_user_it_belongs_to30 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_own74 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_so28 ms
- ✓A store with no site has a name onlyhttp::tests::a_store_with_no_site_has_a_name_only77 ms
- ✓A stores name and site are changed in its settingshttp::tests::a_stores_name_and_site_are_changed_in_its_settings91 ms
- ✓A stores payment description is saved from its settingshttp::tests::a_stores_payment_description_is_saved_from_its_settings76 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_user51 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_redirect87 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_hash41 ms
- ✓A wrong password returns unauthorizedhttp::tests::a_wrong_password_returns_unauthorized57 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_route54 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_made87 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_password49 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_them25 ms
- ✓Cross site posts to the sites own routes are refusedhttp::tests::cross_site_posts_to_the_sites_own_routes_are_refused26 ms
- ✓Get dashboard login returns htmlhttp::tests::get_dashboard_login_returns_html25 ms
- ✓Get dashboard signup returns htmlhttp::tests::get_dashboard_signup_returns_html30 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_password85 ms
- ✓Invite only mode rejects a signup with no tokenhttp::tests::invite_only_mode_rejects_a_signup_with_no_token28 ms
- ✓Invite only mode accepts a valid token exactly oncehttp::tests::invite_only_mode_accepts_a_valid_token_exactly_once52 ms
- ✓Logout rejects a missing authorization headerhttp::tests::logout_rejects_a_missing_authorization_header28 ms
- ✓Logging out a valid session returns no contenthttp::tests::logging_out_a_valid_session_returns_no_content62 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_in59 ms
- ✓Logout rejects an unknown bearer tokenhttp::tests::logout_rejects_an_unknown_bearer_token29 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_error57 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_error64 ms
- ✓Posting valid form encoded login data sets a session cookiehttp::tests::posting_valid_form_encoded_login_data_sets_a_session_cookie64 ms
- ✓Public embed routes allow any origin and the dashboard does nothttp::tests::public_embed_routes_allow_any_origin_and_the_dashboard_does_not25 ms
- ✓Public mode signup needs no invite token at allhttp::tests::public_mode_signup_needs_no_invite_token_at_all43 ms
- ✓Setup without a session sends a page load to log inhttp::tests::setup_without_a_session_sends_a_page_load_to_log_in42 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_done77 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_wallet45 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_is25 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_do26 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_attempt55 ms
- ✓The plugins forwarded errors are refused until the store opted inhttp::tests::the_plugins_forwarded_errors_are_refused_until_the_store_opted_in29 ms
- ✓The protected test route rejects a missing authorization headerhttp::tests::the_protected_test_route_rejects_a_missing_authorization_header29 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_in30 ms
- ✓The protected test route rejects an unknown bearer tokenhttp::tests::the_protected_test_route_rejects_an_unknown_bearer_token33 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_content30 ms
- ✓The session cookie from dashboard login authenticates against a protected routehttp::tests::the_session_cookie_from_dashboard_login_authenticates_against_a_protected_route63 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_password67 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_used116 ms
monokulo::http::abuse11324 ms
- ✓Log routes are classed as logshttp::abuse::tests::log_routes_are_classed_as_logs8 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_challenged30 ms
- ✓Cors lets any site send a proof and read the challengehttp::abuse::tests::cors_lets_any_site_send_a_proof_and_read_the_challenge30 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_ignored31 ms
- ✓Only operators see challenge activity on the status pagehttp::abuse::tests::only_operators_see_challenge_activity_on_the_status_page31 ms
- ✓Past the hard limit everything gets 429 with retry afterhttp::abuse::tests::past_the_hard_limit_everything_gets_429_with_retry_after30 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_continues31 ms
- ✓Signed in merchants are never challengedhttp::abuse::tests::signed_in_merchants_are_never_challenged31 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_header35 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_files34 ms
- ✓Under attack never challenges log reportshttp::abuse::tests::under_attack_never_challenges_log_reports33 ms
monokulo::http::account101.9 s
- ✓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_follows316 ms
- ✓A password saves with the rest of the profilehttp::account::tests::a_password_saves_with_the_rest_of_the_profile292 ms
- ✓A new email without its confirmation holds back a password changehttp::account::tests::a_new_email_without_its_confirmation_holds_back_a_password_change313 ms
- ✓Signed out the account page sends a browser to log inhttp::account::tests::signed_out_the_account_page_sends_a_browser_to_log_in31 ms
- ✓A password change needs the current one typed twice and logs out every other sessionhttp::account::tests::a_password_change_needs_the_current_one_typed_twice_and_logs_out_every_other_session404 ms
- ✓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_refused132 ms
- ✓The theme picked at sign up is the new accountshttp::account::tests::the_theme_picked_at_sign_up_is_the_new_accounts125 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_in169 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_one73 ms
- ✓Times follow the zone a merchant picks or else their browsershttp::account::tests::times_follow_the_zone_a_merchant_picks_or_else_their_browsers93 ms
monokulo::http::admin_settings535.5 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_banner11 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_panel84 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_saved119 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_band127 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_offered102 ms
- ✓A missing options file is created by the first savehttp::admin_settings::tests::a_missing_options_file_is_created_by_the_first_save118 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_saved79 ms
- ✓A mixed tab saves both halveshttp::admin_settings::tests::a_mixed_tab_saves_both_halves135 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_file159 ms
- ✓A node on another network is refused on its blockhttp::admin_settings::tests::a_node_on_another_network_is_refused_on_its_block109 ms
- ✓A non admin session is forbidden from the settings pagehttp::admin_settings::tests::a_non_admin_session_is_forbidden_from_the_settings_page102 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_buttons168 ms
- ✓A read only options file locks what it holdshttp::admin_settings::tests::a_read_only_options_file_locks_what_it_holds134 ms
- ✓A refused save keeps every networks rows as senthttp::admin_settings::tests::a_refused_save_keeps_every_networks_rows_as_sent124 ms
- ✓A save saves only the cards whose settings changedhttp::admin_settings::tests::a_save_saves_only_the_cards_whose_settings_changed89 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_http122 ms
- ✓A saved banner is shown oncehttp::admin_settings::tests::a_saved_banner_is_shown_once86 ms
- ✓A saved public url applies to the next plugin connectionhttp::admin_settings::tests::a_saved_public_url_applies_to_the_next_plugin_connection87 ms
- ✓A saved monokulo setting round trips on the next loadhttp::admin_settings::tests::a_saved_monokulo_setting_round_trips_on_the_next_load108 ms
- ✓A switch left off is sent as falsehttp::admin_settings::tests::a_switch_left_off_is_sent_as_false11 ms
- ✓A saved node shows its statushttp::admin_settings::tests::a_saved_node_shows_its_status113 ms
- ✓A saved signup mode applies to the next signuphttp::admin_settings::tests::a_saved_signup_mode_applies_to_the_next_signup120 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_refused94 ms
- ✓A tab with only monokulo settings saves only monokulohttp::admin_settings::tests::a_tab_with_only_monokulo_settings_saves_only_monokulo78 ms
- ✓A tab with only engine settings saves only the enginehttp::admin_settings::tests::a_tab_with_only_engine_settings_saves_only_the_engine97 ms
- ✓A value a check refuses saves nothing on the tabhttp::admin_settings::tests::a_value_a_check_refuses_saves_nothing_on_the_tab114 ms
- ✓After a save the page shows what was storedhttp::admin_settings::tests::after_a_save_the_page_shows_what_was_stored84 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_http107 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_nothing148 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_error109 ms
- ✓An engine refusal shows the engines own messagehttp::admin_settings::tests::an_engine_refusal_shows_the_engines_own_message117 ms
- ✓An invalid monokulo setting is rejected and nothing is savedhttp::admin_settings::tests::an_invalid_monokulo_setting_is_rejected_and_nothing_is_saved105 ms
- ✓Development logging ends in the admins own zonehttp::admin_settings::tests::development_logging_ends_in_the_admins_own_zone11 ms
- ✓An unreadable engine save reply is reported not droppedhttp::admin_settings::tests::an_unreadable_engine_save_reply_is_reported_not_dropped53 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_needs114 ms
- ✓Clearing a network stores use is saved and says sohttp::admin_settings::tests::clearing_a_network_stores_use_is_saved_and_says_so115 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_file152 ms
- ✓Every monokulo setting on the admin page saves correctlyhttp::admin_settings::tests::every_monokulo_setting_on_the_admin_page_saves_correctly152 ms
- ✓Only a restart makes the toast amberhttp::admin_settings::tests::only_a_restart_makes_the_toast_amber10 ms
- ✓Every tab openshttp::admin_settings::tests::every_tab_opens118 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_http169 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_was126 ms
- ✓Restart and unserved network notices still showhttp::admin_settings::tests::restart_and_unserved_network_notices_still_show143 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_engines119 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_load134 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_engine101 ms
- ✓The engines options file is reloaded through its apihttp::admin_settings::tests::the_engines_options_file_is_reloaded_through_its_api109 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_settings131 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_http114 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_name9 ms
- ✓The settings page is unreachable without a session at allhttp::admin_settings::tests::the_settings_page_is_unreachable_without_a_session_at_all61 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_page114 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_saved95 ms
monokulo::http::admin_setup6259 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_wizard28 ms
- ✓A too short password is rejectedhttp::admin_setup::tests::a_too_short_password_is_rejected31 ms
- ✓Mismatched passwords are rejected and no account is createdhttp::admin_setup::tests::mismatched_passwords_are_rejected_and_no_account_is_created31 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_page76 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_install32 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_rendering61 ms
monokulo::http::checkout171.3 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_dropped10 ms
- ✓Checkout amount messages use exact received remaining and extra xmrhttp::checkout::tests::checkout_amount_messages_use_exact_received_remaining_and_extra_xmr11 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_50049 ms
- ✓An unknown order id shows a real not found pagehttp::checkout::tests::an_unknown_order_id_shows_a_real_not_found_page82 ms
- ✓The auto refresh toggle flips only the refresh parameterhttp::checkout::tests::the_auto_refresh_toggle_flips_only_the_refresh_parameter11 ms
- ✓One source may hold only so many open streams per storehttp::checkout::tests::one_source_may_hold_only_so_many_open_streams_per_store94 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_engine109 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_page98 ms
- ✓The checkout events stream 404s for an unknown orderhttp::checkout::tests::the_checkout_events_stream_404s_for_an_unknown_order86 ms
- ✓The checkout events stream pushes a change made on the enginehttp::checkout::tests::the_checkout_events_stream_pushes_a_change_made_on_the_engine95 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_due11 ms
- ✓The checkout page shows the real address amount and fiat quotehttp::checkout::tests::the_checkout_page_shows_the_real_address_amount_and_fiat_quote104 ms
- ✓The checkout says who is paid and for whathttp::checkout::tests::the_checkout_says_who_is_paid_and_for_what102 ms
- ✓The checkout status endpoint returns real status and confirmationshttp::checkout::tests::the_checkout_status_endpoint_returns_real_status_and_confirmations95 ms
- ✓The routed checkout stream sends only changed parts to their elementshttp::checkout::tests::the_routed_checkout_stream_sends_only_changed_parts_to_their_elements100 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_order99 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_nav100 ms
monokulo::http::connect151.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_itself11 ms
- ✓A connect link returning to another site sends no credentials anywherehttp::connect::tests::a_connect_link_returning_to_another_site_sends_no_credentials_anywhere99 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_request98 ms
- ✓A shop another account has is refused with no formhttp::connect::tests::a_shop_another_account_has_is_refused_with_no_form116 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_key125 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_another97 ms
- ✓Finish with a garbage token returns unauthorizedhttp::connect::tests::finish_with_a_garbage_token_returns_unauthorized73 ms
- ✓Finish with a rejected webhook url fails the whole callhttp::connect::tests::finish_with_a_rejected_webhook_url_fails_the_whole_call94 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_token117 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_url115 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_secret92 ms
- ✓The connecting site is read from a connect link onlyhttp::connect::tests::the_connecting_site_is_read_from_a_connect_link_only10 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_credentials93 ms
- ✓Finishing the same token twice only succeeds oncehttp::connect::tests::finishing_the_same_token_twice_only_succeeds_once94 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_why97 ms
monokulo::http::connections4315 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_engine51 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_currency89 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_tenant87 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_row88 ms
monokulo::http::csrf218 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_pass9 ms
- ✓Only state changing methods are checkedhttp::csrf::tests::only_state_changing_methods_are_checked9 ms
monokulo::http::dashboard8156 ms
- ✓A backslash smuggled next is rejectedhttp::dashboard::tests::a_backslash_smuggled_next_is_rejected10 ms
- ✓A genuine relative path is acceptedhttp::dashboard::tests::a_genuine_relative_path_is_accepted8 ms
- ✓A javascript scheme next is rejectedhttp::dashboard::tests::a_javascript_scheme_next_is_rejected8 ms
- ✓A next with no leading slash is rejectedhttp::dashboard::tests::a_next_with_no_leading_slash_is_rejected7 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_site9 ms
- ✓A protocol relative next is rejectedhttp::dashboard::tests::a_protocol_relative_next_is_rejected9 ms
- ✓An absolute url next is rejectedhttp::dashboard::tests::an_absolute_url_next_is_rejected8 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_page97 ms
monokulo::http::dashboard::theme_selector_tests18 ms
- ✓Named theme options select directlyhttp::dashboard::theme_selector_tests::named_theme_options_select_directly8 ms
monokulo::http::embed_domains91.0 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_itself95 ms
- ✓A check answers in place and a verified domain lets the restriction onhttp::embed_domains::tests::a_check_answers_in_place_and_a_verified_domain_lets_the_restriction_on100 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_missing136 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_once86 ms
- ✓A restricted store only works on its verified domainshttp::embed_domains::tests::a_restricted_store_only_works_on_its_verified_domains115 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_frame129 ms
- ✓Diagnostics turn on the checkouts problem reportshttp::embed_domains::tests::diagnostics_turn_on_the_checkouts_problem_reports132 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_page107 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_domains102 ms
monokulo::http::engine_page95.7 s
- ✓A past round is shown on requesthttp::engine_page::tests::a_past_round_is_shown_on_request98 ms
- ✓An unreachable remote engine is said so over httphttp::engine_page::tests::an_unreachable_remote_engine_is_said_so_over_http56 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_too16 ms
- ✓Scrubbing and replay answer from the historyhttp::engine_page::tests::scrubbing_and_replay_answer_from_the_history87 ms
- ✓Only admins see the engine pagehttp::engine_page::tests::only_admins_see_the_engine_page108 ms
- ✓The page reads top down in one columnhttp::engine_page::tests::the_page_reads_top_down_in_one_column80 ms
- ✓The page shows the network as of nowhttp::engine_page::tests::the_page_shows_the_network_as_of_now78 ms
- ✓The stream opens with the historyhttp::engine_page::tests::the_stream_opens_with_the_history78 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::fx213 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_redirect7 ms
- ✓Only a plausible time zone is believedhttp::fx::tests::only_a_plausible_time_zone_is_believed6 ms
monokulo::http::home321 ms
- ✓Formats a fractional amount trimming trailing zeroshttp::home::tests::formats_a_fractional_amount_trimming_trailing_zeros6 ms
- ✓Formats a whole xmr amount with no trailing decimalhttp::home::tests::formats_a_whole_xmr_amount_with_no_trailing_decimal8 ms
- ✓Formats sub piconero precision without losing the last digithttp::home::tests::formats_sub_piconero_precision_without_losing_the_last_digit7 ms
monokulo::http::home::http_tests3210 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_it50 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_received86 ms
- ✓Dashboard with no stores shows the empty state ctahttp::home::tests::http_tests::dashboard_with_no_stores_shows_the_empty_state_cta74 ms
monokulo::http::invites9455 ms
- ✓Delete all clears every pending request and shows a count bannerhttp::invites::tests::delete_all_clears_every_pending_request_and_shows_a_count_banner47 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_again48 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_signup87 ms
- ✓Invites buttons answer fixi with the sectionhttp::invites::tests::invites_buttons_answer_fixi_with_the_section43 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_page53 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_link44 ms
- ✓Submitting an empty request invite form is rejected and creates nothinghttp::invites::tests::submitting_an_empty_request_invite_form_is_rejected_and_creates_nothing43 ms
- ✓The request invite form is reachable without a sessionhttp::invites::tests::the_request_invite_form_is_reachable_without_a_session29 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_admin61 ms
monokulo::http::key_entry10156 ms
- ✓A bundle is served while it lastshttp::key_entry::tests::a_bundle_is_served_while_it_lasts8 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_oldest8 ms
- ✓Command words are quoted unless plainly safehttp::key_entry::tests::command_words_are_quoted_unless_plainly_safe7 ms
- ✓Download links name this version and each computerhttp::key_entry::tests::download_links_name_this_version_and_each_computer8 ms
- ✓An account opening too many forms gets an alerthttp::key_entry::tests::an_account_opening_too_many_forms_gets_an_alert45 ms
- ✓Required encrypted entry never sends typed keyshttp::key_entry::tests::required_encrypted_entry_never_sends_typed_keys22 ms
- ✓The source link follows the release then the commithttp::key_entry::tests::the_source_link_follows_the_release_then_the_commit7 ms
- ✓Snp is not offered while the engine trusts other imageshttp::key_entry::tests::snp_is_not_offered_while_the_engine_trusts_other_images24 ms
- ✓The status alert names what differshttp::key_entry::tests::the_status_alert_names_what_differs8 ms
- ✓Typed keys are sent only where the default takes themhttp::key_entry::tests::typed_keys_are_sent_only_where_the_default_takes_them19 ms
monokulo::http::logs_page13962 ms
- ✓A custom range that does not parse is refusedhttp::logs_page::tests::a_custom_range_that_does_not_parse_is_refused8 ms
- ✓A search downloads as ndjson or csvhttp::logs_page::tests::a_search_downloads_as_ndjson_or_csv61 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_marked99 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_results49 ms
- ✓A trace shows its spans and lineshttp::logs_page::tests::a_trace_shows_its_spans_and_lines45 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_away50 ms
- ✓Live streams new lines to the top of the listhttp::logs_page::tests::live_streams_new_lines_to_the_top_of_the_list49 ms
- ✓Older pages follow as links or appended by fixihttp::logs_page::tests::older_pages_follow_as_links_or_appended_by_fixi48 ms
- ✓Only admins see the logshttp::logs_page::tests::only_admins_see_the_logs68 ms
- ✓Searches are saved and removed with or without fixihttp::logs_page::tests::searches_are_saved_and_removed_with_or_without_fixi45 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_order314 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_missing51 ms
- ✓The logs pages own requests are hidden unless asked forhttp::logs_page::tests::the_logs_pages_own_requests_are_hidden_unless_asked_for75 ms
monokulo::http::orders604.8 s
- ✓A different user cannot update confirmations on someone elses connectionhttp::orders::tests::a_different_user_cannot_update_confirmations_on_someone_elses_connection94 ms
- ✓A different user cannot create an order on someone elses connectionhttp::orders::tests::a_different_user_cannot_create_an_order_on_someone_elses_connection109 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_data122 ms
- ✓A duplicate unit amount is rejectedhttp::orders::tests::a_duplicate_unit_amount_is_rejected82 ms
- ✓A form without the haveno fields keeps the stores haveno limitshttp::orders::tests::a_form_without_the_haveno_fields_keeps_the_stores_haveno_limits91 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_change83 ms
- ✓A negative or out of range new threshold is rejectedhttp::orders::tests::a_negative_or_out_of_range_new_threshold_is_rejected88 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_enabled78 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_choice82 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_save82 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_js106 ms
- ✓A store with coingecko enabled gets a real currency dropdownhttp::orders::tests::a_store_with_coingecko_enabled_gets_a_real_currency_dropdown77 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_page88 ms
- ✓An invalid haveno limit is rejected and nothing is savedhttp::orders::tests::an_invalid_haveno_limit_is_rejected_and_nothing_is_saved83 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_engine83 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_webassembly24 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_required85 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_unchanged76 ms
- ✓Changing the base currency deletes every custom thresholdhttp::orders::tests::changing_the_base_currency_deletes_every_custom_threshold80 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_accepted87 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_page74 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_error77 ms
- ✓Creating an order with an unknown currency shows a clear errorhttp::orders::tests::creating_an_order_with_an_unknown_currency_shows_a_clear_error76 ms
- ✓Custom confirmation save fails closed when thresholds cannot be readhttp::orders::tests::custom_confirmation_save_fails_closed_when_thresholds_cannot_be_read84 ms
- ✓Custom confirmation thresholds save without contacting the enginehttp::orders::tests::custom_confirmation_thresholds_save_without_contacting_the_engine88 ms
- ✓Custom thresholds are displayed in ascending order of amounthttp::orders::tests::custom_thresholds_are_displayed_in_ascending_order_of_amount84 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_another83 ms
- ✓Default confirmation save leaves custom thresholds unchangedhttp::orders::tests::default_confirmation_save_leaves_custom_thresholds_unchanged84 ms
- ✓Equivalent decimal thresholds are rejected by both formshttp::orders::tests::equivalent_decimal_thresholds_are_rejected_by_both_forms82 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_haveno84 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_rows79 ms
- ✓Lookup payment reshows the orders page with a not found messagehttp::orders::tests::lookup_payment_reshows_the_orders_page_with_a_not_found_message87 ms
- ✓Merchant recovers a missed payment by looking up the customers txidhttp::orders::tests::merchant_recovers_a_missed_payment_by_looking_up_the_customers_txid96 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_state75 ms
- ✓Order detail shows the seeded orders full detailhttp::orders::tests::order_detail_shows_the_seeded_orders_full_detail92 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_api82 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_watched8 ms
- ✓Order detail streams its live part to its owner onlyhttp::orders::tests::order_detail_streams_its_live_part_to_its_owner_only118 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_yet72 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_watched83 ms
- ✓Saving the providers waits for the stores policy lockhttp::orders::tests::saving_the_providers_waits_for_the_stores_policy_lock187 ms
- ✓Store detail shows the real connected stores overview and integration helphttp::orders::tests::store_detail_shows_the_real_connected_stores_overview_and_integration_help72 ms
- ✓Store detail for an unowned or unknown connection returns 404http::orders::tests::store_detail_for_an_unowned_or_unknown_connection_returns_40493 ms
- ✓The default threshold has no remove control and is not a tierhttp::orders::tests::the_default_threshold_has_no_remove_control_and_is_not_a_tier83 ms
- ✓The create order form describes the order and can hide its referencehttp::orders::tests::the_create_order_form_describes_the_order_and_can_hide_its_reference89 ms
- ✓The haveno limits are shown and saved with the provider listhttp::orders::tests::the_haveno_limits_are_shown_and_saved_with_the_provider_list80 ms
- ✓The provider form rejects a provider the instance does not offerhttp::orders::tests::the_provider_form_rejects_a_provider_the_instance_does_not_offer8 ms
- ✓The provider form yields the ticked providers in position orderhttp::orders::tests::the_provider_form_yields_the_ticked_providers_in_position_order9 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_rest8 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_haveno85 ms
- ✓The settings form saves the changed cards or nothinghttp::orders::tests::the_settings_form_saves_the_changed_cards_or_nothing88 ms
- ✓The orders page lists sources and cancellations searches and pageshttp::orders::tests::the_orders_page_lists_sources_and_cancellations_searches_and_pages135 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_page78 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_check42 ms
- ✓Updating the base currency persists and shows on the store pagehttp::orders::tests::updating_the_base_currency_persists_and_shows_on_the_store_page76 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_page81 ms
- ✓Updating the confirmation threshold to zero is acceptedhttp::orders::tests::updating_the_confirmation_threshold_to_zero_is_accepted73 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_error72 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_page89 ms
- ✓With a single key storage backend no choice is shownhttp::orders::tests::with_a_single_key_storage_backend_no_choice_is_shown89 ms
monokulo::http::pay222.1 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_order98 ms
- ✓A retried order creation with one key makes one orderhttp::pay::tests::a_retried_order_creation_with_one_key_makes_one_order98 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_order107 ms
- ✓An orders description reaches the engine and bad ones are refusedhttp::pay::tests::an_orders_description_reaches_the_engine_and_bad_ones_are_refused85 ms
- ✓An unavailable or rateless provider falls through to the next preferredhttp::pay::tests::an_unavailable_or_rateless_provider_falls_through_to_the_next_preferred100 ms
- ✓Client library is served as javascript and calls monokulos own endpointshttp::pay::tests::client_library_is_served_as_javascript_and_calls_monokulos_own_endpoints39 ms
- ✓An order waits for its stores policy edithttp::pay::tests::an_order_waits_for_its_stores_policy_edit181 ms
- ✓Creating a real order records local fiat metadatahttp::pay::tests::creating_a_real_order_records_local_fiat_metadata80 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_id93 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_engine95 ms
- ✓Creating an order for an unknown public key returns 404http::pay::tests::creating_an_order_for_an_unknown_public_key_returns_40446 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_provider83 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_error92 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_50085 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_engine73 ms
- ✓Every static file the pages reference is served with its typehttp::pay::tests::every_static_file_the_pages_reference_is_served_with_its_type93 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_sided122 ms
- ✓Malformed stored threshold cannot fall back to zero confhttp::pay::tests::malformed_stored_threshold_cannot_fall_back_to_zero_conf78 ms
- ✓Only the checkout refreshes by itselfhttp::pay::tests::only_the_checkout_refreshes_by_itself110 ms
- ✓Only the store itself can forward its plugin errorshttp::pay::tests::only_the_store_itself_can_forward_its_plugin_errors84 ms
- ✓Threshold database failure rejects order even with zero conf defaulthttp::pay::tests::threshold_database_failure_rejects_order_even_with_zero_conf_default77 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_cache140 ms
monokulo::http::pos262.3 s
- ✓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_status82 ms
- ✓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_more95 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_cancelled80 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_back90 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_configured74 ms
- ✓Backgrounding and cancelling an order are sent on its live streamhttp::pos::tests::backgrounding_and_cancelling_an_order_are_sent_on_its_live_stream81 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_error111 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_cancelled94 ms
- ✓Creating a pos order rejects a malformed amounthttp::pos::tests::creating_a_pos_order_rejects_a_malformed_amount76 ms
- ✓Creating a pos order rejects an empty amounthttp::pos::tests::creating_a_pos_order_rejects_an_empty_amount81 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_user113 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_dashboard80 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_id73 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_id84 ms
- ✓Production pos assets are served with browser mime typeshttp::pos::tests::production_pos_assets_are_served_with_browser_mime_types42 ms
- ✓Pending order can be backgrounded listed reopened and cancelledhttp::pos::tests::pending_order_can_be_backgrounded_listed_reopened_and_cancelled114 ms
- ✓The events stream reports every watched order and pushes changeshttp::pos::tests::the_events_stream_reports_every_watched_order_and_pushes_changes74 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_finished125 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_connection73 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_request118 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_user117 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_currency83 ms
- ✓The pos page requires authenticationhttp::pos::tests::the_pos_page_requires_authentication88 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_user111 ms
- ✓The status endpoint 404s for an unknown order idhttp::pos::tests::the_status_endpoint_404s_for_an_unknown_order_id74 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_order87 ms
monokulo::http::pos::pure_logic_tests647 ms
- ✓A double spend is flagged regardless of statushttp::pos::pure_logic_tests::a_double_spend_is_flagged_regardless_of_status8 ms
- ✓A partial payment is flagged as underpaidhttp::pos::pure_logic_tests::a_partial_payment_is_flagged_as_underpaid7 ms
- ✓A plain paid order has no errorhttp::pos::pure_logic_tests::a_plain_paid_order_has_no_error6 ms
- ✓A pending unconfirmed or confirming order has no errorhttp::pos::pure_logic_tests::a_pending_unconfirmed_or_confirming_order_has_no_error8 ms
- ✓An expired order is flaggedhttp::pos::pure_logic_tests::an_expired_order_is_flagged9 ms
- ✓An overpaid order is flaggedhttp::pos::pure_logic_tests::an_overpaid_order_is_flagged9 ms
monokulo::http::pos_logs330 ms
- ✓Detail text and detail pairs are inverseshttp::pos_logs::tests::detail_text_and_detail_pairs_are_inverses10 ms
- ✓Details are flat clipped and keep no control charactershttp::pos_logs::tests::details_are_flat_clipped_and_keep_no_control_characters10 ms
- ✓Session ids kinds and order ids are checkedhttp::pos_logs::tests::session_ids_kinds_and_order_ids_are_checked10 ms
monokulo::http::query_page12581 ms
- ✓A long value opens whole on its own page or in the dialoghttp::query_page::tests::a_long_value_opens_whole_on_its_own_page_or_in_the_dialog47 ms
- ✓A write is refused and changes nothinghttp::query_page::tests::a_write_is_refused_and_changes_nothing45 ms
- ✓Every column is classifiedhttp::query_page::tests::every_column_is_classified15 ms
- ✓An admin reads monokulos database with secrets hiddenhttp::query_page::tests::an_admin_reads_monokulos_database_with_secrets_hidden46 ms
- ✓An unreachable engine says sohttp::query_page::tests::an_unreachable_engine_says_so46 ms
- ✓Every query is logged with who ran ithttp::query_page::tests::every_query_is_logged_with_who_ran_it48 ms
- ✓Fixi gets only the results and a database switch gets the workspacehttp::query_page::tests::fixi_gets_only_the_results_and_a_database_switch_gets_the_workspace47 ms
- ✓Only an admin gets the pagehttp::query_page::tests::only_an_admin_gets_the_page59 ms
- ✓Switched off the page is gone and so is its linkhttp::query_page::tests::switched_off_the_page_is_gone_and_so_is_its_link62 ms
- ✓The engines database is read over httphttp::query_page::tests::the_engines_database_is_read_over_http71 ms
- ✓The rows download as csv and jsonhttp::query_page::tests::the_rows_download_as_csv_and_json47 ms
- ✓While a query runs the next is refused with a 429http::query_page::tests::while_a_query_runs_the_next_is_refused_with_a_42948 ms
monokulo::http::signup18 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_address8 ms
monokulo::http::status_page673 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_help9 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_background35 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_backward8 ms
- ✓Relative time picks the right buckethttp::status_page::tests::relative_time_picks_the_right_bucket7 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_leaves7 ms
- ✓The status page says when block headers are read firsthttp::status_page::tests::the_status_page_says_when_block_headers_are_read_first7 ms
monokulo::http::status_page::http_tests121.1 s
- ✓Announcements are shown to admins onlyhttp::status_page::tests::http_tests::announcements_are_shown_to_admins_only28 ms
- ✓A remote engine past its instance limit shows the dot busy not red over httphttp::status_page::tests::http_tests::a_remote_engine_past_its_instance_limit_shows_the_dot_busy_not_red_over_http50 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_refetching38 ms
- ✓Proof of work checking is shown to admins onlyhttp::status_page::tests::http_tests::proof_of_work_checking_is_shown_to_admins_only52 ms
- ✓Requests that arrive during a fetch share ithttp::status_page::tests::http_tests::requests_that_arrive_during_a_fetch_share_it36 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_node8 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_networks45 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_run45 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_http30 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_http29 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_networks40 ms
- ✓Monokulos own calls to an embedded engine keep the status dot greenhttp::status_page::tests::http_tests::monokulos_own_calls_to_an_embedded_engine_keep_the_status_dot_green681 ms
monokulo::http::telemetry_client328 ms
- ✓A report that is not json is refusedhttp::telemetry_client::tests::a_report_that_is_not_json_is_refused6 ms
- ✓Texts are clipped and lose their control charactershttp::telemetry_client::tests::texts_are_clipped_and_lose_their_control_characters8 ms
- ✓Pages about a store report only once it opted inhttp::telemetry_client::tests::pages_about_a_store_report_only_once_it_opted_in14 ms
monokulo::http::wallets151.5 s
- ✓A brought in wallet is registered named and listedhttp::wallets::tests::a_brought_in_wallet_is_registered_named_and_listed102 ms
- ✓A brought in wallet records which app it is inhttp::wallets::tests::a_brought_in_wallet_records_which_app_it_is_in93 ms
- ✓A name in use is refused before any phrase is madehttp::wallets::tests::a_name_in_use_is_refused_before_any_phrase_is_made93 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_backup95 ms
- ✓A retired wallet comes back only with its own keyshttp::wallets::tests::a_retired_wallet_comes_back_only_with_its_own_keys97 ms
- ✓A store made before wallets gets its wallethttp::wallets::tests::a_store_made_before_wallets_gets_its_wallet96 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_typed99 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_phrase102 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_javascript90 ms
- ✓Changing a stores wallet asks first then records it everywherehttp::wallets::tests::changing_a_stores_wallet_asks_first_then_records_it_everywhere115 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_kept93 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_you98 ms
- ✓Someone elses wallet is not foundhttp::wallets::tests::someone_elses_wallet_is_not_found112 ms
- ✓Two stores on one wallet get different order addresseshttp::wallets::tests::two_stores_on_one_wallet_get_different_order_addresses98 ms
- ✓The wallet card asks first and refuses another networkhttp::wallets::tests::the_wallet_card_asks_first_and_refuses_another_network111 ms
monokulo::options_file4316 ms
- ✓Init writes the options file where xdg says and never overwrites itinit_writes_the_options_file_where_xdg_says_and_never_overwrites_it58 ms
- ✓Monokulo does not start on a file it cannot usemonokulo_does_not_start_on_a_file_it_cannot_use52 ms
- ✓Settings for the other engine mode stop monokulosettings_for_the_other_engine_mode_stop_monokulo34 ms
- ✓Monokulo starts without a file and follows onemonokulo_starts_without_a_file_and_follows_one172 ms
monokulo::settings102.3 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_it6 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_one34 ms
- ✓Exchange rates default to the keyless public providerssettings::tests::exchange_rates_default_to_the_keyless_public_providers38 ms
- ✓Public url is none until set and then normalizedsettings::tests::public_url_is_none_until_set_and_then_normalized9 ms
- ✓The command line wins over the options filesettings::tests::the_command_line_wins_over_the_options_file7 ms
- ✓The engine mode decides whether its url and token are wantedsettings::tests::the_engine_mode_decides_whether_its_url_and_token_are_wanted27 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_required9 ms
- ✓Saved settings reach the engine client exchange rates and abuse protectionsettings::tests::saved_settings_reach_the_engine_client_exchange_rates_and_abuse_protection96 ms
- ✓The webhook delivery keep periods load and bad ones stop monokulosettings::tests::the_webhook_delivery_keep_periods_load_and_bad_ones_stop_monokulo62 ms
- ✓The onion listener starts moves and stops when savedsettings::tests::the_onion_listener_starts_moves_and_stops_when_saved2.1 s
monokulo::stores659 ms
- ✓A description is one trimmed line of up to 140 charactersstores::tests::a_description_is_one_trimmed_line_of_up_to_140_characters12 ms
- ✓A name is tidied and must be therestores::tests::a_name_is_tidied_and_must_be_there12 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_schemes9 ms
- ✓Local and onion sites link over plain httpstores::tests::local_and_onion_sites_link_over_plain_http7 ms
- ✓What cant be a site says whystores::tests::what_cant_be_a_site_says_why8 ms
monokulo::views1081 ms
- ✓A network badge always says the network and marks mainnet apartviews::tests::a_network_badge_always_says_the_network_and_marks_mainnet_apart8 ms
- ✓Logs links are for admins and quote the valueviews::tests::logs_links_are_for_admins_and_quote_the_value8 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_in8 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_menu9 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_enhancement7 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_controls8 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_order9 ms
- ✓Theme hover moves the thumb and recolors only the hovered iconviews::tests::theme_hover_moves_the_thumb_and_recolors_only_the_hovered_icon8 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_target8 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_theme8 ms
monokulo::views::account797 ms
- ✓Tabs are named by their query and profile is the defaultviews::account::tests::tabs_are_named_by_their_query_and_profile_is_the_default7 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_saved17 ms
- ✓The profile tab asks for the current password and the new one twiceviews::account::tests::the_profile_tab_asks_for_the_current_password_and_the_new_one_twice14 ms
- ✓A save says what it savedviews::account::tests::a_save_says_what_it_saved26 ms
- ✓The theme choice previews each theme and marks the chosen oneviews::account::tests::the_theme_choice_previews_each_theme_and_marks_the_chosen_one8 ms
- ✓The profile tab has email appearance language and time and password cards and one save barviews::account::tests::the_profile_tab_has_email_appearance_language_and_time_and_password_cards_and_one_save_bar18 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_own7 ms
monokulo::views::admin35932 ms
- ✓A network is closed until it has nodes or storesviews::admin::tests::a_network_is_closed_until_it_has_nodes_or_stores11 ms
- ✓A nodes status is said in wordsviews::admin::tests::a_nodes_status_is_said_in_words10 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_script11 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_typed11 ms
- ✓A setting the map does not know goes to otherviews::admin::tests::a_setting_the_map_does_not_know_goes_to_other8 ms
- ✓A setting shows its name then help then controlviews::admin::tests::a_setting_shows_its_name_then_help_then_control9 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_general8 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_to114 ms
- ✓A toast says how a save wentviews::admin::tests::a_toast_says_how_a_save_went107 ms
- ✓A tab is marked while something on it needs attentionviews::admin::tests::a_tab_is_marked_while_something_on_it_needs_attention115 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_rows8 ms
- ✓Admin invites page shows no pending message when emptyviews::admin::tests::admin_invites_page_shows_no_pending_message_when_empty8 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_page8 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_ends7 ms
- ✓After a save focus lands where it says what it didviews::admin::tests::after_a_save_focus_lands_where_it_says_what_it_did12 ms
- ✓Banners are above the tab bar on every tabviews::admin::tests::banners_are_above_the_tab_bar_on_every_tab17 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_owner11 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_on9 ms
- ✓Each networks proof of work switch is in its own blockviews::admin::tests::each_networks_proof_of_work_switch_is_in_its_own_block11 ms
- ✓Every setting known today has a named tabviews::admin::tests::every_setting_known_today_has_a_named_tab24 ms
- ✓Every tab copes with an engine it cannot reachviews::admin::tests::every_tab_copes_with_an_engine_it_cannot_reach17 ms
- ✓Each tab shows only its own settingsviews::admin::tests::each_tab_shows_only_its_own_settings27 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
- ✓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_one9 ms
- ✓General is the default and the open tab is marked currentviews::admin::tests::general_is_the_default_and_the_open_tab_is_marked_current16 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_after8 ms
- ✓Notices render with their level and restart only fields say soviews::admin::tests::notices_render_with_their_level_and_restart_only_fields_say_so9 ms
- ✓Setup page shows the echoed email and an errorviews::admin::tests::setup_page_shows_the_echoed_email_and_an_error8 ms
- ✓The instance rate limit count is disabled while its switch is offviews::admin::tests::the_instance_rate_limit_count_is_disabled_while_its_switch_is_off10 ms
- ✓Tabs with two owners head each groupviews::admin::tests::tabs_with_two_owners_head_each_group13 ms
- ✓The other tab shows only with something in itviews::admin::tests::the_other_tab_shows_only_with_something_in_it88 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_page93 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_again86 ms
- ✓The tab list covers both registriesviews::admin::tests::the_tab_list_covers_both_registries9 ms
- ✓What is wrong shows where it isviews::admin::tests::what_is_wrong_shows_where_it_is11 ms
monokulo::views::auth975 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_raw8 ms
- ✓Login page has no hidden next field when absentviews::auth::tests::login_page_has_no_hidden_next_field_when_absent9 ms
- ✓Login page includes a hidden next field when presentviews::auth::tests::login_page_includes_a_hidden_next_field_when_present8 ms
- ✓Login page renders with no errorviews::auth::tests::login_page_renders_with_no_error8 ms
- ✓Login page shows the error when presentviews::auth::tests::login_page_shows_the_error_when_present9 ms
- ✓Signup fields are labelled and say the password ruleviews::auth::tests::signup_fields_are_labelled_and_say_the_password_rule8 ms
- ✓Signup page renders with no errorviews::auth::tests::signup_page_renders_with_no_error7 ms
- ✓Signup page shows the error when presentviews::auth::tests::signup_page_shows_the_error_when_present9 ms
- ✓Signup page shows the invite required message and hides the formviews::auth::tests::signup_page_shows_the_invite_required_message_and_hides_the_form9 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::checkout19374 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_on8 ms
- ✓Checkout page lists payments when presentviews::checkout::tests::checkout_page_lists_payments_when_present8 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_capture77 ms
- ✓Checkout page keeps the refund field editable after savingviews::checkout::tests::checkout_page_keeps_the_refund_field_editable_after_saving85 ms
- ✓Checkout page meta refreshes once a minute only without javascriptviews::checkout::tests::checkout_page_meta_refreshes_once_a_minute_only_without_javascript77 ms
- ✓Compact view uses the same payment markup and stageviews::checkout::tests::compact_view_uses_the_same_payment_markup_and_stage8 ms
- ✓Checkout page stops meta refreshing once the order is terminalviews::checkout::tests::checkout_page_stops_meta_refreshing_once_the_order_is_terminal9 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_detected11 ms
- ✓Live fragment carries every changing region and nothing elseviews::checkout::tests::live_fragment_carries_every_changing_region_and_nothing_else9 ms
- ✓Full payment hides deadline and overpayment explains excessviews::checkout::tests::full_payment_hides_deadline_and_overpayment_explains_excess9 ms
- ✓Not found page renders with no navviews::checkout::tests::not_found_page_renders_with_no_nav7 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_found7 ms
- ✓Refund flag hides the entire refund sectionviews::checkout::tests::refund_flag_hides_the_entire_refund_section8 ms
- ✓Partial payment shows remaining amount and deadlineviews::checkout::tests::partial_payment_shows_remaining_amount_and_deadline9 ms
- ✓Share page wraps the iframe with the site nav when foundviews::checkout::tests::share_page_wraps_the_iframe_with_the_site_nav_when_found8 ms
- ✓The checkout names who is asking and for whatviews::checkout::tests::the_checkout_names_who_is_asking_and_for_what9 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_over8 ms
- ✓The track has no confirm step when one payment is enoughviews::checkout::tests::the_track_has_no_confirm_step_when_one_payment_is_enough8 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_leaves9 ms
monokulo::views::connect215 ms
- ✓A shop that cant connect says why and shows no formviews::connect::tests::a_shop_that_cant_connect_says_why_and_shows_no_form7 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_button8 ms
monokulo::views::controls2116 ms
- ✓A switch is named so off is sent tooviews::controls::tests::a_switch_is_named_so_off_is_sent_too8 ms
- ✓Every select is the dropdown componentviews::controls::tests::every_select_is_the_dropdown_component108 ms
monokulo::views::create_order4217 ms
- ✓Locks currency to xmr when no provider is availableviews::create_order::tests::locks_currency_to_xmr_when_no_provider_is_available100 ms
- ✓A rejected submission keeps its values and its request keyviews::create_order::tests::a_rejected_submission_keeps_its_values_and_its_request_key100 ms
- ✓Shows the create order error when presentviews::create_order::tests::shows_the_create_order_error_when_present8 ms
- ✓Renders the form with a merchant reference fieldviews::create_order::tests::renders_the_form_with_a_merchant_reference_field9 ms
monokulo::views::domains216 ms
- ✓A refused domain keeps what was typed and says why beside itviews::domains::tests::a_refused_domain_keeps_what_was_typed_and_says_why_beside_it9 ms
- ✓The check says not checked not found or verifiedviews::domains::tests::the_check_says_not_checked_not_found_or_verified7 ms
monokulo::views::engine429 ms
- ✓A segment places its shapes in its lengthviews::engine::tests::a_segment_places_its_shapes_in_its_length7 ms
- ✓Labels go on the lowest level they are clear onviews::engine::tests::labels_go_on_the_lowest_level_they_are_clear_on7 ms
- ✓The strip draws short spans whole and cuts long onesviews::engine::tests::the_strip_draws_short_spans_whole_and_cuts_long_ones7 ms
- ✓The strip is as tall as its labels levelsviews::engine::tests::the_strip_is_as_tall_as_its_labels_levels8 ms
monokulo::views::home537 ms
- ✓A long order id is shortened with the whole in reachviews::home::tests::a_long_order_id_is_shortened_with_the_whole_in_reach7 ms
- ✓A store without a wallet offers to link oneviews::home::tests::a_store_without_a_wallet_offers_to_link_one8 ms
- ✓Never shows a meta refreshviews::home::tests::never_shows_a_meta_refresh7 ms
- ✓Lists stores as cards and recent orders when presentviews::home::tests::lists_stores_as_cards_and_recent_orders_when_present7 ms
- ✓Shows the add store cta when the user has no storesviews::home::tests::shows_the_add_store_cta_when_the_user_has_no_stores8 ms
monokulo::views::key_entry3177 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_run7 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_named88 ms
- ✓Keys are required only when they must be typedviews::key_entry::tests::keys_are_required_only_when_they_must_be_typed82 ms
monokulo::views::orders11166 ms
- ✓A middle page links newer and older keeping the searchviews::orders::tests::a_middle_page_links_newer_and_older_keeping_the_search82 ms
- ✓An expired order with no payments says none were made and offers nothingviews::orders::tests::an_expired_order_with_no_payments_says_none_were_made_and_offers_nothing8 ms
- ✓An order with no payments says none have been made and offers its linkviews::orders::tests::an_order_with_no_payments_says_none_have_been_made_and_offers_its_link8 ms
- ✓A paid order ends its timeline paidviews::orders::tests::a_paid_order_ends_its_timeline_paid9 ms
- ✓Detail page shows a not found state when order is noneviews::orders::tests::detail_page_shows_a_not_found_state_when_order_is_none7 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_detected9 ms
- ✓Detail page shows the double spend row when one was detectedviews::orders::tests::detail_page_shows_the_double_spend_row_when_one_was_detected8 ms
- ✓Detail page uses order breadcrumbviews::orders::tests::detail_page_uses_order_breadcrumb8 ms
- ✓List page shortens a long order id inside a plain linkviews::orders::tests::list_page_shortens_a_long_order_id_inside_a_plain_link10 ms
- ✓List page links to each order detail pageviews::orders::tests::list_page_links_to_each_order_detail_page10 ms
- ✓Payments read newest first with a reversal markedviews::orders::tests::payments_read_newest_first_with_a_reversal_marked7 ms
monokulo::views::pos18 ms
- ✓Renders solid mount with store config and no site navviews::pos::tests::renders_solid_mount_with_store_config_and_no_site_nav8 ms
monokulo::views::query4110 ms
- ✓A long json value is pretty printed wholeviews::query::tests::a_long_json_value_is_pretty_printed_whole8 ms
- ✓A refused statement says whyviews::query::tests::a_refused_statement_says_why6 ms
- ✓Rows show their kinds and a wide result says it scrollsviews::query::tests::rows_show_their_kinds_and_a_wide_result_says_it_scrolls7 ms
- ✓Nothing run yet offers examples and says what the page can doviews::query::tests::nothing_run_yet_offers_examples_and_says_what_the_page_can_do89 ms
monokulo::views::scaling8217 ms
- ✓Figures read as people write themviews::scaling::tests::figures_read_as_people_write_them82 ms
- ✓Different machines are shown apart and a silent engine says soviews::scaling::tests::different_machines_are_shown_apart_and_a_silent_engine_says_so87 ms
- ✓One machine stacks engine under monokulo with the total and splitviews::scaling::tests::one_machine_stacks_engine_under_monokulo_with_the_total_and_split8 ms
- ✓Samples land on their slot and missing ones are gapsviews::scaling::tests::samples_land_on_their_slot_and_missing_ones_are_gaps8 ms
- ✓One process splits cpu and shows memory onceviews::scaling::tests::one_process_splits_cpu_and_shows_memory_once9 ms
- ✓The scanning panel says what sets the pace and whyviews::scaling::tests::the_scanning_panel_says_what_sets_the_pace_and_why7 ms
- ✓The block size tile gives the average and its trendviews::scaling::tests::the_block_size_tile_gives_the_average_and_its_trend8 ms
- ✓The link tiles follow the node in useviews::scaling::tests::the_link_tiles_follow_the_node_in_use8 ms
monokulo::views::settings645 ms
- ✓A card says how the last save wentviews::settings::tests::a_card_says_how_the_last_save_went7 ms
- ✓A cards own attributes are escapedviews::settings::tests::a_cards_own_attributes_are_escaped8 ms
- ✓A form saves with fixi or reloads as its page asksviews::settings::tests::a_form_saves_with_fixi_or_reloads_as_its_page_asks8 ms
- ✓A setting has its label its changed mark and its helpviews::settings::tests::a_setting_has_its_label_its_changed_mark_and_its_help8 ms
- ✓The save bar saves and discardsviews::settings::tests::the_save_bar_saves_and_discards7 ms
- ✓A toast links to the card it is aboutviews::settings::tests::a_toast_links_to_the_card_it_is_about7 ms
monokulo::views::setup10327 ms
- ✓Bringing your own wallet has two small stepsviews::setup::tests::bringing_your_own_wallet_has_two_small_steps7 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_not8 ms
- ✓Done lists the checkout the plugin and the tillviews::setup::tests::done_lists_the_checkout_the_plugin_and_the_till95 ms
- ✓From the plugin the site is the shops and fixedviews::setup::tests::from_the_plugin_the_site_is_the_shops_and_fixed87 ms
- ✓From the plugin back to woocommerce is the primaryviews::setup::tests::from_the_plugin_back_to_woocommerce_is_the_primary88 ms
- ✓Progress counts completed wallet tasksviews::setup::tests::progress_counts_completed_wallet_tasks8 ms
- ✓The store step asks a name and an optional websiteviews::setup::tests::the_store_step_asks_a_name_and_an_optional_website9 ms
- ✓The steps never say done before the store existsviews::setup::tests::the_steps_never_say_done_before_the_store_exists9 ms
- ✓With a site the guide is the primaryviews::setup::tests::with_a_site_the_guide_is_the_primary8 ms
- ✓With no site the till is the primaryviews::setup::tests::with_no_site_the_till_is_the_primary8 ms
monokulo::views::shorten216 ms
- ✓A shortened value never shows three dotsviews::shorten::tests::a_shortened_value_never_shows_three_dots8 ms
- ✓A shortened value shows the short text over the wholeviews::shorten::tests::a_shortened_value_shows_the_short_text_over_the_whole8 ms
monokulo::views::status17405 ms
- ✓A non admin sees no proof of workviews::status::tests::a_non_admin_sees_no_proof_of_work8 ms
- ✓A slow block is announced at the topviews::status::tests::a_slow_block_is_announced_at_the_top7 ms
- ✓Each verdict is shown in wordsviews::status::tests::each_verdict_is_shown_in_words8 ms
- ✓A trust mismatch is a red alert at the topviews::status::tests::a_trust_mismatch_is_a_red_alert_at_the_top8 ms
- ✓Each node is a card on a phoneviews::status::tests::each_node_is_a_card_on_a_phone8 ms
- ✓Shows no configured networks message when networks is emptyviews::status::tests::shows_no_configured_networks_message_when_networks_is_empty8 ms
- ✓Shows a node row and its error when unreachableviews::status::tests::shows_a_node_row_and_its_error_when_unreachable8 ms
- ✓Shows a plain error banner when the engine is unreachableviews::status::tests::shows_a_plain_error_banner_when_the_engine_is_unreachable8 ms
- ✓The held state offers a new anchorviews::status::tests::the_held_state_offers_a_new_anchor8 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_it9 ms
- ✓The facts fold under how its checkedviews::status::tests::the_facts_fold_under_how_its_checked103 ms
- ✓The scanner is one lineviews::status::tests::the_scanner_is_one_line96 ms
- ✓The window fourteen behindviews::status::tests::the_window_fourteen_behind94 ms
- ✓The window when caught upviews::status::tests::the_window_when_caught_up8 ms
- ✓The window three behindviews::status::tests::the_window_three_behind8 ms
- ✓The window with the anchor inside or olderviews::status::tests::the_window_with_the_anchor_inside_or_older8 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_only8 ms
monokulo::views::store_detail761 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_counts8 ms
- ✓Links to the settings page and widget pagesviews::store_detail::tests::links_to_the_settings_page_and_widget_pages9 ms
- ✓Renders not found state when store is noneviews::store_detail::tests::renders_not_found_state_when_store_is_none8 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_endpoint8 ms
- ✓Shows the lookup message when presentviews::store_detail::tests::shows_the_lookup_message_when_present10 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_host9 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_cannot9 ms
monokulo::views::store_settings21416 ms
- ✓A hostile currency list is escapedviews::store_settings::tests::a_hostile_currency_list_is_escaped8 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_sent9 ms
- ✓A refused action shows why in its own cardviews::store_settings::tests::a_refused_action_shows_why_in_its_own_card9 ms
- ✓A tier is added in the blank rowviews::store_settings::tests::a_tier_is_added_in_the_blank_row83 ms
- ✓Accepting unconfirmed payments is a switchviews::store_settings::tests::accepting_unconfirmed_payments_is_a_switch83 ms
- ✓A save says which cards it savedviews::store_settings::tests::a_save_says_which_cards_it_saved91 ms
- ✓Confirmations required input is narrow and capped at three digitsviews::store_settings::tests::confirmations_required_input_is_narrow_and_capped_at_three_digits9 ms
- ✓Diagnostics are a switch off until turned onviews::store_settings::tests::diagnostics_are_a_switch_off_until_turned_on9 ms
- ✓Each tab shows its own cardsviews::store_settings::tests::each_tab_shows_its_own_cards10 ms
- ✓Renders not found state when store is noneviews::store_settings::tests::renders_not_found_state_when_store_is_none9 ms
- ✓Says when the webhooks could not be readviews::store_settings::tests::says_when_the_webhooks_could_not_be_read9 ms
- ✓Shows store context above the settings headingviews::store_settings::tests::shows_store_context_above_the_settings_heading8 ms
- ✓Shows the webhook signing secret exactly once after creationviews::store_settings::tests::shows_the_webhook_signing_secret_exactly_once_after_creation8 ms
- ✓The default heads the tiers without a removeviews::store_settings::tests::the_default_heads_the_tiers_without_a_remove8 ms
- ✓The default haveno limits render as plain numbersviews::store_settings::tests::the_default_haveno_limits_render_as_plain_numbers9 ms
- ✓The haveno limits show the stores current valuesviews::store_settings::tests::the_haveno_limits_show_the_stores_current_values9 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_haveno9 ms
- ✓The restriction banner needs a verified domain to turn onviews::store_settings::tests::the_restriction_banner_needs_a_verified_domain_to_turn_on9 ms
- ✓The tab shown is the one asked for or the one just saved onviews::store_settings::tests::the_tab_shown_is_the_one_asked_for_or_the_one_just_saved_on7 ms
- ✓Verified domains are cards with their actions at the topviews::store_settings::tests::verified_domains_are_cards_with_their_actions_at_the_top9 ms
- ✓Tiers read smallest first and can be removed even at the limitviews::store_settings::tests::tiers_read_smallest_first_and_can_be_removed_even_at_the_limit11 ms
monokulo::views::store_site6305 ms
- ✓A connected plugin locks the website and lists in connectionsviews::store_site::tests::a_connected_plugin_locks_the_website_and_lists_in_connections8 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_paid90 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_name94 ms
- ✓Changing the website is blocked while a plugin is connectedviews::store_site::tests::changing_the_website_is_blocked_while_a_plugin_is_connected96 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_changing8 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
monokulo::views::theme_tests7139 ms
- ✓Both dark blocks agree and only override light tokensviews::theme_tests::both_dark_blocks_agree_and_only_override_light_tokens8 ms
- ✓Every pill and chip is padded with the pill tokensviews::theme_tests::every_pill_and_chip_is_padded_with_the_pill_tokens19 ms
- ✓Text and controls are legible in both themesviews::theme_tests::text_and_controls_are_legible_in_both_themes7 ms
- ✓The browsers own control parts follow the theme in useviews::theme_tests::the_browsers_own_control_parts_follow_the_theme_in_use7 ms
- ✓The checks catch what they are forviews::theme_tests::the_checks_catch_what_they_are_for6 ms
- ✓Every token a page uses is declaredviews::theme_tests::every_token_a_page_uses_is_declared47 ms
- ✓No colour is defined outside theme cssviews::theme_tests::no_colour_is_defined_outside_theme_css45 ms
monokulo::views::time298 ms
- ✓A chosen zone wins then the browsers then utcviews::time::tests::a_chosen_zone_wins_then_the_browsers_then_utc7 ms
- ✓Times read as day month and clock time in the zoneviews::time::tests::times_read_as_day_month_and_clock_time_in_the_zone91 ms
monokulo::views::wallets15271 ms
- ✓A retired wallets page offers restore at the bottomviews::wallets::tests::a_retired_wallets_page_offers_restore_at_the_bottom89 ms
- ✓A wallets page is one column in the agreed orderviews::wallets::tests::a_wallets_page_is_one_column_in_the_agreed_order84 ms
- ✓No wallets says so and offers to add oneviews::wallets::tests::no_wallets_says_so_and_offers_to_add_one7 ms
- ✓Mainnet wallets are the list with no foldviews::wallets::tests::mainnet_wallets_are_the_list_with_no_fold7 ms
- ✓Mixed wallets put mainnet first and fold the test ones shutviews::wallets::tests::mixed_wallets_put_mainnet_first_and_fold_the_test_ones_shut8 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_name7 ms
- ✓Retire is blocked by orders until about whenviews::wallets::tests::retire_is_blocked_by_orders_until_about_when8 ms
- ✓Retire is blocked by a store with its fix beside itviews::wallets::tests::retire_is_blocked_by_a_store_with_its_fix_beside_it8 ms
- ✓Retire waits when monokulo cant checkviews::wallets::tests::retire_waits_when_monokulo_cant_check6 ms
- ✓The setup network dropdown shows each networks badgeviews::wallets::tests::the_setup_network_dropdown_shows_each_networks_badge8 ms
- ✓The no javascript pages hold the dialogs contentviews::wallets::tests::the_no_javascript_pages_hold_the_dialogs_content9 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_muted7 ms
- ✓The wallets already added show each wallets networkviews::wallets::tests::the_wallets_already_added_show_each_wallets_network8 ms
- ✓Where it lives says which app holds the keysviews::wallets::tests::where_it_lives_says_which_app_holds_the_keys7 ms
- ✓With only test wallets the fold starts open and says whyviews::wallets::tests::with_only_test_wallets_the_fold_starts_open_and_says_why8 ms
node-settings (real binaries)114.9 s
- ✓A node saved on a fresh instance applies straight away, and the warnings worknode-settings.spec.js14.9 s
settings-section-updates (real binaries)619.0 s
- ✓Saving an admin settings tab swaps only its panel, and the tab bar and banners stay wholesettings-section-updates.spec.js3.2 s
- ✓A value either check refuses saves nothing, and every change stays to fix or discardsettings-section-updates.spec.js2.6 s
- ✓A http failure restores Save and allows retrysettings-section-updates.spec.js1.9 s
- ✓A network failure restores Save and allows retrysettings-section-updates.spec.js1.9 s
- ✓Leaving a tab with unsaved changes asks first, and Save and go saves then goessettings-section-updates.spec.js4.0 s
- ✓A store settings save that is refused shows why on its card, and an action on its own cardsettings-section-updates.spec.js5.4 s
site-themes (real binaries)143.0 s
- ✓The site, the POS and the hosted payment page share one theme, light and darksite-themes.spec.js43.0 s
store-key-custody (real binaries)17.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.js7.4 s
Key custody 16 groups12149.6 s
engine-test-support::snp3273 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_snp82 ms
- ✓An upgraded engine takes the master key over httptests::snp::an_upgraded_engine_takes_the_master_key_over_http98 ms
- ✓Order creation and chain scanning behave identically on the snp backendtests::snp::order_creation_and_chain_scanning_behave_identically_on_the_snp_backend93 ms
key-custody-cli::tests417 ms
- ✓A bundle comes from its address or a filetests::a_bundle_comes_from_its_address_or_a_file5 ms
- ✓A trusted id key given replaces the official one and is flaggedtests::a_trusted_id_key_given_replaces_the_official_one_and_is_flagged4 ms
- ✓A bundle of another format names the cli to gettests::a_bundle_of_another_format_names_the_cli_to_get4 ms
- ✓Keys are two 32 byte hex valuestests::keys_are_two_32_byte_hex_values4 ms
key-custody::custody16 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_rest6 ms
key-custody::outputs1182 ms
- ✓A payment made with an outputs own key is foundoutputs::tests::a_payment_made_with_an_outputs_own_key_is_found7 ms
- ✓A payment without a view tag is foundoutputs::tests::a_payment_without_a_view_tag_is_found8 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_other8 ms
- ✓A transaction without a key or without outputs pays nobodyoutputs::tests::a_transaction_without_a_key_or_without_outputs_pays_nobody6 ms
- ✓A view tagged payment is found among other peoples outputsoutputs::tests::a_view_tagged_payment_is_found_among_other_peoples_outputs8 ms
- ✓An amount that does not open costs the other outputs nothingoutputs::tests::an_amount_that_does_not_open_costs_the_other_outputs_nothing9 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_key6 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_amount9 ms
- ✓An output with the wrong view tag is not a paymentoutputs::tests::an_output_with_the_wrong_view_tag_is_not_a_payment6 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
key-custody::plain17153 ms
- ✓A batch scan says which of its transactions pay the walletplain::tests::a_batch_scan_says_which_of_its_transactions_pay_the_wallet10 ms
- ✓A large lookup range builds in reusable bounded batchesplain::tests::a_large_lookup_range_builds_in_reusable_bounded_batches16 ms
- ✓An absurdly wide scan range is refused rather than hanging foreverplain::tests::an_absurdly_wide_scan_range_is_refused_rather_than_hanging_forever10 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_overflowing7 ms
- ✓Cancelling a scan preserves the next payment matchplain::tests::cancelling_a_scan_preserves_the_next_payment_match9 ms
- ✓Concurrent registrations and removals never cross wires between walletsplain::tests::concurrent_registrations_and_removals_never_cross_wires_between_wallets9 ms
- ✓Index zero derives a standard address not an unpayable subaddressplain::tests::index_zero_derives_a_standard_address_not_an_unpayable_subaddress6 ms
- ✓Register then derive subaddress roundtripplain::tests::register_then_derive_subaddress_roundtrip6 ms
- ✓Registering the same material twice yields independent handles that both workplain::tests::registering_the_same_material_twice_yields_independent_handles_that_both_work4 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_memory4 ms
- ✓Scan tx outputs finds output paid to subaddressplain::tests::scan_tx_outputs_finds_output_paid_to_subaddress6 ms
- ✓Seal rejects truncated or overlong material instead of silently paddingplain::tests::seal_rejects_truncated_or_overlong_material_instead_of_silently_padding4 ms
- ✓Seal round trips every byte of both keys including high bytesplain::tests::seal_round_trips_every_byte_of_both_keys_including_high_bytes6 ms
- ✓Seal then unseal survives a simulated restartplain::tests::seal_then_unseal_survives_a_simulated_restart7 ms
- ✓The scan slots keep the first size they are givenplain::tests::the_scan_slots_keep_the_first_size_they_are_given4 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_set16 ms
- ✓Scans of different wallets run in parallel off the async workersplain::tests::scans_of_different_wallets_run_in_parallel_off_the_async_workers29 ms
key-custody::plain::properties1644.8 s
- ✓Cancelling queued scans preserves both cachesplain::properties::cancelling_queued_scans_preserves_both_caches233 ms
- ✓Concurrent wallet scans keep independent caches and matchesplain::properties::concurrent_wallet_scans_keep_independent_caches_and_matches420 ms
- ✓Idempotent registration sealing and removal preserve wallet identityplain::properties::idempotent_registration_sealing_and_removal_preserve_wallet_identity61 ms
- ✓Invalid material and oversized ranges cannot poison a live walletplain::properties::invalid_material_and_oversized_ranges_cannot_poison_a_live_wallet89 ms
- ✓Invalid registration ids never allocate walletsplain::properties::invalid_registration_ids_never_allocate_wallets33 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_window855 ms
- ✓Table build batches keep exact progress across window changesplain::properties::table_build_batches_keep_exact_progress_across_window_changes52 ms
- ✓Sparse window histories match fresh scans without rebuilding kept keysplain::properties::sparse_window_histories_match_fresh_scans_without_rebuilding_kept_keys2.1 s
- ✓Cancelling queued scans preserves both caches 512 casesplain::properties::cancelling_queued_scans_preserves_both_caches2.7 s
- ✓Idempotent registration sealing and removal preserve wallet identity 512 casesplain::properties::idempotent_registration_sealing_and_removal_preserve_wallet_identity472 ms
- ✓Invalid material and oversized ranges cannot poison a live wallet 512 casesplain::properties::invalid_material_and_oversized_ranges_cannot_poison_a_live_wallet786 ms
- ✓Invalid registration ids never allocate wallets 512 casesplain::properties::invalid_registration_ids_never_allocate_wallets78 ms
- ✓Concurrent wallet scans keep independent caches and matches 512 casesplain::properties::concurrent_wallet_scans_keep_independent_caches_and_matches5.7 s
- ✓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_window9.8 s
- ✓Table build batches keep exact progress across window changes 512 casesplain::properties::table_build_batches_keep_exact_progress_across_window_changes48 ms
- ✓Sparse window histories match fresh scans without rebuilding kept keys 512 casesplain::properties::sparse_window_histories_match_fresh_scans_without_rebuilding_kept_keys21.4 s
key-custody::router732 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_them5 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_live5 ms
- ✓A handle its backend no longer knows stops being liverouter::tests::a_handle_its_backend_no_longer_knows_stops_being_live5 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_retried5 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_not4 ms
- ✓A restarted backend loses only its own handlesrouter::tests::a_restarted_backend_loses_only_its_own_handles4 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_handle4 ms
key-custody::router::properties123.8 s
- ✓Backend epoch changes invalidate only the restarted backendrouter::properties::backend_epoch_changes_invalidate_only_the_restarted_backend16 ms
- ✓Cancelled registration results are recovered by the same registration idrouter::properties::cancelled_registration_results_are_recovered_by_the_same_registration_id17 ms
- ✓Registration removal and backend reload histories never cross walletsrouter::properties::registration_removal_and_backend_reload_histories_never_cross_wallets176 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_backend54 ms
- ✓Transient backend failures preserve ownership until recoveryrouter::properties::transient_backend_failures_preserve_ownership_until_recovery21 ms
- ✓Two maximum backend epochs do not panic or wraprouter::properties::two_maximum_backend_epochs_do_not_panic_or_wrap5 ms
- ✓Backend epoch changes invalidate only the restarted backend 512 casesrouter::properties::backend_epoch_changes_invalidate_only_the_restarted_backend101 ms
- ✓Cancelled registration results are recovered by the same registration id 512 casesrouter::properties::cancelled_registration_results_are_recovered_by_the_same_registration_id143 ms
- ✓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_backend611 ms
- ✓Transient backend failures preserve ownership until recovery 512 casesrouter::properties::transient_backend_failures_preserve_ownership_until_recovery231 ms
- ✓Two maximum backend epochs do not panic or wrap 512 casesrouter::properties::two_maximum_backend_epochs_do_not_panic_or_wrap7 ms
- ✓Registration removal and backend reload histories never cross wallets 512 casesrouter::properties::registration_removal_and_backend_reload_histories_never_cross_wallets2.4 s
key-custody::snp15199 ms
- ✓A guest a migration agent could export is refusedsnp::tests::a_guest_a_migration_agent_could_export_is_refused7 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_it12 ms
- ✓A merchants encrypted keys are registered sealed and survive a restartsnp::tests::a_merchants_encrypted_keys_are_registered_sealed_and_survive_a_restart10 ms
- ✓A handoff answer nobody trusted attested is refusedsnp::tests::a_handoff_answer_nobody_trusted_attested_is_refused28 ms
- ✓A signed upgrade takes the master key by handoffsnp::tests::a_signed_upgrade_takes_the_master_key_by_handoff15 ms
- ✓A wrap from another chip leaves the backend waitingsnp::tests::a_wrap_from_another_chip_leaves_the_backend_waiting9 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_older32 ms
- ✓An engine below the release firmware floor doesnt startsnp::tests::an_engine_below_the_release_firmware_floor_doesnt_start6 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_one11 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_for17 ms
- ✓An untrusted engine image does not startsnp::tests::an_untrusted_engine_image_does_not_start11 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_database19 ms
- ✓Keys in the clear are refusedsnp::tests::keys_in_the_clear_are_refused7 ms
- ✓Without amds certificates no bundle is offeredsnp::tests::without_amds_certificates_no_bundle_is_offered6 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_key9 ms
key-custody::transport672 ms
- ✓A firmware floor refuses older firmware and reads its own texttransport::tests::a_firmware_floor_refuses_older_firmware_and_reads_its_own_text10 ms
- ✓Firmware below the release floor is refused whatever the policytransport::tests::firmware_below_the_release_floor_is_refused_whatever_the_policy10 ms
- ✓Id key digests are 96 hex characterstransport::tests::id_key_digests_are_96_hex_characters5 ms
- ✓Pasted text that is not an envelope is refused plainlytransport::tests::pasted_text_that_is_not_an_envelope_is_refused_plainly5 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_to11 ms
- ✓A bundle that does not check out is refused by reasontransport::tests::a_bundle_that_does_not_check_out_is_refused_by_reason31 ms
snp-attest::guest534 ms
- ✓A missing device is reported by pathguest::tests::a_missing_device_is_reported_by_path4 ms
- ✓A derived key is bound only to a tcb already committedguest::tests::a_derived_key_is_bound_only_to_a_tcb_already_committed7 ms
- ✓A derived key changes with what it is bound toguest::tests::a_derived_key_changes_with_what_it_is_bound_to8 ms
- ✓The real device answers inside a guestguest::tests::the_real_device_answers_inside_a_guest5 ms
- ✓A test report is signed and carries its identityguest::tests::a_test_report_is_signed_and_carries_its_identity10 ms
snp-attest::id_block214 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_them4 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_verifies10 ms
snp-attest::kds416 ms
- ✓Cert chain url matches amd kds formatkds::tests::cert_chain_url_matches_amd_kds_format4 ms
- ✓Vcek url for legacy product has no fmc paramkds::tests::vcek_url_for_legacy_product_has_no_fmc_param4 ms
- ✓Hw id trimmed to 8 bytes on turin full 64 elsewherekds::tests::hw_id_trimmed_to_8_bytes_on_turin_full_64_elsewhere4 ms
- ✓Vcek url for turin includes fmc paramkds::tests::vcek_url_for_turin_includes_fmc_param4 ms
snp-attest::pinned_ark14 ms
- ✓Every pinned ark is well formed pempinned_ark::tests::every_pinned_ark_is_well_formed_pem4 ms
snp-attest::report728 ms
- ✓Identity fields are read from their offsetsreport::tests::identity_fields_are_read_from_their_offsets4 ms
- ✓Parses legacy layout offsets correctlyreport::tests::parses_legacy_layout_offsets_correctly4 ms
- ✓Parses turin layout offsets correctlyreport::tests::parses_turin_layout_offsets_correctly4 ms
- ✓Policy report data and measurement are read from their offsetsreport::tests::policy_report_data_and_measurement_are_read_from_their_offsets4 ms
- ✓Rejects unsupported sig algoreport::tests::rejects_unsupported_sig_algo4 ms
- ✓Product kds name and parse round tripreport::tests::product_kds_name_and_parse_round_trip4 ms
- ✓Rejects wrong lengthreport::tests::rejects_wrong_length4 ms
snp-attest::verify1074 ms
- ✓A certificate on the revocation list is refusedverify::tests::a_certificate_on_the_revocation_list_is_refused5 ms
- ✓An out of date revocation list is refusedverify::tests::an_out_of_date_revocation_list_is_refused7 ms
- ✓Ark self signature verifies for every productverify::tests::ark_self_signature_verifies_for_every_product8 ms
- ✓Evidence that does not lead to the pinned root is refusedverify::tests::evidence_that_does_not_lead_to_the_pinned_root_is_refused7 ms
- ✓Real ask verifies against pinned ark for every productverify::tests::real_ask_verifies_against_pinned_ark_for_every_product8 ms
- ✓Real crls verify against the pinned ark and list no askverify::tests::real_crls_verify_against_the_pinned_ark_and_list_no_ask10 ms
- ✓Report signature round trips through the little endian encodingverify::tests::report_signature_round_trips_through_the_little_endian_encoding10 ms
- ✓The vcek hw id must name the reports chipverify::tests::the_vcek_hw_id_must_name_the_reports_chip4 ms
- ✓Tampered signed region is rejectedverify::tests::tampered_signed_region_is_rejected10 ms
- ✓Wrong root is rejectedverify::tests::wrong_root_is_rejected5 ms
Storage and recovery 11 groups1312 min
engine-crash-recovery (real binaries)17.6 s
- ✓Killing the engine at random moments never loses a confirmed order or reuses an addressengine-crash-recovery.spec.js7.6 s
engine::store561.5 s
- ✓A duplicate insert cannot resurrect a voided paymentstore::tests::a_duplicate_insert_cannot_resurrect_a_voided_payment21 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_written25 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_one46 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_height23 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_mined23 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_usable26 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_users28 ms
- ✓A recompute that changes nothing writes nothingstore::tests::a_recompute_that_changes_nothing_writes_nothing23 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_erroring24 ms
- ✓A setting that was never saved reads as nonestore::tests::a_setting_that_was_never_saved_reads_as_none23 ms
- ✓A tenant config patch applies whole and knows an unknown tenantstore::tests::a_tenant_config_patch_applies_whole_and_knows_an_unknown_tenant25 ms
- ✓A transaction holds the write lock before its first readstore::tests::a_transaction_holds_the_write_lock_before_its_first_read27 ms
- ✓An order read back knows whether the scanner still examines itstore::tests::an_order_read_back_knows_whether_the_scanner_still_examines_it24 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_panic24 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_nothing25 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_idempotent23 ms
- ✓Disabled tenant is not found by its secretstore::tests::disabled_tenant_is_not_found_by_its_secret25 ms
- ✓Create and lookup tenant by secret tokenstore::tests::create_and_lookup_tenant_by_secret_token28 ms
- ✓Concurrent minor index allocation never duplicatesstore::tests::concurrent_minor_index_allocation_never_duplicates43 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_order31 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_back27 ms
- ✓Duplicate payment match is idempotentstore::tests::duplicate_payment_match_is_idempotent30 ms
- ✓Get order is scoped by tenant and returns none across tenantsstore::tests::get_order_is_scoped_by_tenant_and_returns_none_across_tenants26 ms
- ✓Foreign keys are enforced on a reopened database filestore::tests::foreign_keys_are_enforced_on_a_reopened_database_file43 ms
- ✓Get order tenant id is unscoped by designstore::tests::get_order_tenant_id_is_unscoped_by_design27 ms
- ✓In transaction rolls every write back when the closure failsstore::tests::in_transaction_rolls_every_write_back_when_the_closure_fails29 ms
- ✓List active tenants excludes disabled onesstore::tests::list_active_tenants_excludes_disabled_ones28 ms
- ✓List orders filters by status and paginates newest firststore::tests::list_orders_filters_by_status_and_paginates_newest_first27 ms
- ✓Mark double spend detected is sticky first occurrence onlystore::tests::mark_double_spend_detected_is_sticky_first_occurrence_only28 ms
- ✓Max scanned height reflects the highest recorded blockstore::tests::max_scanned_height_reflects_the_highest_recorded_block27 ms
- ✓Migration 0013 preserves orders already paid by the old ceilingstore::tests::migration_0013_preserves_orders_already_paid_by_the_old_ceiling27 ms
- ✓Migration 0004 rebuilds order payments without losing existing rowsstore::tests::migration_0004_rebuilds_order_payments_without_losing_existing_rows28 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_counter27 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_tenant28 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_it27 ms
- ✓Minor index allocation starts at one and incrementsstore::tests::minor_index_allocation_starts_at_one_and_increments28 ms
- ✓Plan status covers every rulestore::tests::plan_status_covers_every_rule8 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_rollback28 ms
- ✓Order changes are published only when something visible changedstore::tests::order_changes_are_published_only_when_something_visible_changed29 ms
- ✓Pending payment recomputes survive reopening and track real changesstore::tests::pending_payment_recomputes_survive_reopening_and_track_real_changes36 ms
- ✓Recompute status reflects new payment and persistsstore::tests::recompute_status_reflects_new_payment_and_persists27 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_set27 ms
- ✓Read pool uses independent connections without blocking the runtimestore::tests::read_pool_uses_independent_connections_without_blocking_the_runtime34 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_default29 ms
- ✓Scanned blocks are fully isolated per networkstore::tests::scanned_blocks_are_fully_isolated_per_network27 ms
- ✓Rotated secret invalidates the old tokenstore::tests::rotated_secret_invalidates_the_old_token27 ms
- ✓Settlement waits for proven paymentsstore::tests::settlement_waits_for_proven_payments7 ms
- ✓Reopening an existing database file does not reapply migrationsstore::tests::reopening_an_existing_database_file_does_not_reapply_migrations41 ms
- ✓Scanned blocks round trip and prunestore::tests::scanned_blocks_round_trip_and_prune28 ms
- ✓Stores sharing a wallet allocate from its one counterstore::tests::stores_sharing_a_wallet_allocate_from_its_one_counter29 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_network28 ms
- ✓Two orders can each record the same transaction outputstore::tests::two_orders_can_each_record_the_same_transaction_output27 ms
- ✓Unconfirmed payment pages rotate without repeating a rowstore::tests::unconfirmed_payment_pages_rotate_without_repeating_a_row29 ms
- ✓Unvoid payment restores a row without clearing the double spend flagstore::tests::unvoid_payment_restores_a_row_without_clearing_the_double_spend_flag27 ms
- ✓Update tenant config only touches included fieldsstore::tests::update_tenant_config_only_touches_included_fields27 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_total27 ms
engine::store::conflicts6160 ms
- ✓A copy shown first does not get the real payment refusedstore::conflicts::tests::a_copy_shown_first_does_not_get_the_real_payment_refused19 ms
- ✓A payment voided for a double spent one comes backstore::conflicts::tests::a_payment_voided_for_a_double_spent_one_comes_back27 ms
- ✓An unsettled conflict holds an order its other payments would settlestore::conflicts::tests::an_unsettled_conflict_holds_an_order_its_other_payments_would_settle29 ms
- ✓Only a shared key is a conflictstore::conflicts::tests::only_a_shared_key_is_a_conflict27 ms
- ✓The credit follows the blocksstore::conflicts::tests::the_credit_follows_the_blocks29 ms
- ✓Under checking only a proven block settles a conflictstore::conflicts::tests::under_checking_only_a_proven_block_settles_a_conflict29 ms
engine::store::db8401 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_most20 ms
- ✓A stopped worker fails jobs instead of hangingstore::db::tests::a_stopped_worker_fails_jobs_instead_of_hanging22 ms
- ✓A worker that cannot start is an errorstore::db::tests::a_worker_that_cannot_start_is_an_error20 ms
- ✓A stalled job never blocks the async runtimestore::db::tests::a_stalled_job_never_blocks_the_async_runtime49 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_caller29 ms
- ✓Changes made through the worker reach the stores subscribersstore::db::tests::changes_made_through_the_worker_reach_the_stores_subscribers21 ms
- ✓The worker loop restarts after a panicstore::db::tests::the_worker_loop_restarts_after_a_panic21 ms
- ✓An inline job on a held store fails instead of deadlockingstore::db::tests::an_inline_job_on_a_held_store_fails_instead_of_deadlocking219 ms
engine::store::db::properties88.4 s
- ✓Class selection matches independent round robin modelstore::db::properties::class_selection_matches_independent_round_robin_model10 ms
- ✓Bounded queues preserve fifo fairness and accepted workstore::db::properties::bounded_queues_preserve_fifo_fairness_and_accepted_work359 ms
- ✓Continuously ready classes are served within one turn eachstore::db::properties::continuously_ready_classes_are_served_within_one_turn_each12 ms
- ✓Closing all senders drains accepted jobsstore::db::properties::closing_all_senders_drains_accepted_jobs497 ms
- ✓Bounded queues preserve fifo fairness and accepted work 512 casesstore::db::properties::bounded_queues_preserve_fifo_fairness_and_accepted_work3.6 s
- ✓Class selection matches independent round robin model 512 casesstore::db::properties::class_selection_matches_independent_round_robin_model13 ms
- ✓Closing all senders drains accepted jobs 512 casesstore::db::properties::closing_all_senders_drains_accepted_jobs3.9 s
- ✓Continuously ready classes are served within one turn each 512 casesstore::db::properties::continuously_ready_classes_are_served_within_one_turn_each9 ms
engine::store::db::properties::scale224.5 s
- ✓Repeated saturation retains fifo fairness and cancellationstore::db::properties::scale::repeated_saturation_retains_fifo_fairness_and_cancellation2.0 s
- ✓Repeated saturation retains fifo fairness and cancellation 512 casesstore::db::properties::scale::repeated_saturation_retains_fifo_fairness_and_cancellation22.5 s
engine::store::order_events16 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_gone6 ms
engine::store::proof7135 ms
- ✓A payment counts only in its proven blockstore::proof::tests::a_payment_counts_only_in_its_proven_block19 ms
- ✓An anchor is stored with its window and keysstore::proof::tests::an_anchor_is_stored_with_its_window_and_keys19 ms
- ✓Checking holds settlement from the moment it is onstore::proof::tests::checking_holds_settlement_from_the_moment_it_is_on18 ms
- ✓Forgetting the anchor keeps checking onstore::proof::tests::forgetting_the_anchor_keeps_checking_on19 ms
- ✓Pruning keeps the keys still neededstore::proof::tests::pruning_keeps_the_keys_still_needed23 ms
- ✓The ceiling is the highest recorded block that is provenstore::proof::tests::the_ceiling_is_the_highest_recorded_block_that_is_proven19 ms
- ✓The proven chain extends switches and refuses a stale parentstore::proof::tests::the_proven_chain_extends_switches_and_refuses_a_stale_parent18 ms
engine::store::properties121 min
- ✓Every historic schema upgrades with existing money and workstore::properties::every_historic_schema_upgrades_with_existing_money_and_work702 ms
- ✓Every reached upgrade fault recovers without partial schemastore::properties::every_reached_upgrade_fault_recovers_without_partial_schema1.2 s
- ✓Migration crash childstore::properties::migration_crash_child7 ms
- ✓Migration process death before and after commit preserves money and schemastore::properties::migration_process_death_before_and_after_commit_preserves_money_and_schema1.7 s
- ✓Historic upgrades recover from process deathstore::properties::historic_upgrades_recover_from_process_death1.7 s
- ✓Upgrades preserve money queues and interrupted workstore::properties::upgrades_preserve_money_queues_and_interrupted_work1.5 s
- ✓Every historic schema upgrades with existing money and work 512 casesstore::properties::every_historic_schema_upgrades_with_existing_money_and_work1.3 s
- ✓Every reached upgrade fault recovers without partial schema 512 casesstore::properties::every_reached_upgrade_fault_recovers_without_partial_schema1.4 s
- ✓Migration crash child 512 casesstore::properties::migration_crash_child9 ms
- ✓Migration process death before and after commit preserves money and schema 512 casesstore::properties::migration_process_death_before_and_after_commit_preserves_money_and_schema3.2 s
- ✓Historic upgrades recover from process death 512 casesstore::properties::historic_upgrades_recover_from_process_death26.6 s
- ✓Upgrades preserve money queues and interrupted work 512 casesstore::properties::upgrades_preserve_money_queues_and_interrupted_work23.3 s
engine::store::work281.1 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_not32 ms
- ✓A reorg collects payments back in the pool and voided onesstore::work::tests::a_reorg_collects_payments_back_in_the_pool_and_voided_ones28 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_done35 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_restart36 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_cursors30 ms
- ✓A settlement waits for the payments block to be recordedstore::work::tests::a_settlement_waits_for_the_payments_block_to_be_recorded28 ms
- ✓A settlement waits for an open reorg on its networkstore::work::tests::a_settlement_waits_for_an_open_reorg_on_its_network37 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_one26 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_one25 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_longer26 ms
- ✓An unknown reorg phase is an errorstore::work::tests::an_unknown_reorg_phase_is_an_error25 ms
- ✓Catch up groups are counted as listedstore::work::tests::catch_up_groups_are_counted_as_listed25 ms
- ✓Due orders are listed once up to the limitstore::work::tests::due_orders_are_listed_once_up_to_the_limit27 ms
- ✓Branch tracking and recollection commit whole and preserve the rescan anchorstore::work::tests::branch_tracking_and_recollection_commit_whole_and_preserve_the_rescan_anchor49 ms
- ✓Finishing a reorg early or at another fork is refusedstore::work::tests::finishing_a_reorg_early_or_at_another_fork_is_refused29 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_backlog28 ms
- ✓Late collects and defers are no opsstore::work::tests::late_collects_and_defers_are_no_ops29 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_never28 ms
- ✓Every store operation fails whole and then worksstore::work::tests::every_store_operation_fails_whole_and_then_works85 ms
- ✓Out of range values and corrupt rows are errorsstore::work::tests::out_of_range_values_and_corrupt_rows_are_errors27 ms
- ✓Scheduler positions are per network typed and survive a restartstore::work::tests::scheduler_positions_are_per_network_typed_and_survive_a_restart33 ms
- ✓Stores in scope and due orders are those of one networkstore::work::tests::stores_in_scope_and_due_orders_are_those_of_one_network25 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_network25 ms
- ✓Unsigned values cross into sqlite checked both waysstore::work::tests::unsigned_values_cross_into_sqlite_checked_both_ways7 ms
- ✓The scanners hot queries use their indexesstore::work::tests::the_scanners_hot_queries_use_their_indexes26 ms
- ✓Tip decreases queue recomputes atomically and only for their networkstore::work::tests::tip_decreases_queue_recomputes_atomically_and_only_for_their_network35 ms
- ✓Voided payments are paged from a cutoff on their own networkstore::work::tests::voided_payments_are_paged_from_a_cutoff_on_their_own_network27 ms
- ✓Every reorg staging cleanup boundary survives reopenstore::work::tests::every_reorg_staging_cleanup_boundary_survives_reopen253 ms
engine::store::work::properties27.0 s
- ✓Generated reorg staging is scoped and durablestore::work::tests::properties::generated_reorg_staging_is_scoped_and_durable595 ms
- ✓Generated reorg staging is scoped and durable 512 casesstore::work::tests::properties::generated_reorg_staging_is_scoped_and_durable6.5 s
Exchange rates 7 groups931.4 s
monokulo::exchange_rate_config16252 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_request19 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_over18 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_next22 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_asked19 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_fiat8 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_panic7 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_provider7 ms
- ✓Coingecko is only available when actually configuredexchange_rate_config::tests::coingecko_is_only_available_when_actually_configured11 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_haveno11 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_book19 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_repeats15 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_next27 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_error28 ms
- ✓Supported currencies for always includes xmr even with nothing configuredexchange_rate_config::tests::supported_currencies_for_always_includes_xmr_even_with_nothing_configured8 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_only14 ms
- ✓The stores order decides which provider answersexchange_rate_config::tests::the_stores_order_decides_which_provider_answers19 ms
monokulo::fx_provider_settings16359 ms
- ✓A failed currency lookup is a generic errorfx_provider_settings::tests::a_failed_currency_lookup_is_a_generic_error7 ms
- ✓A form without any haveno field leaves the settings alonefx_provider_settings::tests::a_form_without_any_haveno_field_leaves_the_settings_alone6 ms
- ✓A non empty list allows only its currencies case insensitivelyfx_provider_settings::tests::a_non_empty_list_allows_only_its_currencies_case_insensitively7 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_save6 ms
- ✓A valid form is read in fullfx_provider_settings::tests::a_valid_form_is_read_in_full7 ms
- ✓An empty currency list means every currencyfx_provider_settings::tests::an_empty_currency_list_means_every_currency7 ms
- ✓An unknown currency is rejected by namefx_provider_settings::tests::an_unknown_currency_is_rejected_by_name7 ms
- ✓Currencies are canonicalised deduplicated and kept in orderfx_provider_settings::tests::currencies_are_canonicalised_deduplicated_and_kept_in_order7 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_cap6 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_defaults7 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
- ✓The policy carries the stores limitsfx_provider_settings::tests::the_policy_carries_the_stores_limits6 ms
- ✓The spread must be a percentage above zerofx_provider_settings::tests::the_spread_must_be_a_percentage_above_zero7 ms
- ✓Xmr is rejected since no provider ever prices itfx_provider_settings::tests::xmr_is_rejected_since_no_provider_ever_prices_it89 ms
- ✓Unreadable stored settings are the defaults not an errorfx_provider_settings::tests::unreadable_stored_settings_are_the_defaults_not_an_error91 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_cap91 ms
shared::coinmarketcap10133 ms
- ✓A code that cannot be fiat is none without any requestcoinmarketcap::tests::a_code_that_cannot_be_fiat_is_none_without_any_request11 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_string19 ms
- ✓A fresh cache is reused and a stale one refetchedcoinmarketcap::tests::a_fresh_cache_is_reused_and_a_stale_one_refetched11 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_rate9 ms
- ✓A quote for another currency is nonecoinmarketcap::tests::a_quote_for_another_currency_is_none10 ms
- ✓A non 2xx status and a malformed body are clean errorscoinmarketcap::tests::a_non_2xx_status_and_a_malformed_body_are_clean_errors20 ms
- ✓A successful fetch inverts the price into piconero per unitcoinmarketcap::tests::a_successful_fetch_inverts_the_price_into_piconero_per_unit11 ms
- ✓An unreachable base url is a clean errorcoinmarketcap::tests::an_unreachable_base_url_is_a_clean_error10 ms
- ✓A zero or negative price is unpriced not a free ordercoinmarketcap::tests::a_zero_or_negative_price_is_unpriced_not_a_free_order20 ms
- ✓Currency lookups are case insensitivecoinmarketcap::tests::currency_lookups_are_case_insensitive12 ms
shared::exchange_rate1365 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_short5 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_place5 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
- ✓An order can never be priced at zero piconeroexchange_rate::tests::an_order_can_never_be_priced_at_zero_piconero5 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_currency5 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_rounding5 ms
- ✓More than two decimal places is rejected not truncatedexchange_rate::tests::more_than_two_decimal_places_is_rejected_not_truncated5 ms
- ✓Non numeric amount is rejectedexchange_rate::tests::non_numeric_amount_is_rejected5 ms
- ✓Single decimal digit is treated as tenthsexchange_rate::tests::single_decimal_digit_is_treated_as_tenths5 ms
- ✓Whole number amount without a decimal point worksexchange_rate::tests::whole_number_amount_without_a_decimal_point_works5 ms
- ✓Twenty five dollars at a known rate matches hand computed valueexchange_rate::tests::twenty_five_dollars_at_a_known_rate_matches_hand_computed_value5 ms
- ✓Xmr identity provider always returns the fixed unit conversionexchange_rate::tests::xmr_identity_provider_always_returns_the_fixed_unit_conversion5 ms
- ✓Zero or empty amount is rejectedexchange_rate::tests::zero_or_empty_amount_is_rejected5 ms
shared::exchange_rate::coingecko16189 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_panic11 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_rate12 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_panic16 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_part18 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_price11 ms
- ✓An excerpt never splits a characterexchange_rate::tests::coingecko::an_excerpt_never_splits_a_character5 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_order16 ms
- ✓An unreachable base url is a clean errorexchange_rate::tests::coingecko::an_unreachable_base_url_is_a_clean_error11 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_fresh11 ms
- ✓Currency lookups are case insensitiveexchange_rate::tests::coingecko::currency_lookups_are_case_insensitive11 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_cache11 ms
- ✓Piconero per unit cached refetches once max age has elapsedexchange_rate::tests::coingecko::piconero_per_unit_cached_refetches_once_max_age_has_elapsed11 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_fetch11 ms
- ✓Supported currencies cached and rate cache are independentexchange_rate::tests::coingecko::supported_currencies_cached_and_rate_cache_are_independent11 ms
- ✓Supported currencies cached fetches and uppercasesexchange_rate::tests::coingecko::supported_currencies_cached_fetches_and_uppercases12 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_fetch11 ms
shared::exchange_rate::stale_tests15 ms
- ✓A rate older than the stale ceiling is not servedexchange_rate::stale_tests::a_rate_older_than_the_stale_ceiling_is_not_served5 ms
shared::haveno21355 ms
- ✓A crossed or non positive book is unpricedhaveno::tests::a_crossed_or_non_positive_book_is_unpriced11 ms
- ✓A missing side in the depth response counts as zero offershaveno::tests::a_missing_side_in_the_depth_response_counts_as_zero_offers11 ms
- ✓A currency whose book emptied stops being priced on refreshhaveno::tests::a_currency_whose_book_emptied_stops_being_priced_on_refresh11 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_unpriced11 ms
- ✓A rejection is not cached for the next callerhaveno::tests::a_rejection_is_not_cached_for_the_next_caller10 ms
- ✓Depth is asked for the right pair and cached per currencyhaveno::tests::depth_is_asked_for_the_right_pair_and_cached_per_currency11 ms
- ✓Depth failures are errors not a no and are not cachedhaveno::tests::depth_failures_are_errors_not_a_no_and_are_not_cached21 ms
- ✓Depth is cached per currency and shared by policieshaveno::tests::depth_is_cached_per_currency_and_shared_by_policies11 ms
- ✓Depth is fetched only when the policy needs ithaveno::tests::depth_is_fetched_only_when_the_policy_needs_it11 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_spread11 ms
- ✓Every policy that passes gets the same pricehaveno::tests::every_policy_that_passes_gets_the_same_price11 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_answers53 ms
- ✓One request prices every currency and a fresh cache is reusedhaveno::tests::one_request_prices_every_currency_and_a_fresh_cache_is_reused12 ms
- ✓Stale depth is refetchedhaveno::tests::stale_depth_is_refetched12 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
- ✓The offer count minimum applies to each sidehaveno::tests::the_offer_count_minimum_applies_to_each_side11 ms
- ✓A policys answer never depends on which policy asked firsthaveno::tests::a_policys_answer_never_depends_on_which_policy_asked_first67 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_price11 ms
- ✓The spread limit is the policys ownhaveno::tests::the_spread_limit_is_the_policys_own11 ms
- ✓The xmr depth minimum applies to each sidehaveno::tests::the_xmr_depth_minimum_applies_to_each_side11 ms
- ✓Ticker failures are errors and are not cachedhaveno::tests::ticker_failures_are_errors_and_are_not_cached32 ms
Abuse protection 8 groups2925.1 s
client-challenge-protocol1398 ms
- ✓Monokulo-client.js solves an order-creation challenge on its ownclient-challenge-protocol.spec.js398 ms
connection-challenge424.3 s
- ✓Real challenge solves in JavaScript and continues to the checkoutconnection-challenge.spec.js815 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.js12.1 s
- ✓Real challenge on a plain-HTTP onion (no Web Crypto) waits ten seconds and continuesconnection-challenge.spec.js765 ms
monokulo::abuse::challenge642 ms
- ✓A solved challenge redeems once for its own client onlyabuse::challenge::tests::a_solved_challenge_redeems_once_for_its_own_client_only7 ms
- ✓A wait token only redeems after its wait and onceabuse::challenge::tests::a_wait_token_only_redeems_after_its_wait_and_once7 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_replay6 ms
- ✓Leading zero bits counts across bytesabuse::challenge::tests::leading_zero_bits_counts_across_bytes6 ms
- ✓The replay memory is capped and fails closedabuse::challenge::tests::the_replay_memory_is_capped_and_fails_closed6 ms
- ✓Unsolved expired forged and malformed proofs are refusedabuse::challenge::tests::unsolved_expired_forged_and_malformed_proofs_are_refused10 ms
monokulo::abuse::identity318 ms
- ✓Forwarded for is only believed from a trusted proxyabuse::identity::tests::forwarded_for_is_only_believed_from_a_trusted_proxy6 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_whole6 ms
- ✓Trusted proxies parse addresses and ranges and refuse nonsenseabuse::identity::tests::trusted_proxies_parse_addresses_and_ranges_and_refuse_nonsense6 ms
monokulo::abuse::limiter743 ms
- ✓A client that waits for retry after is let throughabuse::limiter::tests::a_client_that_waits_for_retry_after_is_let_through6 ms
- ✓A pass granted to an evicted client still countsabuse::limiter::tests::a_pass_granted_to_an_evicted_client_still_counts6 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_limit6 ms
- ✓Memory is capped by forgetting the least recently seen clientabuse::limiter::tests::memory_is_capped_by_forgetting_the_least_recently_seen_client7 ms
- ✓The count is a rolling minuteabuse::limiter::tests::the_count_is_a_rolling_minute6 ms
- ✓Under attack challenges every client without a passabuse::limiter::tests::under_attack_challenges_every_client_without_a_pass6 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_blocked6 ms
monokulo::abuse::proxy_protocol436 ms
- ✓Malformed or incomplete headers are refusedabuse::proxy_protocol::tests::malformed_or_incomplete_headers_are_refused6 ms
- ✓The onion listener must be loopbackabuse::proxy_protocol::tests::the_onion_listener_must_be_loopback6 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_connection18 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_address6 ms
monokulo::abuse::stats190 ms
- ✓Counts cover exactly the last hourabuse::stats::tests::counts_cover_exactly_the_last_hour90 ms
monokulo::abuse::streams3101 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_are87 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_slot7 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_streams7 ms
Logs and tracing 8 groups572 min
log-search-and-tracing (real binaries)112 min
- ✓A search swaps the results in place, keeps the URL, and back returns to the earlier searchlog-search-and-tracing.spec.js8.5 s
- ✓The search box, Syntax and Search share one height; Syntax opens the help as a dialoglog-search-and-tracing.spec.js14.8 s
- ✓Without JavaScript, Syntax is a page whose examples are searcheslog-search-and-tracing.spec.js6.1 s
- ✓A line's properties load when it's first opened, and only thenlog-search-and-tracing.spec.js10.9 s
- ✓A search that does not parse says wherelog-search-and-tracing.spec.js6.0 s
- ✓A request from monokulo to the engine is one trace with spans from bothlog-search-and-tracing.spec.js5.2 s
- ✓Find narrows the search to a property of a linelog-search-and-tracing.spec.js2.3 s
- ✓Live adds new lines at the top without a reload, and pauseslog-search-and-tracing.spec.js6.2 s
- ✓Without JavaScript › the search form and Refresh work as plain navigation, and lines expandlog-search-and-tracing.spec.js14.6 s
- ✓A caller's traceparent (as the WooCommerce plugin sends it) is followed through monokulo to the enginelog-search-and-tracing.spec.js5.2 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.js14.8 s
telemetry::http422 ms
- ✓A callers traceparent is joinedhttp::tests::a_callers_traceparent_is_joined6 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_end5 ms
- ✓Server errors are warnings and static files are debughttp::tests::server_errors_are_warnings_and_static_files_are_debug6 ms
- ✓Who a request is for is on its lines once recordedhttp::tests::who_a_request_is_for_is_on_its_lines_once_recorded5 ms
telemetry::otlp_export221 ms
- ✓Settings are checkedtests::otlp_export::settings_are_checked5 ms
- ✓Lines and spans reach the collector redacted and in their tracetests::otlp_export::lines_and_spans_reach_the_collector_redacted_and_in_their_trace16 ms
telemetry::query629 ms
- ✓Errors say what and wherequery::tests::errors_say_what_and_where5 ms
- ✓Nesting past the limit is an error not a stack overflowquery::tests::nesting_past_the_limit_is_an_error_not_a_stack_overflow5 ms
- ✓Precedence and printing round tripquery::tests::precedence_and_printing_round_trip5 ms
- ✓Sql uses parameters for every value and field namequery::tests::sql_uses_parameters_for_every_value_and_field_name5 ms
- ✓Text searches escape like wildcardsquery::tests::text_searches_escape_like_wildcards5 ms
- ✓Words that are not a query are a text searchquery::tests::words_that_are_not_a_query_are_a_text_search4 ms
telemetry::redact734 ms
- ✓Client addresses keep only their networkredact::tests::client_addresses_keep_only_their_network5 ms
- ✓Monero addresses are shortened anywhere in a stringredact::tests::monero_addresses_are_shortened_anywhere_in_a_string4 ms
- ✓Public names and ordinary fields are keptredact::tests::public_names_and_ordinary_fields_are_kept5 ms
- ✓Secret names are redacted whatever their prefixredact::tests::secret_names_are_redacted_whatever_their_prefix5 ms
- ✓Store secret keys are removed anywhere in a stringredact::tests::store_secret_keys_are_removed_anywhere_in_a_string4 ms
- ✓Strings without anything to redact are borrowed unchangedredact::tests::strings_without_anything_to_redact_are_borrowed_unchanged6 ms
- ✓Unicode around a redaction survivesredact::tests::unicode_around_a_redaction_survives5 ms
telemetry::store10307 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_it20 ms
- ✓Flush returns once every line logged so far is storedstore::tests::flush_returns_once_every_line_logged_so_far_is_stored25 ms
- ✓A histogram counts lines per slice and attribute names are listedstore::tests::a_histogram_counts_lines_per_slice_and_attribute_names_are_listed30 ms
- ✓Lines logged before the store opens are keptstore::tests::lines_logged_before_the_store_opens_are_kept9 ms
- ✓Pages follow the cursor both ways and time ranges applystore::tests::pages_follow_the_cursor_both_ways_and_time_ranges_apply9 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_filter33 ms
- ✓The retention settings reach the storestore::tests::the_retention_settings_reach_the_store8 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_whole30 ms
- ✓Watching the latest id sees new linesstore::tests::watching_the_latest_id_sees_new_lines31 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_limit112 ms
telemetry::tests1678 ms
- ✓A development time already past is offtests::a_development_time_already_past_is_off5 ms
- ✓A filter that does not parse leaves the old one in placetests::a_filter_that_does_not_parse_leaves_the_old_one_in_place4 ms
- ✓A hosted services lines are named after ittests::a_hosted_services_lines_are_named_after_it4 ms
- ✓A json line carries the event and every enclosing spans fields redactedtests::a_json_line_carries_the_event_and_every_enclosing_spans_fields_redacted4 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_trace5 ms
- ✓An event outside any span has empty attributes and no spanstests::an_event_outside_any_span_has_empty_attributes_and_no_spans4 ms
- ✓Applying a level changes what is written straight awaytests::applying_a_level_changes_what_is_written_straight_away5 ms
- ✓Check level accepts filters and refuses the resttests::check_level_accepts_filters_and_refuses_the_rest5 ms
- ✓Development mode keeps the targets the level namestests::development_mode_keeps_the_targets_the_level_names6 ms
- ✓Development mode logs debug until its time then turns itself offtests::development_mode_logs_debug_until_its_time_then_turns_itself_off6 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_logged5 ms
- ✓Pretty output is redacted tootests::pretty_output_is_redacted_too5 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_checked4 ms
- ✓Unix times read as utctests::unix_times_read_as_utc4 ms
telemetry::through_settings15 ms
- ✓A saved level reaches the process wide subscribertests::through_settings::a_saved_level_reaches_the_process_wide_subscriber5 ms
Shop plugins 1 group102.4 s
mock-woocommerce::tests102.4 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_token103 ms
- ✓A full woocommerce checkout is created with the key opened and paidtests::a_full_woocommerce_checkout_is_created_with_the_key_opened_and_paid198 ms
- ✓Create order against a real engine yields a working checkout redirecttests::create_order_against_a_real_engine_yields_a_working_checkout_redirect111 ms
- ✓Signature verification matches the known cross language vectortests::signature_verification_matches_the_known_cross_language_vector6 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_credentials84 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_id12 ms
- ✓The flow without a webhook registers nonetests::the_flow_without_a_webhook_registers_none80 ms
- ✓Webhook receiver rejects an invalid signature and records nothingtests::webhook_receiver_rejects_an_invalid_signature_and_records_nothing11 ms
- ✓Webhook receiver rejects everything before its signing secret is knowntests::webhook_receiver_rejects_everything_before_its_signing_secret_is_known10 ms
- ✓A genuinely forced order expired webhook is delivered and verifiedtests::a_genuinely_forced_order_expired_webhook_is_delivered_and_verified1.8 s
Test tools 15 groups672.4 s
cli-wallet::amount29 ms
- ✓Amounts round trip exactly in every unitamount::tests::amounts_round_trip_exactly_in_every_unit5 ms
- ✓Malformed or too precise amounts are rejectedamount::tests::malformed_or_too_precise_amounts_are_rejected4 ms
cli-wallet::args946 ms
- ✓History filters default to everythingargs::tests::history_filters_default_to_everything8 ms
- ✓Output specs are ringct amount and global indexargs::tests::output_specs_are_ringct_amount_and_global_index5 ms
- ✓Payment uris carry their amount in moneroargs::tests::payment_uris_carry_their_amount_in_monero5 ms
- ✓Pocketchange defaults to the biggest split of the biggest outputargs::tests::pocketchange_defaults_to_the_biggest_split_of_the_biggest_output6 ms
- ✓Prompt lines split like a shell for simple quotingargs::tests::prompt_lines_split_like_a_shell_for_simple_quoting5 ms
- ✓Sweeps parse their own leading argumentsargs::tests::sweeps_parse_their_own_leading_arguments4 ms
- ✓Transfer amounts follow the display unitargs::tests::transfer_amounts_follow_the_display_unit5 ms
- ✓Transfer rejects what the reference wallet rejectsargs::tests::transfer_rejects_what_the_reference_wallet_rejects4 ms
- ✓Transfer takes its optional leading words in orderargs::tests::transfer_takes_its_optional_leading_words_in_order4 ms
cli-wallet::block_range426 ms
- ✓Each form names the blocks it saysblock_range::tests::each_form_names_the_blocks_it_says4 ms
- ✓Malformed ranges are refused with the forms that fitblock_range::tests::malformed_ranges_are_refused_with_the_forms_that_fit6 ms
- ✓Ranges print as they were writtenblock_range::tests::ranges_print_as_they_were_written5 ms
- ✓Ranges that cant be scanned say whyblock_range::tests::ranges_that_cant_be_scanned_say_why11 ms
cli-wallet::cli5301 ms
- ✓A new wallet can be opened and driven interactivelya_new_wallet_can_be_opened_and_driven_interactively60 ms
- ✓A testnet wallet is created with the flag and opened without ita_testnet_wallet_is_created_with_the_flag_and_opened_without_it59 ms
- ✓One command runs and exits and existing wallets are never replacedone_command_runs_and_exits_and_existing_wallets_are_never_replaced78 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_node54 ms
- ✓Transfer arguments are checked before any node is contactedtransfer_arguments_are_checked_before_any_node_is_contacted50 ms
cli-wallet::commands28 ms
- ✓Csv fields are quoted only when neededcommands::tests::csv_fields_are_quoted_only_when_needed4 ms
- ✓Timestamps format as utc datescommands::tests::timestamps_format_as_utc_dates4 ms
cli-wallet::editor629 ms
- ✓Completions follow each commands grammar and the wallets dataeditor::tests::completions_follow_each_commands_grammar_and_the_wallets_data4 ms
- ✓Every parser command is known to the editor with its usageeditor::tests::every_parser_command_is_known_to_the_editor_with_its_usage4 ms
- ✓Hints finish a unique command then show its usageeditor::tests::hints_finish_a_unique_command_then_show_its_usage5 ms
- ✓The command word is green when known and red when noteditor::tests::the_command_word_is_green_when_known_and_red_when_not6 ms
- ✓The completer replaces just the word being typededitor::tests::the_completer_replaces_just_the_word_being_typed5 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_panicking5 ms
cli-wallet::faucet784 ms
- ✓A page instead of an answer is shown as textfaucet::tests::a_page_instead_of_an_answer_is_shown_as_text12 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_read13 ms
- ✓Cypherfaucet says when to try againfaucet::tests::cypherfaucet_says_when_to_try_again14 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_read13 ms
- ✓Xmr tw pays stagenet onlyfaucet::tests::xmr_tw_pays_stagenet_only11 ms
- ✓Xmr tw says why it sent nothingfaucet::tests::xmr_tw_says_why_it_sent_nothing14 ms
cli-wallet::file214 ms
- ✓A saved wallet file is readable by its owner onlyfile::tests::a_saved_wallet_file_is_readable_by_its_owner_only9 ms
- ✓Secret option values are redacted from the lock notefile::tests::secret_option_values_are_redacted_from_the_lock_note5 ms
cli-wallet::meta210 ms
- ✓A wallet without metadata has just the primary accountmeta::tests::a_wallet_without_metadata_has_just_the_primary_account5 ms
- ✓Accounts and subaddresses are numbered in creation ordermeta::tests::accounts_and_subaddresses_are_numbered_in_creation_order5 ms
cli-wallet::store774 ms
- ✓A file that isnt a database is refusedstore::tests::a_file_that_isnt_a_database_is_refused6 ms
- ✓A missing file is never created by reading itstore::tests::a_missing_file_is_never_created_by_reading_it5 ms
- ✓A wallet with nothing set stores just its keysstore::tests::a_wallet_with_nothing_set_stores_just_its_keys16 ms
- ✓An amount past i64 is refused not wrappedstore::tests::an_amount_past_i64_is_refused_not_wrapped11 ms
- ✓Another format version is refusedstore::tests::another_format_version_is_refused11 ms
- ✓Every table round trips in orderstore::tests::every_table_round_trips_in_order12 ms
- ✓The schema refuses mainnetstore::tests::the_schema_refuses_mainnet13 ms
cli-wallet::tests14317 ms
- ✓A held lock names its holder and lets the caller choosetests::a_held_lock_names_its_holder_and_lets_the_caller_choose117 ms
- ✓A rescan records what it found once and resolves pendingtests::a_rescan_records_what_it_found_once_and_resolves_pending11 ms
- ✓A seed restores to the network asked fortests::a_seed_restores_to_the_network_asked_for10 ms
- ✓A testnet wallet file opens only on testnettests::a_testnet_wallet_file_opens_only_on_testnet30 ms
- ✓A wallet directory variable is taken from the repository roottests::a_wallet_directory_variable_is_taken_from_the_repository_root6 ms
- ✓A wallet file for mainnet or an unknown network is refusedtests::a_wallet_file_for_mainnet_or_an_unknown_network_is_refused10 ms
- ✓A wallet file refuses to be created twice and round tripstests::a_wallet_file_refuses_to_be_created_twice_and_round_trips8 ms
- ✓Concurrent updates are never losttests::concurrent_updates_are_never_lost53 ms
- ✓Each retry starts from the next node and still tries them alltests::each_retry_starts_from_the_next_node_and_still_tries_them_all6 ms
- ✓Every output a transaction pays the wallet gets its own recordtests::every_output_a_transaction_pays_the_wallet_gets_its_own_record10 ms
- ✓Freezing and marking spent change exactly one outputtests::freezing_and_marking_spent_change_exactly_one_output23 ms
- ✓Key images are stable and distincttests::key_images_are_stable_and_distinct13 ms
- ✓Resolving a send dates its sent recordtests::resolving_a_send_dates_its_sent_record9 ms
- ✓Seeds restore the keys they came fromtests::seeds_restore_the_keys_they_came_from11 ms
cli-wallet::wallet::txid_tests16 ms
- ✓A txid is lowercased and must be 64 hex characterswallet::txid_tests::a_txid_is_lowercased_and_must_be_64_hex_characters6 ms
cli-wallet::wallet_setup348 ms
- ✓A stagenet wallet restores on stageneta_stagenet_wallet_restores_on_stagenet14 ms
- ✓The 25 word phrase is the same walletthe_25_word_phrase_is_the_same_wallet14 ms
- ✓The polyseed restores to the address and view key it came withthe_polyseed_restores_to_the_address_and_view_key_it_came_with20 ms
engine-test-support::fake_monerod115 ms
- ✓The stand in node answers what an idle engine asksthe_stand_in_node_answers_what_an_idle_engine_asks15 ms
engine-test-support::tests21.4 s
- ✓Status route is reachable over a real sockettests::status_route_is_reachable_over_a_real_socket42 ms
- ✓Background loops genuinely write a real expired order eventtests::background_loops_genuinely_write_a_real_expired_order_event1.3 s
Everything else 69 groups4598 min
account-settings519.6 s
- ✓Without JavaScript the account menu opens and the profile savesaccount-settings.spec.js3.3 s
- ✓With JavaScript a change shows the save bar, and a new email is confirmed in a dialogaccount-settings.spec.js9.6 s
- ✓The account menu closes on a click outside it, and its items join the phone menuaccount-settings.spec.js3.8 s
- ✓The nav bar is one height signed in or outaccount-settings.spec.js1.1 s
- ✓The account menu's rows line up inside it, and the save bar has room round its buttonsaccount-settings.spec.js1.7 s
disclosures46.3 s
- ✓A disclosure reads as a link with a caret, with a pointer, a hover and a focus ringdisclosures.spec.js1.7 s
- ✓The account menu keeps its own look, with a pointer, a hover and a focus ringdisclosures.spec.js574 ms
- ✓"More options" sits a step inside its box and a wide step from its neighbours, at 1280pxdisclosures.spec.js2.2 s
- ✓"More options" sits a step inside its box and a wide step from its neighbours, at 390pxdisclosures.spec.js1.8 s
domains315.8 s
- ✓A domain is added on its own pages, and its check answers in placedomains.spec.js10.0 s
- ✓Without JavaScript a domain is added, checked and removed by postingdomains.spec.js1.7 s
- ✓On a phone the domain pages fit, and a card stacks its actions under its namedomains.spec.js4.1 s
dropdowns66.3 s
- ✓A dropdown floats over the page, picks with the mouse and saves through the real selectdropdowns.spec.js1.2 s
- ✓The keyboard opens, moves, chooses and closes without leaving the carddropdowns.spec.js892 ms
- ✓A long list has a find box, and a script setting the select is followeddropdowns.spec.js2.0 s
- ✓Search is shown, hidden or decided by the number of optionsdropdowns.spec.js552 ms
- ✓A required dropdown left on its prompt is refused, and green is only for Currentdropdowns.spec.js1.2 s
- ✓Without JavaScript the dropdown is the plain select, every part in wordsdropdowns.spec.js546 ms
engine::activity9102 ms
- ✓A fresh reader starts at the oldest snapshotactivity::tests::a_fresh_reader_starts_at_the_oldest_snapshot13 ms
- ✓A reader behind the record or from another epoch starts overactivity::tests::a_reader_behind_the_record_or_from_another_epoch_starts_over11 ms
- ✓A reader following next sees every event onceactivity::tests::a_reader_following_next_sees_every_event_once11 ms
- ✓A snapshot is due once per interval and rounds count upactivity::tests::a_snapshot_is_due_once_per_interval_and_rounds_count_up8 ms
- ✓Recording wakes the streamsactivity::tests::recording_wakes_the_streams11 ms
- ✓Stream tuning is validatedactivity::tests::stream_tuning_is_validated8 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_count20 ms
- ✓The record is in time orderactivity::tests::the_record_is_in_time_order10 ms
engine::backup_restore2431 ms
- ✓Restore refuses to overwrite an existing destination without forcerestore_refuses_to_overwrite_an_existing_destination_without_force161 ms
- ✓Backup then restore preserves tenants and orders under concurrent writesbackup_then_restore_preserves_tenants_and_orders_under_concurrent_writes270 ms
engine::cli754 ms
- ✓A setting can be given as an optioncli::tests::a_setting_can_be_given_as_an_option9 ms
- ✓An unrecognized bare argument is a clear error not silently ignoredcli::tests::an_unrecognized_bare_argument_is_a_clear_error_not_silently_ignored9 ms
- ✓Help and version are answered by clapcli::tests::help_and_version_are_answered_by_clap9 ms
- ✓No arguments starts the server from the default options filecli::tests::no_arguments_starts_the_server_from_the_default_options_file6 ms
- ✓The command line is well formedcli::tests::the_command_line_is_well_formed8 ms
- ✓The database path follows xdg unless givencli::tests::the_database_path_follows_xdg_unless_given6 ms
- ✓The help documents the options file and every settingcli::tests::the_help_documents_the_options_file_and_every_setting7 ms
engine::engine_settings11220 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
- ✓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_on30 ms
- ✓An invalid rate limit stops the engine at startengine_settings::tests::an_invalid_rate_limit_stops_the_engine_at_start37 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_format9 ms
- ✓Snp settings are checked and say what the backend still needsengine_settings::tests::snp_settings_are_checked_and_say_what_the_backend_still_needs8 ms
- ✓The embedded defaults name settings an embedded engine keeps in its options fileengine_settings::tests::the_embedded_defaults_name_settings_an_embedded_engine_keeps_in_its_options_file7 ms
- ✓Preparing the snp backend starts nothing and stores no keyengine_settings::tests::preparing_the_snp_backend_starts_nothing_and_stores_no_key35 ms
- ✓The old ranges are keptengine_settings::tests::the_old_ranges_are_kept9 ms
- ✓The scan budget fits in 80 percent of memory across networksengine_settings::tests::the_scan_budget_fits_in_80_percent_of_memory_across_networks8 ms
- ✓The instance limit is on for a standalone engine and off inside monokuloengine_settings::tests::the_instance_limit_is_on_for_a_standalone_engine_and_off_inside_monokulo35 ms
- ✓The snp backend starts once and keeps its storesengine_settings::tests::the_snp_backend_starts_once_and_keeps_its_stores31 ms
engine::http1003.0 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_it25 ms
- ✓A check answers as a save would and saves nothinghttp::tests::a_check_answers_as_a_save_would_and_saves_nothing26 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_flight22 ms
- ✓A disabled store can not be movedhttp::tests::a_disabled_store_can_not_be_moved22 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_5006 ms
- ✓A key custody backend that is down is 503http::tests::a_key_custody_backend_that_is_down_is_5037 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_enabled19 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_for21 ms
- ✓A node listed twice in one network is refusedhttp::tests::a_node_listed_twice_in_one_network_is_refused28 ms
- ✓A partially invalid save changes nothing not just the valid halfhttp::tests::a_partially_invalid_save_changes_nothing_not_just_the_valid_half23 ms
- ✓A request that takes too long gets 503http::tests::a_request_that_takes_too_long_gets_5038 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_refused33 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_them39 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_bug39 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_request35 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_store32 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_refused33 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_changes27 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_is27 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_left25 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_join24 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_network23 ms
- ✓A stores routes still need its own secrethttp::tests::a_stores_routes_still_need_its_own_secret21 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_reach24 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_network24 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_closed29 ms
- ✓A zero or malformed xmr amount is rejected with bad requesthttp::tests::a_zero_or_malformed_xmr_amount_is_rejected_with_bad_request29 ms
- ✓Adding a wallet with bad keys is refused and registers nothinghttp::tests::adding_a_wallet_with_bad_keys_is_refused_and_registers_nothing34 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_token35 ms
- ✓Admin route with no authorization header is rejectedhttp::tests::admin_route_with_no_authorization_header_is_rejected28 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_succeeds29 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_order35 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_not43 ms
- ✓An unknown setting is refused and nothing is savedhttp::tests::an_unknown_setting_is_refused_and_nothing_is_saved35 ms
- ✓An unchanged network keeps its client when another network is savedhttp::tests::an_unchanged_network_keeps_its_client_when_another_network_is_saved40 ms
- ✓An xmr amount above the cap is rejected with bad requesthttp::tests::an_xmr_amount_above_the_cap_is_rejected_with_bad_request32 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_error26 ms
- ✓Clearing a monero node with a null value removes its configurationhttp::tests::clearing_a_monero_node_with_a_null_value_removes_its_configuration34 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_error34 ms
- ✓Create tenant then create order happy pathhttp::tests::create_tenant_then_create_order_happy_path29 ms
- ✓Creating an order with a confirmations required override persists ithttp::tests::creating_an_order_with_a_confirmations_required_override_persists_it30 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_rejected28 ms
- ✓Creating an order with no confirmations required override leaves it unsethttp::tests::creating_an_order_with_no_confirmations_required_override_leaves_it_unset28 ms
- ✓Creating an order with confirmations required zero is acceptedhttp::tests::creating_an_order_with_confirmations_required_zero_is_accepted30 ms
- ✓Each store key has its own budgethttp::tests::each_store_key_has_its_own_budget28 ms
- ✓Event streams outlive the request timeout and have their own caphttp::tests::event_streams_outlive_the_request_timeout_and_have_their_own_cap8 ms
- ✓Enabling the snp key custody backend is saved and reportedhttp::tests::enabling_the_snp_key_custody_backend_is_saved_and_reported32 ms
- ✓Every admin route resolves its tenant from the bearer token alonehttp::tests::every_admin_route_resolves_its_tenant_from_the_bearer_token_alone32 ms
- ✓Every route refuses a request without the engine tokenhttp::tests::every_route_refuses_a_request_without_the_engine_token30 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_order22 ms
- ✓Forgetting a proof anchor keeps checking onhttp::tests::forgetting_a_proof_anchor_keeps_checking_on28 ms
- ✓Get settings reports code defaults when nothing is configuredhttp::tests::get_settings_reports_code_defaults_when_nothing_is_configured31 ms
- ✓Listing orders can page search and keep to open ordershttp::tests::listing_orders_can_page_search_and_keep_to_open_orders33 ms
- ✓Lookup payment rejects a malformed txidhttp::tests::lookup_payment_rejects_a_malformed_txid29 ms
- ✓Lookup payment matches and records a real mempool paymenthttp::tests::lookup_payment_matches_and_records_a_real_mempool_payment36 ms
- ✓Lookup payment reports not found on chain for an unknown txidhttp::tests::lookup_payment_reports_not_found_on_chain_for_an_unknown_txid29 ms
- ✓Lookup payment requires authenticationhttp::tests::lookup_payment_requires_authentication29 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_tx33 ms
- ✓Moving a store needs the keys of its own wallethttp::tests::moving_a_store_needs_the_keys_of_its_own_wallet30 ms
- ✓Nodes that do not answer or do not say are savedhttp::tests::nodes_that_do_not_answer_or_do_not_say_are_saved37 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_registration45 ms
- ✓Order events stream reports only the authenticated tenants changeshttp::tests::order_events_stream_reports_only_the_authenticated_tenants_changes34 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_shown32 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_queueing8 ms
- ✓Oversized request body is rejected before reaching the handlerhttp::tests::oversized_request_body_is_rejected_before_reaching_the_handler30 ms
- ✓Rotated secret invalidates the old token end to endhttp::tests::rotated_secret_invalidates_the_old_token_end_to_end28 ms
- ✓Saving a restart only setting says sohttp::tests::saving_a_restart_only_setting_says_so23 ms
- ✓Saved rate limits change the limiter without a restarthttp::tests::saved_rate_limits_change_the_limiter_without_a_restart30 ms
- ✓Saving an out of range scalar is rejected and nothing changeshttp::tests::saving_an_out_of_range_scalar_is_rejected_and_nothing_changes26 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_reported33 ms
- ✓Status endpoint is reachable with no authentication at allhttp::tests::status_endpoint_is_reachable_with_no_authentication_at_all43 ms
- ✓Status endpoint reflects a failing scan tick with its real errorhttp::tests::status_endpoint_reflects_a_failing_scan_tick_with_its_real_error50 ms
- ✓Setting a monero node round trips including its fallback listhttp::tests::setting_a_monero_node_round_trips_including_its_fallback_list82 ms
- ✓Status endpoint reflects a healthy recent scan tickhttp::tests::status_endpoint_reflects_a_healthy_recent_scan_tick43 ms
- ✓Status endpoint reflects a stale scanner that has stopped tickinghttp::tests::status_endpoint_reflects_a_stale_scanner_that_has_stopped_ticking28 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_gap27 ms
- ✓Status endpoint with no configured networks says so plainlyhttp::tests::status_endpoint_with_no_configured_networks_says_so_plainly27 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_height29 ms
- ✓Status lists a store whose network has no answering nodehttp::tests::status_lists_a_store_whose_network_has_no_answering_node44 ms
- ✓Status reports resources scaling and a slow blockhttp::tests::status_reports_resources_scaling_and_a_slow_block28 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_answering30 ms
- ✓Status says which network each node is onhttp::tests::status_says_which_network_each_node_is_on32 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_behind28 ms
- ✓Tenant a cannot read tenant bs order via admin apihttp::tests::tenant_a_cannot_read_tenant_bs_order_via_admin_api27 ms
- ✓Tenant creation is rejected for a network with no configured nodehttp::tests::tenant_creation_is_rejected_for_a_network_with_no_configured_node29 ms
- ✓Tenant deletion disables it and admin routes stop workinghttp::tests::tenant_deletion_disables_it_and_admin_routes_stop_working27 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_patch29 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_key30 ms
- ✓The engine serves no public order routes and no corshttp::tests::the_engine_serves_no_public_order_routes_and_no_cors29 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_errors51 ms
- ✓The options file is saved to and reloaded through the apihttp::tests::the_options_file_is_saved_to_and_reloaded_through_the_api34 ms
- ✓The order event stream replays from a position then goes livehttp::tests::the_order_event_stream_replays_from_a_position_then_goes_live33 ms
- ✓The order event stream says when a reader missed eventshttp::tests::the_order_event_stream_says_when_a_reader_missed_events30 ms
- ✓The snp trust settings cannot be changed through the settings apihttp::tests::the_snp_trust_settings_cannot_be_changed_through_the_settings_api28 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_backend38 ms
- ✓Updating a scalar setting persists and a later get reflects ithttp::tests::updating_a_scalar_setting_persists_and_a_later_get_reflects_it25 ms
- ✓Two stores on one wallet never hand out the same addresshttp::tests::two_stores_on_one_wallet_never_hand_out_the_same_address28 ms
- ✓With the instance limit on calls without a store key share one budget of their ownhttp::tests::with_the_instance_limit_on_calls_without_a_store_key_share_one_budget_of_their_own27 ms
- ✓Without a log store the log api says sohttp::tests::without_a_log_store_the_log_api_says_so27 ms
- ✓With the instance limit off calls without a store key are never refusedhttp::tests::with_the_instance_limit_off_calls_without_a_store_key_are_never_refused79 ms
engine::http::activity6874 ms
- ✓A from that left the record starts over from the oldest snapshothttp::activity::tests::a_from_that_left_the_record_starts_over_from_the_oldest_snapshot32 ms
- ✓A burst arrives in a few messageshttp::activity::tests::a_burst_arrives_in_a_few_messages81 ms
- ✓A stream needs the engine token and a scanned networkhttp::activity::tests::a_stream_needs_the_engine_token_and_a_scanned_network24 ms
- ✓A quiet stream sends keep aliveshttp::activity::tests::a_quiet_stream_sends_keep_alives124 ms
- ✓The record is replayed from from then new events are pushedhttp::activity::tests::the_record_is_replayed_from_from_then_new_events_are_pushed83 ms
- ✓A slow reader is cut off then resumes without losshttp::activity::tests::a_slow_reader_is_cut_off_then_resumes_without_loss530 ms
engine::http::properties261 min
- ✓Cancelling during derivation preserves the address for retryhttp::tests::properties::cancelling_during_derivation_preserves_the_address_for_retry432 ms
- ✓Disabling a tenant during derivation cannot publish an orderhttp::tests::properties::disabling_a_tenant_during_derivation_cannot_publish_an_order412 ms
- ✓Every purchase identity field rejects conflicting replayshttp::tests::properties::every_purchase_identity_field_rejects_conflicting_replays413 ms
- ✓Concurrent creation and retries use the production database workerhttp::tests::properties::concurrent_creation_and_retries_use_the_production_database_worker1.1 s
- ✓Exhausted counter still allows idempotent replays and never wrapshttp::tests::properties::exhausted_counter_still_allows_idempotent_replays_and_never_wraps32 ms
- ✓Every sql denial during order creation is atomic and retryablehttp::tests::properties::every_sql_denial_during_order_creation_is_atomic_and_retryable130 ms
- ✓Order creation crash childhttp::tests::properties::order_creation_crash_child7 ms
- ✓Exhaustion and mismatched claims cannot corrupt allocationhttp::tests::properties::exhaustion_and_mismatched_claims_cannot_corrupt_allocation302 ms
- ✓Process death at order commit preserves atomic allocationhttp::tests::properties::process_death_at_order_commit_preserves_atomic_allocation1.1 s
- ✓Request validation is atomic at integer and key boundarieshttp::tests::properties::request_validation_is_atomic_at_integer_and_key_boundaries328 ms
- ✓Order histories preserve tenant scoped idempotency and addresseshttp::tests::properties::order_histories_preserve_tenant_scoped_idempotency_and_addresses2.3 s
- ✓Sql failures and lost results never burn addresseshttp::tests::properties::sql_failures_and_lost_results_never_burn_addresses451 ms
- ✓Requests without keys create distinct purchaseshttp::tests::properties::requests_without_keys_create_distinct_purchases1.1 s
- ✓Cancelling during derivation preserves the address for retry 512 caseshttp::tests::properties::cancelling_during_derivation_preserves_the_address_for_retry3.8 s
- ✓Disabling a tenant during derivation cannot publish an order 512 caseshttp::tests::properties::disabling_a_tenant_during_derivation_cannot_publish_an_order3.9 s
- ✓Every purchase identity field rejects conflicting replays 512 caseshttp::tests::properties::every_purchase_identity_field_rejects_conflicting_replays3.7 s
- ✓Every sql denial during order creation is atomic and retryable 512 caseshttp::tests::properties::every_sql_denial_during_order_creation_is_atomic_and_retryable179 ms
- ✓Exhausted counter still allows idempotent replays and never wraps 512 caseshttp::tests::properties::exhausted_counter_still_allows_idempotent_replays_and_never_wraps55 ms
- ✓Concurrent creation and retries use the production database worker 512 caseshttp::tests::properties::concurrent_creation_and_retries_use_the_production_database_worker11.9 s
- ✓Order creation crash child 512 caseshttp::tests::properties::order_creation_crash_child9 ms
- ✓Exhaustion and mismatched claims cannot corrupt allocation 512 caseshttp::tests::properties::exhaustion_and_mismatched_claims_cannot_corrupt_allocation2.8 s
- ✓Process death at order commit preserves atomic allocation 512 caseshttp::tests::properties::process_death_at_order_commit_preserves_atomic_allocation9.7 s
- ✓Request validation is atomic at integer and key boundaries 512 caseshttp::tests::properties::request_validation_is_atomic_at_integer_and_key_boundaries2.6 s
- ✓Requests without keys create distinct purchases 512 caseshttp::tests::properties::requests_without_keys_create_distinct_purchases10.9 s
- ✓Order histories preserve tenant scoped idempotency and addresses 512 caseshttp::tests::properties::order_histories_preserve_tenant_scoped_idempotency_and_addresses27.6 s
- ✓Sql failures and lost results never burn addresses 512 caseshttp::tests::properties::sql_failures_and_lost_results_never_burn_addresses4.0 s
engine::http::properties::authorization221 min
- ✓Bearer syntax cannot expand tenant authorityhttp::tests::properties::authorization::bearer_syntax_cannot_expand_tenant_authority528 ms
- ✓Body identity cannot steer own tenant operationshttp::tests::properties::authorization::body_identity_cannot_steer_own_tenant_operations646 ms
- ✓Concurrent rejections leave no writes or stream slot leakshttp::tests::properties::authorization::concurrent_rejections_leave_no_writes_or_stream_slot_leaks741 ms
- ✓Every route runs the engine and tenant rejection matrixhttp::tests::properties::authorization::every_route_runs_the_engine_and_tenant_rejection_matrix120 ms
- ✓Cross tenant refund writes are atomichttp::tests::properties::authorization::cross_tenant_refund_writes_are_atomic690 ms
- ✓Named revocation and cross tenant history replayshttp::tests::properties::authorization::named_revocation_and_cross_tenant_history_replays39 ms
- ✓Lists and live events expose only the authenticated tenanthttp::tests::properties::authorization::lists_and_live_events_expose_only_the_authenticated_tenant685 ms
- ✓Permission matrix rejects credentials without data or writeshttp::tests::properties::authorization::permission_matrix_rejects_credentials_without_data_or_writes691 ms
- ✓Payment lookup cannot read or credit another tenants outputshttp::tests::properties::authorization::payment_lookup_cannot_read_or_credit_another_tenants_outputs1.2 s
- ✓Repeated headers bind only the first presented capabilityhttp::tests::properties::authorization::repeated_headers_bind_only_the_first_presented_capability631 ms
- ✓Tenant ownership and revocation historieshttp::tests::properties::authorization::tenant_ownership_and_revocation_histories1.0 s
- ✓Bearer syntax cannot expand tenant authority 512 caseshttp::tests::properties::authorization::bearer_syntax_cannot_expand_tenant_authority4.6 s
- ✓Body identity cannot steer own tenant operations 512 caseshttp::tests::properties::authorization::body_identity_cannot_steer_own_tenant_operations5.6 s
- ✓Concurrent rejections leave no writes or stream slot leaks 512 caseshttp::tests::properties::authorization::concurrent_rejections_leave_no_writes_or_stream_slot_leaks6.2 s
- ✓Every route runs the engine and tenant rejection matrix 512 caseshttp::tests::properties::authorization::every_route_runs_the_engine_and_tenant_rejection_matrix178 ms
- ✓Cross tenant refund writes are atomic 512 caseshttp::tests::properties::authorization::cross_tenant_refund_writes_are_atomic5.8 s
- ✓Named revocation and cross tenant history replays 512 caseshttp::tests::properties::authorization::named_revocation_and_cross_tenant_history_replays65 ms
- ✓Lists and live events expose only the authenticated tenant 512 caseshttp::tests::properties::authorization::lists_and_live_events_expose_only_the_authenticated_tenant6.3 s
- ✓Permission matrix rejects credentials without data or writes 512 caseshttp::tests::properties::authorization::permission_matrix_rejects_credentials_without_data_or_writes5.9 s
- ✓Payment lookup cannot read or credit another tenants outputs 512 caseshttp::tests::properties::authorization::payment_lookup_cannot_read_or_credit_another_tenants_outputs10.7 s
- ✓Repeated headers bind only the first presented capability 512 caseshttp::tests::properties::authorization::repeated_headers_bind_only_the_first_presented_capability5.3 s
- ✓Tenant ownership and revocation histories 512 caseshttp::tests::properties::authorization::tenant_ownership_and_revocation_histories9.6 s
engine::http::query4104 ms
- ✓A select answers with rows and a write with why nothttp::query::tests::a_select_answers_with_rows_and_a_write_with_why_not27 ms
- ✓Every column is classifiedhttp::query::tests::every_column_is_classified21 ms
- ✓The schema lists the engines tables with secrets hiddenhttp::query::tests::the_schema_lists_the_engines_tables_with_secrets_hidden27 ms
- ✓Without the engine token nothing is readhttp::query::tests::without_the_engine_token_nothing_is_read29 ms
engine::http::status_page429 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_height9 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_stale7 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_floor6 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_unreachable7 ms
engine::link427 ms
- ✓A timeout halves the rate and the next timeout growslink::tests::a_timeout_halves_the_rate_and_the_next_timeout_grows7 ms
- ✓A new link starts slow and is given timelink::tests::a_new_link_starts_slow_and_is_given_time7 ms
- ✓History keeps an hour by the minutelink::tests::history_keeps_an_hour_by_the_minute7 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_work6 ms
engine::options_file4198 ms
- ✓Init writes the options file where xdg says and never overwrites itinit_writes_the_options_file_where_xdg_says_and_never_overwrites_it32 ms
- ✓The engine does not start on a file it cannot usethe_engine_does_not_start_on_a_file_it_cannot_use28 ms
- ✓Without a home the options file is in the working directorywithout_a_home_the_options_file_is_in_the_working_directory11 ms
- ✓The engine starts without a file and follows one and its optionsthe_engine_starts_without_a_file_and_follows_one_and_its_options127 ms
engine::property_support111 ms
- ✓Each property replays only its own regression fileproperty_support::each_property_replays_only_its_own_regression_file11 ms
engine::run7233 ms
- ✓A database that cannot be opened is an errorrun::tests::a_database_that_cannot_be_opened_is_an_error9 ms
- ✓A second start on the same files carries onrun::tests::a_second_start_on_the_same_files_carries_on66 ms
- ✓An embedded engine refuses the standalone engines settingsrun::tests::an_embedded_engine_refuses_the_standalone_engines_settings9 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_file52 ms
- ✓An engine starts serves its api and shuts down cleanlyrun::tests::an_engine_starts_serves_its_api_and_shuts_down_cleanly49 ms
- ✓The router still requires the engine tokenrun::tests::the_router_still_requires_the_engine_token40 ms
- ✓Without an engine token it does not startrun::tests::without_an_engine_token_it_does_not_start8 ms
engine::settings530 ms
- ✓A node without a publisher needs no zmq supportsettings::tests::a_node_without_a_publisher_needs_no_zmq_support6 ms
- ✓A publisher must be a tcp or ipc addresssettings::tests::a_publisher_must_be_a_tcp_or_ipc_address6 ms
- ✓A saved node round trips through json including fallbackssettings::tests::a_saved_node_round_trips_through_json_including_fallbacks6 ms
- ✓Bind addresses are classified as private or publicsettings::tests::bind_addresses_are_classified_as_private_or_public6 ms
- ✓The default bind address is loopback onlysettings::tests::the_default_bind_address_is_loopback_only6 ms
engine::threads430 ms
- ✓A cpu list takes numbers and ranges like tasksetthreads::tests::a_cpu_list_takes_numbers_and_ranges_like_taskset6 ms
- ✓Cpus that dont exist are refused before the runtime startsthreads::tests::cpus_that_dont_exist_are_refused_before_the_runtime_starts10 ms
- ✓Every engine thread is pinned and nicedthreads::tests::every_engine_thread_is_pinned_and_niced7 ms
- ✓Scans get one slot per cpu the engine may usethreads::tests::scans_get_one_slot_per_cpu_the_engine_may_use7 ms
engine::verification_temp_db16 ms
- ✓Owns unique paths and removes database sidecars and crash markersverification_temp_db::tests::owns_unique_paths_and_removes_database_sidecars_and_crash_markers6 ms
engine::zmtp11154 ms
- ✓A greeting from anything but a null zmtp 3 peer is refusedzmtp::tests::a_greeting_from_anything_but_a_null_zmtp_3_peer_is_refused8 ms
- ✓A peer that is not a publisher is refusedzmtp::tests::a_peer_that_is_not_a_publisher_is_refused10 ms
- ✓A ping is answered with its contextzmtp::tests::a_ping_is_answered_with_its_context8 ms
- ✓A publisher that never answers times outzmtp::tests::a_publisher_that_never_answers_times_out8 ms
- ✓Malformed frames end the connectionzmtp::tests::malformed_frames_end_the_connection11 ms
- ✓Arbitrary input ends in frames or an errorzmtp::tests::arbitrary_input_ends_in_frames_or_an_error22 ms
- ✓Messages yield their first frame whatever the framingzmtp::tests::messages_yield_their_first_frame_whatever_the_framing9 ms
- ✓Only tcp and ipc endpoints are connected tozmtp::tests::only_tcp_and_ipc_endpoints_are_connected_to8 ms
- ✓Messages round trip as their first framezmtp::tests::messages_round_trip_as_their_first_frame24 ms
- ✓What the subscriber sends is zmtp 3 0 byte for bytezmtp::tests::what_the_subscriber_sends_is_zmtp_3_0_byte_for_byte10 ms
- ✓Subscribes over tcp and unix socketszmtp::tests::subscribes_over_tcp_and_unix_sockets36 ms
javascript-disabled1619 ms
- ✓Refresh icon and settings fallback remain usable without JSjavascript-disabled.spec.js619 ms
monokulo::assets425 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_body6 ms
- ✓Every name links to a url the route servesassets::tests::every_name_links_to_a_url_the_route_serves6 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_name7 ms
- ✓The digest is computed at build time from the bytesassets::tests::the_digest_is_computed_at_build_time_from_the_bytes6 ms
monokulo::cli6211 ms
- ✓Every setting is an option and a bad value is refusedcli::tests::every_setting_is_an_option_and_a_bad_value_is_refused9 ms
- ✓The command line is well formedcli::tests::the_command_line_is_well_formed7 ms
- ✓The database path follows xdg unless givencli::tests::the_database_path_follows_xdg_unless_given89 ms
- ✓The embedded engines own defaults show in its help and init filecli::tests::the_embedded_engines_own_defaults_show_in_its_help_and_init_file86 ms
- ✓The embedded engines settings are engine optionscli::tests::the_embedded_engines_settings_are_engine_options10 ms
- ✓The options file is named or defaults to the config directorycli::tests::the_options_file_is_named_or_defaults_to_the_config_directory10 ms
monokulo::crypto7134 ms
- ✓A value bound to one row does not decrypt in anothercrypto::tests::a_value_bound_to_one_row_does_not_decrypt_in_another6 ms
- ✓Decrypting a non hex string returns an error not a paniccrypto::tests::decrypting_a_non_hex_string_returns_an_error_not_a_panic6 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_plaintext6 ms
- ✓Decrypting a truncated string returns an error not a paniccrypto::tests::decrypting_a_truncated_string_returns_an_error_not_a_panic6 ms
- ✓Decrypting with the wrong key returns an errorcrypto::tests::decrypting_with_the_wrong_key_returns_an_error6 ms
- ✓Encrypt then decrypt round trips to the exact original plaintextcrypto::tests::encrypt_then_decrypt_round_trips_to_the_exact_original_plaintext6 ms
- ✓Encrypting the same plaintext twice produces two different encoded stringscrypto::tests::encrypting_the_same_plaintext_twice_produces_two_different_encoded_strings98 ms
monokulo::embed_domains750 ms
- ✓A domain covers itself and its subdomains onlyembed_domains::tests::a_domain_covers_itself_and_its_subdomains_only8 ms
- ✓A missing record keeps counting through the grace period then lapsesembed_domains::tests::a_missing_record_keeps_counting_through_the_grace_period_then_lapses7 ms
- ✓A restricted policy allows only https pages on counting domainsembed_domains::tests::a_restricted_policy_allows_only_https_pages_on_counting_domains8 ms
- ✓A site is named only while a verified domain covers itembed_domains::tests::a_site_is_named_only_while_a_verified_domain_covers_it6 ms
- ✓A site url suggests its domain when it can be verifiedembed_domains::tests::a_site_url_suggests_its_domain_when_it_can_be_verified6 ms
- ✓Normalize domain accepts urls and rejects what cannot be verifiedembed_domains::tests::normalize_domain_accepts_urls_and_rejects_what_cannot_be_verified7 ms
- ✓Check finds the token only at the right nameembed_domains::tests::check_finds_the_token_only_at_the_right_name8 ms
monokulo::live7171 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_client22 ms
- ✓Last subscription dropped closes the upstreamlive::tests::last_subscription_dropped_closes_the_upstream18 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_watchers10 ms
- ✓Order changes outlive a new engine hublive::tests::order_changes_outlive_a_new_engine_hub24 ms
- ✓Parser handles split chunks comments and crlflive::tests::parser_handles_split_chunks_comments_and_crlf11 ms
- ✓Wake reaches only the named orderlive::tests::wake_reaches_only_the_named_order16 ms
- ✓Watchers woken by one change share one read of the orderlive::tests::watchers_woken_by_one_change_share_one_read_of_the_order70 ms
monokulo::logs4160 ms
- ✓A page of newer lines keeps those closest to the cursorlogs::tests::a_page_of_newer_lines_keeps_those_closest_to_the_cursor10 ms
- ✓Two stores merge newest first and page consistentlylogs::tests::two_stores_merge_newest_first_and_page_consistently7 ms
- ✓Without the engine or a store the page says whylogs::tests::without_the_engine_or_a_store_the_page_says_why7 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_list136 ms
monokulo::onion_listener361 ms
- ✓Each circuit is its own client and headerless connections are droppedeach_circuit_is_its_own_client_and_headerless_connections_are_dropped22 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_circuit20 ms
- ✓The ordinary listener never honours a proxy headerthe_ordinary_listener_never_honours_a_proxy_header19 ms
monokulo::qr16 ms
- ✓A code is one svg element hidden from screen readersqr::tests::a_code_is_one_svg_element_hidden_from_screen_readers6 ms
monokulo::templates536 ms
- ✓Display or dash shows the muted placeholder for none or emptytemplates::tests::display_or_dash_shows_the_muted_placeholder_for_none_or_empty8 ms
- ✓Format duration until handles under a minute and already passedtemplates::tests::format_duration_until_handles_under_a_minute_and_already_passed6 ms
- ✓Format duration until matches the moment js style examplestemplates::tests::format_duration_until_matches_the_moment_js_style_examples8 ms
- ✓Format duration until never shows more than two partstemplates::tests::format_duration_until_never_shows_more_than_two_parts7 ms
- ✓Format duration until skips a zero unit rather than showing ittemplates::tests::format_duration_until_skips_a_zero_unit_rather_than_showing_it7 ms
monokulo::wallets4262 ms
- ✓Backups are the apps paper or skippedwallets::tests::backups_are_the_apps_paper_or_skipped84 ms
- ✓A friendly name is two words and never one already takenwallets::tests::a_friendly_name_is_two_words_and_never_one_already_taken88 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_refused81 ms
- ✓When every pairing is taken a numbered name is usedwallets::tests::when_every_pairing_is_taken_a_numbered_name_is_used9 ms
order-creation11.9 s
- ✓Order creation, Back and changed or unchanged resubmission workorder-creation.spec.js1.9 s
pages-gallery-themes2862 ms
- ✓A light reader sees one thumbnail per frame in every theme modepages-gallery-themes.spec.js381 ms
- ✓A dark reader sees one thumbnail per frame in every theme modepages-gallery-themes.spec.js481 ms
shared::activity28 ms
- ✓Every event but the round s own belongs to a tieractivity::tests::every_event_but_the_round_s_own_belongs_to_a_tier4 ms
- ✓Recorded events round trip through jsonactivity::tests::recorded_events_round_trip_through_json4 ms
shared::auth734 ms
- ✓A raw token never shows in debug outputauth::tests::a_raw_token_never_shows_in_debug_output4 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_whitespace6 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_unique5 ms
- ✓Generated session tokens have the expected prefix and are uniqueauth::tests::generated_session_tokens_have_the_expected_prefix_and_are_unique4 ms
- ✓Hash is deterministic and sensitive to every bitauth::tests::hash_is_deterministic_and_sensitive_to_every_bit5 ms
shared::dns1487 ms
- ✓A cname is followed and a cname loop is refuseddns::tests::a_cname_is_followed_and_a_cname_loop_is_refused5 ms
- ✓A cut answer is asked again over tcpdns::tests::a_cut_answer_is_asked_again_over_tcp5 ms
- ✓A cut short or looping answer is refused without a panicdns::tests::a_cut_short_or_looping_answer_is_refused_without_a_panic5 ms
- ✓A forged or stray answer is dropped and the real one awaiteddns::tests::a_forged_or_stray_answer_is_dropped_and_the_real_one_awaited5 ms
- ✓A name is lower cased without its trailing dot or refuseddns::tests::a_name_is_lower_cased_without_its_trailing_dot_or_refused5 ms
- ✓A name server without glue is looked up firstdns::tests::a_name_server_without_glue_is_looked_up_first6 ms
- ✓A query asks one question with an edns sizedns::tests::a_query_asks_one_question_with_an_edns_size5 ms
- ✓An answer is read through name pointers and split txt stringsdns::tests::an_answer_is_read_through_name_pointers_and_split_txt_strings5 ms
- ✓A record is read from the zones own name server through the referraldns::tests::a_record_is_read_from_the_zones_own_name_server_through_the_referral9 ms
- ✓An odd byte in a label cant pass for a dotdns::tests::an_odd_byte_in_a_label_cant_pass_for_a_dot5 ms
- ✓Resolv conf gives its name serversdns::tests::resolv_conf_gives_its_name_servers5 ms
- ✓Any change to a real answer parses or is refused without a panicdns::tests::any_change_to_a_real_answer_parses_or_is_refused_without_a_panic8 ms
- ✓Any bytes parse or are refused without a panicdns::tests::any_bytes_parse_or_are_refused_without_a_panic13 ms
- ✓Unreachable roots fall back to the machines resolverdns::tests::unreachable_roots_fall_back_to_the_machines_resolver6 ms
shared::http_cache675 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_age11 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_cached11 ms
- ✓The configured byte cap actually evicts the oldest entry once exceededhttp_cache::tests::the_configured_byte_cap_actually_evicts_the_oldest_entry_once_exceeded11 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_not14 ms
- ✓A stale entry past its max age triggers a real refetchhttp_cache::tests::a_stale_entry_past_its_max_age_triggers_a_real_refetch17 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_entry11 ms
shared::ids16 ms
- ✓An id is its string in json and sqliteids::tests::an_id_is_its_string_in_json_and_sqlite6 ms
shared::log525 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_back5 ms
- ✓The macro throttles by the namespaced keylog::tests::the_macro_throttles_by_the_namespaced_key5 ms
- ✓The macro builds with fields and a formatted messagelog::tests::the_macro_builds_with_fields_and_a_formatted_message5 ms
- ✓The same key from two crates is throttled separatelylog::tests::the_same_key_from_two_crates_is_throttled_separately5 ms
shared::migrations317 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_row5 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_table6 ms
shared::monero_tx317 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_back6 ms
- ✓A pruned transactions id is the whole onesmonero_tx::tests::a_pruned_transactions_id_is_the_whole_ones6 ms
- ✓Whole and pruned blobs are never mistaken for each othermonero_tx::tests::whole_and_pruned_blobs_are_never_mistaken_for_each_other5 ms
shared::network210 ms
- ✓Rejects anything that isnt an exact known namenetwork::tests::rejects_anything_that_isnt_an_exact_known_name5 ms
- ✓Round trips every valid networknetwork::tests::round_trips_every_valid_network5 ms
shared::order_status15 ms
- ✓Every status round trips through its name and jsonorder_status::tests::every_status_round_trips_through_its_name_and_json5 ms
shared::password7312 ms
- ✓A panicking job answers nonepassword::tests::a_panicking_job_answers_none6 ms
- ✓A hashed password rejects a wrong passwordpassword::tests::a_hashed_password_rejects_a_wrong_password45 ms
- ✓A hashed password verifies against the originalpassword::tests::a_hashed_password_verifies_against_the_original49 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_thread64 ms
- ✓Hashing the same password twice produces different hashes but both verifypassword::tests::hashing_the_same_password_twice_produces_different_hashes_but_both_verify72 ms
- ✓Run keeps to one job per corepassword::tests::run_keeps_to_one_job_per_core70 ms
shared::rate_limit7113 ms
- ✓A changed limit applies to the next requestrate_limit::tests::a_changed_limit_applies_to_the_next_request5 ms
- ✓Allows up to the limit then rejects within the same windowrate_limit::tests::allows_up_to_the_limit_then_rejects_within_the_same_window4 ms
- ✓Different ips have independent budgetsrate_limit::tests::different_ips_have_independent_budgets4 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_one13 ms
- ✓Resets after the window elapsesrate_limit::tests::resets_after_the_window_elapses4 ms
- ✓Expired windows are actually removed not merely ignoredrate_limit::tests::expired_windows_are_actually_removed_not_merely_ignored12 ms
- ✓A flood of live addresses inside one window is still boundedrate_limit::tests::a_flood_of_live_addresses_inside_one_window_is_still_bounded71 ms
shared::resources4551 ms
- ✓The limit is the smaller of the machine and its containerresources::tests::the_limit_is_the_smaller_of_the_machine_and_its_container5 ms
- ✓This machine can be readresources::tests::this_machine_can_be_read5 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_hour36 ms
- ✓A hosted services threads are measured apartresources::tests::a_hosted_services_threads_are_measured_apart505 ms
shared::scaling15 ms
- ✓The pace is named by what limits the scanscaling::tests::the_pace_is_named_by_what_limits_the_scan5 ms
shared::sqlite6241 ms
- ✓A pool whose threads stopped says sosqlite::tests::a_pool_whose_threads_stopped_says_so5 ms
- ✓A panicking job fails alone and the thread carries onsqlite::tests::a_panicking_job_fails_alone_and_the_thread_carries_on8 ms
- ✓A slow job does not hold up the nextsqlite::tests::a_slow_job_does_not_hold_up_the_next10 ms
- ✓Read only refuses writes and restores the connectionsqlite::tests::read_only_refuses_writes_and_restores_the_connection7 ms
- ✓Readers see the writers commits and cannot writesqlite::tests::readers_see_the_writers_commits_and_cannot_write6 ms
- ✓Inline runs on the shared value and refuses a held locksqlite::tests::inline_runs_on_the_shared_value_and_refuses_a_held_lock205 ms
shared::sqlite_query10438 ms
- ✓A blob shows its size and first bytessqlite_query::tests::a_blob_shows_its_size_and_first_bytes11 ms
- ✓A mistake says wheresqlite_query::tests::a_mistake_says_where10 ms
- ✓A secret column reads as null however it is reachedsqlite_query::tests::a_secret_column_reads_as_null_however_it_is_reached10 ms
- ✓A select returns its columns and rowssqlite_query::tests::a_select_returns_its_columns_and_rows10 ms
- ✓Limits never go past a ceilingsqlite_query::tests::limits_never_go_past_a_ceiling4 ms
- ✓Anything that changes data or steps outside is refusedsqlite_query::tests::anything_that_changes_data_or_steps_outside_is_refused11 ms
- ✓Only one statement runs and nothing is nothingsqlite_query::tests::only_one_statement_runs_and_nothing_is_nothing10 ms
- ✓The connection is left as it wassqlite_query::tests::the_connection_is_left_as_it_was148 ms
- ✓The schema lists tables columns and rows and which columns are hiddensqlite_query::tests::the_schema_lists_tables_columns_and_rows_and_which_columns_are_hidden13 ms
- ✓Rows values and time have limitssqlite_query::tests::rows_values_and_time_have_limits211 ms
shared::supervise526 ms
- ✓A loop supervised until stopped is aborted and not restartedsupervise::tests::a_loop_supervised_until_stopped_is_aborted_and_not_restarted6 ms
- ✓A loop that keeps failing backs off and is countedsupervise::tests::a_loop_that_keeps_failing_backs_off_and_is_counted5 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::unreachable15 ms
- ✓A request ends without an answerunreachable::tests::a_request_ends_without_an_answer5 ms
shared::xmr_amount630 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_place5 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_wraparound5 ms
- ✓Every other malformed decimal shape is rejectedxmr_amount::tests::every_other_malformed_decimal_shape_is_rejected5 ms
- ✓Format piconero as xmr matches hand computed valuesxmr_amount::tests::format_piconero_as_xmr_matches_hand_computed_values5 ms
- ✓Format and parse xmr round tripxmr_amount::tests::format_and_parse_xmr_round_trip5 ms
- ✓Parse xmr to piconero matches hand computed valuesxmr_amount::tests::parse_xmr_to_piconero_matches_hand_computed_values5 ms
short-id::tests939 ms
- ✓A known prefix stays in front of the shortened valuetests::a_known_prefix_stays_in_front_of_the_shortened_value4 ms
- ✓A measurement shows its start its middle and its endtests::a_measurement_shows_its_start_its_middle_and_its_end4 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_characters5 ms
- ✓An address middle is centred on odd and even lengthstests::an_address_middle_is_centred_on_odd_and_even_lengths4 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
- ✓An address shows its start its middle and its endtests::an_address_shows_its_start_its_middle_and_its_end4 ms
- ✓Shortening cuts on character boundariestests::shortening_cuts_on_character_boundaries4 ms
short-values43.6 s
- ✓An order's ID at the top of its page shows short, and copies, reads and finds wholeshort-values.spec.js918 ms
- ✓An order ID on the dashboard is a short, underlined link to the order whose name is the whole IDshort-values.spec.js1.1 s
- ✓An order ID on the orders list is a short, underlined link to the order whose name is the whole IDshort-values.spec.js903 ms
- ✓A double-click on an order ID link opens the order: the link wins over selecting itshort-values.spec.js657 ms
static-assets::tests312 ms
- ✓A file is published at its digest unless others link ittests::a_file_is_published_at_its_digest_unless_others_link_it4 ms
- ✓Every weight of the typeface is linked where the page saystests::every_weight_of_the_typeface_is_linked_where_the_page_says4 ms
- ✓The digest is computed at build time from the bytestests::the_digest_is_computed_at_build_time_from_the_bytes4 ms
status-network-card721.4 s
- ✓An admin sees the card titled Mainnet, its nodes and proof of work 3 behind the tipstatus-network-card.spec.js3.9 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.js2.1 s
- ✓On a phone each node is a card and the window still readsstatus-network-card.spec.js1.2 s
- ✓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.js579 ms
- ✓The card follows the engine live, the new markup swapped in wholestatus-network-card.spec.js10.6 s
store-settings323.7 s
- ✓A change marks its card and shows the save bar, and Discard puts it backstore-settings.spec.js8.5 s
- ✓A save says so on the card and in a toast; a refused one keeps what was typedstore-settings.spec.js9.5 s
- ✓Without JavaScript the save bar is always there and saves, refused or notstore-settings.spec.js5.6 s
store-site424.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.js14.0 s
- ✓Without JavaScript the dialogs are pagesstore-site.spec.js3.9 s
- ✓On a phone the Connections card stacks its buttonstore-site.spec.js1.3 s
- ✓Disconnecting waits while an order from the shop can be paidstore-site.spec.js5.4 s
ui::components::content::avatar_tests14 ms
- ✓The letter is the first word s first letter or digitcomponents::content::avatar_tests::the_letter_is_the_first_word_s_first_letter_or_digit4 ms
ui::select728 ms
- ✓A network on its own is its badgea_network_on_its_own_is_its_badge4 ms
- ✓A logo is for the list onlya_logo_is_for_the_list_only4 ms
- ✓A plain option is a plain optiona_plain_option_is_a_plain_option4 ms
- ✓A select is an island around a working selecta_select_is_an_island_around_a_working_select4 ms
- ✓An option names its network in words and for the badgean_option_names_its_network_in_words_and_for_the_badge4 ms
- ✓An option says everything in words and gives the list its partsan_option_says_everything_in_words_and_gives_the_list_its_parts4 ms
- ✓Only current is greenonly_current_is_green4 ms
ui::template520 ms
- ✓Absent options and empty lists take the other branchabsent_options_and_empty_lists_take_the_other_branch4 ms
- ✓Class is the components ownclass_is_the_components_own4 ms
- ✓Every form renders as maud would write itevery_form_renders_as_maud_would_write_it4 ms
- ✓Slots hold text components and markupslots_hold_text_components_and_markup4 ms
- ✓The description lists props with their defaultsthe_description_lists_props_with_their_defaults4 ms
wallet-details212.9 s
- ✓The Details card renames the wallet: marked, discarded, refused, savedwallet-details.spec.js11.7 s
- ✓Without JavaScript the wallet is renamed with the save bar, which is always therewallet-details.spec.js1.3 s
wallet-page732.8 s
- ✓A wallet's page is one column: where it lives, stores, details, history, then Retirewallet-page.spec.js3.5 s
- ✓Where it lives says how each wallet was backed up or which app it is inwallet-page.spec.js3.5 s
- ✓The retire dialog is blocked while a store takes payments into the wallet and an order can be paidwallet-page.spec.js5.3 s
- ✓A wallet nothing uses is retired by typing its name, then restored with its keyswallet-page.spec.js11.5 s
- ✓Without JavaScript the dialogs are pageswallet-page.spec.js5.0 s
- ✓On a phone a wallet's page stays one columnwallet-page.spec.js1.0 s
- ✓The setup flow's network dropdown shows each network as its badgewallet-page.spec.js3.0 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.js42.1 s
- ✓The check lets you go on without answering after 20 secondswallet-setup.spec.js9.0 s
- ✓Skipping the backup needs the warning read, the box ticked and "skip" typedwallet-setup.spec.js5.8 s
- ✓With JavaScript off › a store with no site is set up on a wallet already added; creating one is shown unavailablewallet-setup.spec.js14.4 s
- ✓With JavaScript off › bringing your own wallet works and shows where the keys arewallet-setup.spec.js4.6 s
- ✓A wallet lists its stores and is renamed on its pagewallet-setup.spec.js9.0 s
- ✓A store changes its wallet: the dropdown asks first, then the history shows bothwallet-setup.spec.js15.0 s
wallet-setup::tests448 ms
- ✓A restore link fits in a qr codetests::a_restore_link_fits_in_a_qr_code14 ms
- ✓Different entropy makes a different wallet and only 150 bits counttests::different_entropy_makes_a_different_wallet_and_only_150_bits_count14 ms
- ✓Each network gets its own address prefixtests::each_network_gets_its_own_address_prefix12 ms
- ✓The birthday is kept in the phrasetests::the_birthday_is_kept_in_the_phrase8 ms
wallets-networks621.1 s
- ✓Mainnet wallets are the list and the test networks are folded below, shutwallets-networks.spec.js6.6 s
- ✓With only test wallets the fold starts open and says there is no mainnet wallet yetwallets-networks.spec.js3.9 s
- ✓On a phone each wallet is a cardwallets-networks.spec.js854 ms
- ✓A wallet's page shows its network beside its namewallets-networks.spec.js3.7 s
- ✓The dashboard shows each store's wallet with its networkwallets-networks.spec.js3.4 s
- ✓Pickers show each wallet with its network, and a store changes only within its ownwallets-networks.spec.js2.7 s
No tests match. Try a shorter word, or clear the suite and area filters.