import asyncio
from datetime import datetime

from app.models.document import RepoDocument
from app.repositories import document_repo


class _FakeRepoDocuments:
    def __init__(self):
        self.query = None
        self.update = None
        self.upsert = None
        self.return_document = None

    async def find_one_and_update(self, query, update, upsert, return_document):
        self.query = query
        self.update = update
        self.upsert = upsert
        self.return_document = return_document
        return {"_id": "doc_1"}


class _FakeDB:
    def __init__(self):
        self.repo_documents = _FakeRepoDocuments()


def test_upsert_document_sets_created_at_only_on_insert(monkeypatch):
    fake_db = _FakeDB()
    monkeypatch.setattr(document_repo, "get_db", lambda: fake_db)

    document = RepoDocument(
        repo_id="ad/repo",
        doc_path="docs/api.md",
        doc_type="docs",
        raw_content="# API",
        created_at=datetime(2020, 1, 1),
    )

    result = asyncio.run(document_repo.upsert_document(document))

    assert result == "doc_1"

    update = fake_db.repo_documents.update
    assert "$set" in update
    assert "$setOnInsert" in update
    assert "created_at" not in update["$set"]
    assert "created_at" in update["$setOnInsert"]
