UserSyncUI / tests /test_social_engine.py
AUXteam's picture
Upload folder using huggingface_hub
c1d0c23 verified
import pytest
from tinytroupe.social_network import NetworkTopology
from tinytroupe.network_generator import NetworkGenerator
from tinytroupe.influence import InfluencePropagator
from tinytroupe.agent import TinyPerson
from tinytroupe.agent.social_types import Content
def test_network_topology():
TinyPerson.clear_agents()
topo = NetworkTopology()
p1 = TinyPerson("Alice")
p2 = TinyPerson("Bob")
topo.add_persona(p1)
topo.add_persona(p2)
topo.add_connection("Alice", "Bob", strength=0.9, relationship_type="friend")
assert "Alice" in topo.nodes
assert "Bob" in topo.nodes
assert len(topo.edges) == 1
assert "Bob" in p1.social_connections
assert p1.social_connections["Bob"].strength == 0.9
def test_network_generation():
TinyPerson.clear_agents()
personas = [TinyPerson(f"P{i}") for i in range(10)]
gen = NetworkGenerator(personas)
sf_net = gen.generate_scale_free_network(10, 2)
assert len(sf_net.nodes) == 10
assert len(sf_net.edges) > 0
sw_net = gen.generate_small_world_network(10, 4, 0.1)
assert len(sw_net.nodes) == 10
assert len(sw_net.edges) > 0
def test_influence_propagation():
TinyPerson.clear_agents()
topo = NetworkTopology()
personas = [TinyPerson(f"P{i}") for i in range(5)]
for p in personas:
topo.add_persona(p)
# Give them high engagement probability to ensure propagation in test
p.engagement_patterns["overall_rate"] = 1.0
p._persona.update({"age": 30, "occupation": "User", "nationality": "US", "residence": "CA"})
# Create a line of connections: P0 -> P1 -> P2 -> P3 -> P4
for i in range(4):
topo.add_connection(f"P{i}", f"P{i+1}", strength=1.0)
propagator = InfluencePropagator(topo)
content = Content(text="Viral message", topics=["test"])
# Mock calculate_engagement_probability to always return high value
from unittest.mock import patch
with patch.object(TinyPerson, 'calculate_engagement_probability', return_value=0.8):
result = propagator.propagate(["P0"], content)
assert result.total_reach > 1
assert "P0" in result.activated_personas
# Since steps are limited and it's probabilistic (though we mocked it high), check we reached some depth
assert result.cascade_depth >= 1