run federation tests twice

federation-send-parallel
phiresky 2024-05-31 11:12:53 +02:00
parent 5538794d7c
commit 7ee63f4da8
5 changed files with 32 additions and 32 deletions

View File

@ -236,6 +236,7 @@ steps:
- cd api_tests/ - cd api_tests/
- pnpm i - pnpm i
- pnpm api-test - pnpm api-test
- pnpm api-test # run twice to ensure they don't create state
when: *slow_check_paths when: *slow_check_paths
federation_tests_server_output: federation_tests_server_output:

View File

@ -21,39 +21,36 @@ test("Follow local community", async () => {
let user = await registerUser(beta, betaUrl); let user = await registerUser(beta, betaUrl);
let community = (await resolveBetaCommunity(user)).community!; let community = (await resolveBetaCommunity(user)).community!;
expect(community.counts.subscribers).toBe(1);
expect(community.counts.subscribers_local).toBe(1);
let follow = await followCommunity(user, true, community.community.id); let follow = await followCommunity(user, true, community.community.id);
// Make sure the follow response went through // Make sure the follow response went through
expect(follow.community_view.community.local).toBe(true); expect(follow.community_view.community.local).toBe(true);
expect(follow.community_view.subscribed).toBe("Subscribed"); expect(follow.community_view.subscribed).toBe("Subscribed");
expect(follow.community_view.counts.subscribers).toBe(2); expect(follow.community_view.counts.subscribers).toBe(community.counts.subscribers + 1);
expect(follow.community_view.counts.subscribers_local).toBe(2); expect(follow.community_view.counts.subscribers_local).toBe(community.counts.subscribers_local + 1);
// Test an unfollow // Test an unfollow
let unfollow = await followCommunity(user, false, community.community.id); let unfollow = await followCommunity(user, false, community.community.id);
expect(unfollow.community_view.subscribed).toBe("NotSubscribed"); expect(unfollow.community_view.subscribed).toBe("NotSubscribed");
expect(unfollow.community_view.counts.subscribers).toBe(1); expect(unfollow.community_view.counts.subscribers).toBe(community.counts.subscribers);
expect(unfollow.community_view.counts.subscribers_local).toBe(1); expect(unfollow.community_view.counts.subscribers_local).toBe(community.counts.subscribers_local);
}); });
test("Follow federated community", async () => { test("Follow federated community", async () => {
// It takes about 1 second for the community aggregates to federate // It takes about 1 second for the community aggregates to federate
let betaCommunity = ( const betaCommunityInitial = (
await waitUntil( await waitUntil(
() => resolveBetaCommunity(alpha), () => resolveBetaCommunity(alpha),
c => c =>
c.community?.counts.subscribers === 1 && !!c.community && (c.community?.counts.subscribers >= 1)
c.community.counts.subscribers_local === 0,
) )
).community; ).community;
if (!betaCommunity) { if (!betaCommunityInitial) {
throw "Missing beta community"; throw "Missing beta community";
} }
let follow = await followCommunity(alpha, true, betaCommunity.community.id); let follow = await followCommunity(alpha, true, betaCommunityInitial.community.id);
expect(follow.community_view.subscribed).toBe("Pending"); expect(follow.community_view.subscribed).toBe("Pending");
betaCommunity = ( const betaCommunity = (
await waitUntil( await waitUntil(
() => resolveBetaCommunity(alpha), () => resolveBetaCommunity(alpha),
c => c.community?.subscribed === "Subscribed", c => c.community?.subscribed === "Subscribed",
@ -64,20 +61,19 @@ test("Follow federated community", async () => {
expect(betaCommunity?.community.local).toBe(false); expect(betaCommunity?.community.local).toBe(false);
expect(betaCommunity?.community.name).toBe("main"); expect(betaCommunity?.community.name).toBe("main");
expect(betaCommunity?.subscribed).toBe("Subscribed"); expect(betaCommunity?.subscribed).toBe("Subscribed");
expect(betaCommunity?.counts.subscribers_local).toBe(1); expect(betaCommunity?.counts.subscribers_local).toBe(betaCommunityInitial.counts.subscribers_local + 1);
// check that unfollow was federated // check that unfollow was federated
let communityOnBeta1 = await resolveBetaCommunity(beta); let communityOnBeta1 = await resolveBetaCommunity(beta);
expect(communityOnBeta1.community?.counts.subscribers).toBe(2); expect(communityOnBeta1.community?.counts.subscribers).toBe(betaCommunityInitial.counts.subscribers + 1);
expect(communityOnBeta1.community?.counts.subscribers_local).toBe(1); expect(communityOnBeta1.community?.counts.subscribers_local).toBe(betaCommunityInitial.counts.subscribers_local);
// Check it from local // Check it from local
let site = await getSite(alpha); let site = await getSite(alpha);
let remoteCommunityId = site.my_user?.follows.find( let remoteCommunityId = site.my_user?.follows.find(
c => c.community.local == false, c => c.community.local == false && c.community.id === betaCommunityInitial.community.id,
)?.community.id; )?.community.id;
expect(remoteCommunityId).toBeDefined(); expect(remoteCommunityId).toBeDefined();
expect(site.my_user?.follows.length).toBe(2);
if (!remoteCommunityId) { if (!remoteCommunityId) {
throw "Missing remote community id"; throw "Missing remote community id";
@ -89,10 +85,10 @@ test("Follow federated community", async () => {
// Make sure you are unsubbed locally // Make sure you are unsubbed locally
let siteUnfollowCheck = await getSite(alpha); let siteUnfollowCheck = await getSite(alpha);
expect(siteUnfollowCheck.my_user?.follows.length).toBe(1); expect(siteUnfollowCheck.my_user?.follows.find(c => c.community.id === betaCommunityInitial.community.id)).toBe(undefined);
// check that unfollow was federated // check that unfollow was federated
let communityOnBeta2 = await resolveBetaCommunity(beta); let communityOnBeta2 = await waitUntil(() => resolveBetaCommunity(beta), c => c.community?.counts.subscribers === betaCommunityInitial.counts.subscribers);
expect(communityOnBeta2.community?.counts.subscribers).toBe(1); expect(communityOnBeta2.community?.counts.subscribers).toBe(betaCommunityInitial.counts.subscribers);
expect(communityOnBeta2.community?.counts.subscribers_local).toBe(1); expect(communityOnBeta2.community?.counts.subscribers_local).toBe(1);
}); });

View File

@ -52,17 +52,19 @@ beforeAll(async () => {
afterAll(unfollows); afterAll(unfollows);
async function assertPostFederation(postOne: PostView, postTwo: PostView) { async function assertPostFederation(postOne: PostView, postTwo: PostView, waitForMeta = true) {
// Link metadata is generated in background task and may not be ready yet at this time, // Link metadata is generated in background task and may not be ready yet at this time,
// so wait for it explicitly. For removed posts we cant refetch anything. // so wait for it explicitly. For removed posts we cant refetch anything.
postOne = await waitForPost(beta, postOne.post, res => { if(waitForMeta) {
return res === null || res?.post.embed_title !== null; postOne = await waitForPost(beta, postOne.post, res => {
}); return res === null || !!res?.post.embed_title;
postTwo = await waitForPost( });
beta, postTwo = await waitForPost(
postTwo.post, beta,
res => res === null || res?.post.embed_title !== null, postTwo.post,
); res => res === null || !!res?.post.embed_title,
);
}
expect(postOne?.post.ap_id).toBe(postTwo?.post.ap_id); expect(postOne?.post.ap_id).toBe(postTwo?.post.ap_id);
expect(postOne?.post.name).toBe(postTwo?.post.name); expect(postOne?.post.name).toBe(postTwo?.post.name);
@ -408,7 +410,7 @@ test("Remove a post from admin and community on same instance", async () => {
p => p?.post_view.post.removed ?? false, p => p?.post_view.post.removed ?? false,
); );
expect(alphaPost?.post_view.post.removed).toBe(true); expect(alphaPost?.post_view.post.removed).toBe(true);
await assertPostFederation(alphaPost.post_view, removePostRes.post_view); await assertPostFederation(alphaPost.post_view, removePostRes.post_view, false);
// Undelete // Undelete
let undeletedPost = await removePost(beta, false, betaPost.post); let undeletedPost = await removePost(beta, false, betaPost.post);

View File

@ -130,7 +130,7 @@ test("Requests with invalid auth should be treated as unauthenticated", async ()
}); });
test("Create user with Arabic name", async () => { test("Create user with Arabic name", async () => {
let user = await registerUser(alpha, alphaUrl, "تجريب"); let user = await registerUser(alpha, alphaUrl, "تجريب" + Math.random().toString().slice(2, 5));
let site = await getSite(user); let site = await getSite(user);
expect(site.my_user).toBeDefined(); expect(site.my_user).toBeDefined();

View File

@ -26,7 +26,8 @@ impl PartialEq for SendSuccessInfo {
self.activity_id == other.activity_id self.activity_id == other.activity_id
} }
} }
/// order backwards because the binary heap is a max heap, and we need the smallest element to be on top /// order backwards because the binary heap is a max heap, and we need the smallest element to be on
/// top
impl PartialOrd for SendSuccessInfo { impl PartialOrd for SendSuccessInfo {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> { fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
other.activity_id.partial_cmp(&self.activity_id) other.activity_id.partial_cmp(&self.activity_id)