import random
import string

import pytest

from benchmarks.conftest import Author, Book, Publisher

pytestmark = pytest.mark.asyncio


@pytest.mark.parametrize("num_models", [10, 20, 40])
async def test_saving_models_individually(aio_benchmark, num_models: int):
    @aio_benchmark
    async def make_and_insert(num_models: int):
        authors = [
            Author(
                name="".join(random.sample(string.ascii_letters, 5)),
                score=int(random.random() * 100),
            )
            for i in range(0, num_models)
        ]
        assert len(authors) == num_models

        ids = []
        for author in authors:
            a = await author.save()
            ids.append(a)
        return ids

    ids = make_and_insert(num_models)
    for id in ids:
        assert id is not None


@pytest.mark.parametrize("num_models", [10, 20, 40])
async def test_saving_models_individually_with_related_models(
    aio_benchmark, num_models: int, author: Author, publisher: Publisher
):
    @aio_benchmark
    async def making_and_inserting_related_models_one_by_one(
        author: Author, publisher: Publisher, num_models: int
    ):
        books = [
            Book(
                author=author,
                publisher=publisher,
                title="".join(random.sample(string.ascii_letters, 5)),
                year=random.randint(0, 2000),
            )
            for i in range(0, num_models)
        ]

        ids = []
        for book in books:
            await book.save()
            ids.append(book.id)

        return ids

    ids = making_and_inserting_related_models_one_by_one(
        author=author, publisher=publisher, num_models=num_models
    )

    for id in ids:
        assert id is not None
