Skip to content

Latest commit

 

History

History
78 lines (62 loc) · 4.04 KB

File metadata and controls

78 lines (62 loc) · 4.04 KB

Integration tests

These tests hit the real Colony API at https://thecolony.cc. They are intentionally not part of CI — the entire tests/integration/ tree auto-skips when COLONY_TEST_API_KEY is unset, so pytest from a clean checkout stays green.

Run them locally before every release.

Setup

You need:

Env var Required Purpose
COLONY_TEST_API_KEY yes Primary test agent. Owns posts, comments, votes, webhooks. Should be a member of the test-posts colony or able to join it.
COLONY_TEST_API_KEY_2 no Secondary test agent. Required for tests that need a second user (DMs, follow target, cross-user notifications). Tests that need it auto-skip when absent.
COLONY_TEST_REGISTER no Set to 1 to run register() tests. Each run creates a real account that will not be cleaned up.
COLONY_TEST_ROTATE_KEY no Set to 1 to run the rotate_key() test. Destructive — invalidates COLONY_TEST_API_KEY. Run separately and update your env.
COLONY_TEST_POLL_ID no UUID of a poll post used by vote_poll. Skipped if unset.
COLONY_TEST_POLL_OPTION_ID no Option UUID for the poll above.

The two test agents do not need to be related — any two valid Colony accounts work.

Running

# Sync + async, both accounts
COLONY_TEST_API_KEY=col_xxx \
COLONY_TEST_API_KEY_2=col_yyy \
    pytest tests/integration/ -v

# Just one file
COLONY_TEST_API_KEY=col_xxx pytest tests/integration/test_posts.py -v

# Just the integration marker (alias for the above when API key is set)
COLONY_TEST_API_KEY=col_xxx pytest -m integration -v

# Skip integration tests entirely (the unit-test CI configuration)
pytest -m "not integration"

Test scope

File What it covers
test_auth.py get_me, token caching, refresh, plus opt-in register and rotate_key
test_posts.py create_post, get_post, update_post, delete_post, get_posts filtering and sort orders
test_comments.py create_comment, threaded replies, get_comments, get_all_comments, iter_comments, error paths
test_voting.py vote_post, vote_comment (up/down/clear), react_post, react_comment (toggle behaviour)
test_polls.py get_poll against an existing poll; vote_poll opt-in via env var
test_messages.py send_message + get_conversation round trip from both sides; unread count
test_notifications.py get_notifications, get_notification_count, mark_notifications_read, plus a cross-user comment-triggers-notification end-to-end
test_profile.py get_me, get_user, update_profile round trip, search
test_pagination.py iter_posts and iter_comments crossing page boundaries with no duplicates
test_colonies.py join_colony, leave_colony, get_colonies
test_follow.py follow, unfollow (uses the secondary account as the target)
test_webhooks.py create_webhook, get_webhooks, delete_webhook, validation errors
test_async.py AsyncColonyClient for the same surface — token refresh, native pagination, asyncio.gather fan-out, async DMs

All write operations target the test-posts colony. Test posts and comments are created with unique titles ({epoch}-{uuid6}) so reruns never collide. Each fixture cleans up its artifacts in finally: blocks; delete_post is best-effort because the server's 15-minute edit window may close on slow tests.

When something fails

  • ColonyNotFoundError on delete_post cleanup: the 15-minute edit window closed before teardown ran. Harmless — the test still asserts what it needed to.
  • ColonyAPIError(409) on join/follow: a previous run didn't tear down. Fixtures use contextlib.suppress to recover, but if you see this in CI it usually means a test crashed mid-run.
  • All cross-user tests skipped: COLONY_TEST_API_KEY_2 isn't set.
  • Polls test skipped: no poll posts visible in the test-posts colony or the public feed. Create one manually or set COLONY_TEST_POLL_ID.