import pytest
from pytest import list_of
from pytest_quickcheck.generator import Generator

ModelA(models.Model):
    name = models.CharField(max_length=255)
    b = models.OneToOneField('ModelB')

ModelB(models.Model):
    name = models.CharField(max_length=255)
    desc  =models.CharField(max_length=255)


class modelA(Generator):
    def generate(self, **kwargs):
        return modelA(
            name=self.generate_data(str, **kwargs),
            b=modelB().generate(**kwargs)
        )
        
class modelB(Generator):
    def generate(self, **kwargs):
        return modelB(
            name=self.generate_data(str, **kwargs),
            desc=self.generate_data(str, **kwargs)
        )
        
pytestmark = pytest.mark.django_db

class TestGenerators:
    @pytest.fixture
    def target(self):
        # .get_members is a wrapper returning ModelA.objects.all()
        return repository.Repository.get_members
    
    @pytest.fixture
    def save_models(self, models):
        for m in models:
            b = m.b
            b.save()
            a.b = b
            a.save()

    @pytest.mark.randomize(models=list_of(modelA(), max_items=20))
    def test_jawn(self, models, target, save_models):
        res = target()
        assert list(res) == models
