File size: 2,142 Bytes
c1d0c23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import pytest
from unittest.mock import MagicMock, patch
from tinytroupe.content_generation import ContentVariantGenerator
from tinytroupe.variant_optimizer import VariantOptimizer
from tinytroupe.ml_models import EngagementPredictor
from tinytroupe.agent.social_types import Content
from tinytroupe.agent import TinyPerson

@pytest.fixture
def mock_llm():
    with patch("tinytroupe.openai_utils.client") as mock:
        client = MagicMock()
        mock.return_value = client
        client.send_message.return_value = {"content": "Rewritten content variant"}
        yield client

def test_content_variant_generation(mock_llm):
    generator = ContentVariantGenerator()
    original = "This is a test post."
    variants = generator.generate_variants(original, num_variants=3)

    assert len(variants) == 3
    assert variants[0].text == "Rewritten content variant"
    assert variants[0].original_content == original

def test_variant_optimization(mock_llm):
    TinyPerson.clear_agents()
    predictor = EngagementPredictor()
    optimizer = VariantOptimizer(predictor)

    personas = [TinyPerson("User1"), TinyPerson("User2")]
    for p in personas:
        p._persona.update({"age": 25, "occupation": "Tester", "nationality": "US", "residence": "NY"})

    from tinytroupe.content_generation import ContentVariant
    variants = [
        ContentVariant("Variant 1", "strategy", {}, "original"),
        ContentVariant("Variant 2", "strategy", {}, "original")
    ]

    # Mock predictor to return different scores for different variants
    with patch.object(EngagementPredictor, 'predict') as mock_predict:
        mock_predict.side_effect = [0.8, 0.7, 0.4, 0.5] # V1 for P1, P2; V2 for P1, P2

        from tinytroupe.social_network import NetworkTopology
        network = NetworkTopology()

        ranked = optimizer.rank_variants_for_audience(variants, personas, network)

        assert len(ranked) == 2
        assert ranked[0].variant.text == "Variant 1"
        assert ranked[0].score == 0.75 # (0.8 + 0.7) / 2
        assert ranked[1].variant.text == "Variant 2"
        assert ranked[1].score == 0.45 # (0.4 + 0.5) / 2