Big-Link-Man/tests/unit/test_site_provisioning.py

147 lines
4.9 KiB
Python

"""
Unit tests for site provisioning
"""
import pytest
from unittest.mock import Mock, MagicMock, patch
from src.generation.site_provisioning import (
generate_random_suffix,
slugify_keyword,
create_bunnynet_site,
provision_keyword_sites,
create_generic_sites
)
from src.deployment.bunnynet import StorageZoneResult, PullZoneResult, BunnyNetAPIError
class TestHelperFunctions:
"""Tests for helper functions"""
def test_generate_random_suffix(self):
suffix = generate_random_suffix(4)
assert len(suffix) == 4
assert suffix.isalnum()
def test_generate_random_suffix_custom_length(self):
suffix = generate_random_suffix(8)
assert len(suffix) == 8
def test_slugify_keyword(self):
assert slugify_keyword("Engine Repair") == "engine-repair"
assert slugify_keyword("Car Maintenance!") == "car-maintenance"
assert slugify_keyword(" spaces ") == "spaces"
assert slugify_keyword("Multiple Spaces") == "multiple-spaces"
class TestCreateBunnynetSite:
"""Tests for create_bunnynet_site function"""
@patch('src.generation.site_provisioning.generate_random_suffix')
def test_successful_site_creation(self, mock_suffix):
mock_suffix.return_value = "abc123"
bunny_client = Mock()
bunny_client.create_storage_zone.return_value = StorageZoneResult(
id=100,
name="engine-repair-abc123",
password="test_password",
region="DE"
)
bunny_client.create_pull_zone.return_value = PullZoneResult(
id=200,
name="engine-repair-abc123",
hostname="engine-repair-abc123.b-cdn.net"
)
site_repo = Mock()
created_site = Mock()
created_site.id = 1
site_repo.create.return_value = created_site
result = create_bunnynet_site("engine-repair", bunny_client, site_repo, region="DE")
assert result == created_site
bunny_client.create_storage_zone.assert_called_once_with(
name="engine-repair-abc123",
region="DE"
)
bunny_client.create_pull_zone.assert_called_once_with(
name="engine-repair-abc123",
storage_zone_id=100
)
site_repo.create.assert_called_once()
def test_api_error_propagates(self):
bunny_client = Mock()
bunny_client.create_storage_zone.side_effect = BunnyNetAPIError("API Error")
site_repo = Mock()
with pytest.raises(BunnyNetAPIError):
create_bunnynet_site("test", bunny_client, site_repo)
class TestProvisionKeywordSites:
"""Tests for provision_keyword_sites function"""
@patch('src.generation.site_provisioning.create_bunnynet_site')
def test_provision_multiple_keywords(self, mock_create_site):
mock_sites = [Mock(id=i) for i in range(5)]
mock_create_site.side_effect = mock_sites
bunny_client = Mock()
site_repo = Mock()
keywords = [
{"keyword": "engine repair", "count": 3},
{"keyword": "car maintenance", "count": 2}
]
result = provision_keyword_sites(keywords, bunny_client, site_repo, region="DE")
assert len(result) == 5
assert mock_create_site.call_count == 5
calls = mock_create_site.call_args_list
# Check first call was for engine-repair
assert calls[0].kwargs['name_prefix'] == "engine-repair"
# Check 4th call (index 3) was for car-maintenance
assert calls[3].kwargs['name_prefix'] == "car-maintenance"
@patch('src.generation.site_provisioning.create_bunnynet_site')
def test_skip_empty_keywords(self, mock_create_site):
bunny_client = Mock()
site_repo = Mock()
keywords = [
{"keyword": "", "count": 3},
{"count": 2}
]
result = provision_keyword_sites(keywords, bunny_client, site_repo)
assert len(result) == 0
mock_create_site.assert_not_called()
class TestCreateGenericSites:
"""Tests for create_generic_sites function"""
@patch('src.generation.site_provisioning.create_bunnynet_site')
def test_create_multiple_generic_sites(self, mock_create_site):
mock_sites = [Mock(id=i) for i in range(3)]
mock_create_site.side_effect = mock_sites
bunny_client = Mock()
site_repo = Mock()
result = create_generic_sites(3, "shaft machining", bunny_client, site_repo, region="NY")
assert len(result) == 3
assert mock_create_site.call_count == 3
calls = mock_create_site.call_args_list
assert all(call.kwargs.get('name_prefix') == "shaft-machining" for call in calls)
assert all(call.kwargs.get('region') == "NY" for call in calls)