""" Integration tests for content injection Tests full flow with database """ import pytest from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from src.database.models import Base, User, Project, SiteDeployment, GeneratedContent, ArticleLink from src.database.repositories import ( ProjectRepository, GeneratedContentRepository, SiteDeploymentRepository, ArticleLinkRepository ) from src.interlinking.content_injection import inject_interlinks from src.generation.url_generator import generate_urls_for_batch from src.interlinking.tiered_links import find_tiered_links @pytest.fixture def db_session(): """Create an in-memory SQLite database for testing""" engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) session = Session() yield session session.close() @pytest.fixture def user(db_session): """Create a test user""" user = User( username="testuser", hashed_password="hashed_pwd", role="Admin" ) db_session.add(user) db_session.commit() db_session.refresh(user) return user @pytest.fixture def project(db_session, user): """Create a test project""" project = Project( user_id=user.id, name="Test Project", main_keyword="shaft machining", tier=1, money_site_url="https://moneysite.com", related_searches=["cnc machining", "precision machining"], entities=["lathe", "mill", "CNC"] ) db_session.add(project) db_session.commit() db_session.refresh(project) return project @pytest.fixture def site_deployment(db_session): """Create a test site deployment""" site = SiteDeployment( site_name="Test Site", custom_hostname="www.testsite.com", storage_zone_id=123, storage_zone_name="test-zone", storage_zone_password="test-pass", storage_zone_region="NY", pull_zone_id=456, pull_zone_bcdn_hostname="testsite.b-cdn.net" ) db_session.add(site) db_session.commit() db_session.refresh(site) return site @pytest.fixture def content_repo(db_session): return GeneratedContentRepository(db_session) @pytest.fixture def project_repo(db_session): return ProjectRepository(db_session) @pytest.fixture def site_repo(db_session): return SiteDeploymentRepository(db_session) @pytest.fixture def link_repo(db_session): return ArticleLinkRepository(db_session) class TestTier1ContentInjection: """Integration tests for Tier 1 content injection""" def test_tier1_batch_with_money_site_links( self, db_session, project, site_deployment, content_repo, project_repo, site_repo, link_repo ): """Test full flow: create T1 articles, inject money site links, See Also section""" # Create 3 tier1 articles articles = [] for i in range(3): content = content_repo.create( project_id=project.id, tier="tier1", keyword=f"keyword_{i}", title=f"Article {i} About Shaft Machining", outline={"sections": ["intro", "body"]}, content=f"

This is article {i} about shaft machining and Home page. Learn about shaft machining here.

", word_count=50, status="generated", site_deployment_id=site_deployment.id ) articles.append(content) # Generate URLs article_urls = generate_urls_for_batch(articles, site_repo) # Find tiered links job_config = None tiered_links = find_tiered_links(articles, job_config, project_repo, content_repo, site_repo) assert tiered_links['tier'] == 1 assert tiered_links['money_site_url'] == "https://moneysite.com" # Inject interlinks inject_interlinks(articles, article_urls, tiered_links, project, job_config, content_repo, link_repo) # Verify each article for i, article in enumerate(articles): db_session.refresh(article) # Should have money site link assert '' in article.content # Should have See Also section assert "

See Also

" in article.content assert "