Skip to content

test: cover register_service_with_metadata atomicity and svc_reg event#143

Merged
mikewheeleer merged 1 commit into
Agentpay-Org:mainfrom
fikrah-Tech:feature/contracts-config-change-events
Jun 29, 2026
Merged

test: cover register_service_with_metadata atomicity and svc_reg event#143
mikewheeleer merged 1 commit into
Agentpay-Org:mainfrom
fikrah-Tech:feature/contracts-config-change-events

Conversation

@yunus-dev-codecrafter

Copy link
Copy Markdown
Contributor

closes #100

test: cover register_service_with_metadata atomicity and svc_reg event

Summary

Adds the missing register_service_with_metadata entrypoint and comprehensive
test coverage for the atomic registration-plus-metadata operation.

Changes

contracts/escrow/src/lib.rs — new entrypoint

Created register_service_with_metadata(env, service_id, description, owner):

Also applied cargo fmt fixes to resolve_dispute (pre-existing formatting drift).

contracts/escrow/src/test.rs — 7 new tests

Test Coverage
test_register_service_with_metadata_sets_both_slots After one call, is_service_registered is true and get_service_metadata returns the exact description + owner.
test_register_service_with_metadata_emits_svc_reg_event svc_reg(service_id, owner) event is emitted via env.events().all().
test_register_service_with_metadata_idempotent_overwrite Re-registering an existing id overwrites its metadata (owner and description).
test_register_service_with_metadata_empty_description An empty String description is accepted.
test_register_service_with_metadata_rejects_non_admin #[should_panic] — non-admin caller is rejected.
test_register_service_with_metadata_panics_when_paused #[should_panic(expected = "Error(Contract, #4)")] — pause gate honoured.
test_register_service_with_metadata_equivalent_to_separate_calls Combined call produces identical storage state to register_service + set_service_metadata sequence.

Also fixed 17 pre-existing client.settle(&admin, &agent, &svc) calls — the
Soroban SDK 22.0 client generator strips env from entrypoint arguments, so
settle(env, agent, service_id) produces a 2-arg client method
settle(&self, agent, service_id).

Test output

running 7 tests
test test_register_service_with_metadata_idempotent_overwrite ... ok
test test_register_service_with_metadata_empty_description ... ok
test test_register_service_with_metadata_emits_svc_reg_event ... ok
test test_register_service_with_metadata_equivalent_to_separate_calls ... ok
test test_register_service_with_metadata_panics_when_paused - should panic ... ok
test test_register_service_with_metadata_rejects_non_admin - should panic ... ok
test test_register_service_with_metadata_sets_both_slots ... ok

test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 179 filtered out; finished in 0.23s

Security notes

  • Registration and metadata land together: Both ServiceRegistered and
    ServiceMetadata are written in a single call; there is no window where
    a service is registered but has no metadata (or vice versa).
  • Only admin can call: require_admin gates the entrypoint; non-admin
    callers are rejected with a panic.
  • Pause gate respected: ensure_not_paused is checked before any state
    mutation, preventing calls while the contract is paused.
  • Idempotent: Re-registering an existing service id overwrites metadata
    without side effects; empty descriptions are accepted.

@mikewheeleer

Copy link
Copy Markdown
Contributor

solid — merging now

@mikewheeleer mikewheeleer merged commit 262c66b into Agentpay-Org:main Jun 29, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add tests for register_service_with_metadata atomicity and the svc_reg event

2 participants