From 8be2fb5a77a0c549ec05626e65bf46c35d0489a3 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Fri, 24 Apr 2026 08:49:52 -0500 Subject: [PATCH] test: LeaderElection attempt_election + leader_call callbacks --- test/aprsme/cluster/leader_election_test.exs | 57 ++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/test/aprsme/cluster/leader_election_test.exs b/test/aprsme/cluster/leader_election_test.exs index 21d07b3..113d1f2 100644 --- a/test/aprsme/cluster/leader_election_test.exs +++ b/test/aprsme/cluster/leader_election_test.exs @@ -422,4 +422,61 @@ defmodule Aprsme.Cluster.LeaderElectionTest do assert new_state.election_forced end end + + describe "handle_info(:attempt_election) direct callback" do + setup do + :global.unregister_name(@election_key) + + on_exit(fn -> + :global.unregister_name(@election_key) + end) + + :ok + end + + test "becomes leader and persists leadership when no other registration exists" do + state = %LeaderElection{ + cluster_enabled: false, + is_leader: false, + leader_node: nil + } + + assert {:noreply, new_state} = + LeaderElection.handle_info(:attempt_election, state) + + assert new_state.is_leader == true + assert new_state.leader_node == node() + end + + test "re-confirms leadership when already registered as self" do + # Pre-register ourselves as the leader. + :global.register_name(@election_key, self()) + + state = %LeaderElection{ + cluster_enabled: false, + is_leader: false, + leader_node: nil + } + + assert {:noreply, new_state} = + LeaderElection.handle_info(:attempt_election, state) + + assert new_state.is_leader == true + end + end + + describe "handle_call callbacks" do + test "leader? returns state.is_leader" do + state = %LeaderElection{is_leader: true} + assert {:reply, true, ^state} = LeaderElection.handle_call(:leader?, self(), state) + + state2 = %LeaderElection{is_leader: false} + assert {:reply, false, ^state2} = LeaderElection.handle_call(:leader?, self(), state2) + end + + test "current_leader returns state.leader_node" do + state = %LeaderElection{leader_node: :node_a} + assert {:reply, :node_a, ^state} = LeaderElection.handle_call(:current_leader, self(), state) + end + end end