def test_follow_m2m(self): related = AutoFixture(SimpleModel).create()[0] self.assertEqual(SimpleModel.objects.count(), 1) filler = AutoFixture(M2MModel, follow_m2m=(2, 10)) for obj in filler.create(10): self.assertEqual(list(obj.m2m.all()), [related])
def test_generate_fk_to_self_follow(self): filler = AutoFixture(SelfReferencingModel, follow_fk=True) first = filler.create_one() self.assertEqual(SelfReferencingModel.objects.count(), 1) filler = AutoFixture(SelfReferencingModel, follow_fk=True) second = filler.create_one() self.assertEqual(SelfReferencingModel.objects.count(), 2) self.assertEqual(second.parent_self, first)
def test_follow_m2m(self): AutoFixture(SimpleModel).create(10) AutoFixture(OtherSimpleModel).create(10) self.call('autofixture_tests.M2MModel:25', follow_m2m='m2m:3:3,secondm2m:0:10') for obj in M2MModel.objects.all(): self.assertEqual(obj.m2m.count(), 3) self.assertTrue(0 <= obj.secondm2m.count() <= 10)
def test_follow_m2m(self): AutoFixture(SimpleModel).create(10) AutoFixture(OtherSimpleModel).create(10) models = ('autofixture_test.M2MModel:25', ) self.options['follow_m2m'] = 'm2m:3:3,secondm2m:0:10' self.command.handle(*models, **self.options) for obj in M2MModel.objects.all(): self.assertEqual(obj.m2m.count(), 3) self.assertTrue(0 <= obj.secondm2m.count() <= 10)
def test_follow_only_some_foreignkeys(self): related = AutoFixture(BasicModel).create()[0] self.assertEqual(BasicModel.objects.count(), 1) simple = SimpleModel.objects.create(name='foo') simple2 = SimpleModel.objects.create(name='bar') filler = AutoFixture(RelatedModel, follow_fk=('related', )) for obj in filler.create(100): self.assertEqual(obj.related, related) self.assertEqual(obj.limitedfk, None)
def test_follow_only_some_m2m(self): related = AutoFixture(SimpleModel).create()[0] self.assertEqual(SimpleModel.objects.count(), 1) other_related = AutoFixture(OtherSimpleModel).create()[0] self.assertEqual(OtherSimpleModel.objects.count(), 1) filler = AutoFixture(M2MModel, none_p=0, follow_m2m={ 'm2m': (2, 10), }) for obj in filler.create(10): self.assertEqual(list(obj.m2m.all()), [related]) self.assertEqual(list(obj.secondm2m.all()), [])
def initialize_data_and_basic_test(self, csv_data): file = NamedTemporaryFile('w', dir=settings.MEDIA_ROOT, delete=False) self.files.append(file.name) for x in csv_data.split('\n'): file.write('{}\n'.format(x)) file.close() # create a book csvfile = AutoFixture( File, field_values={ 'file': file.name } ).create_one() book = AutoFixture( Book, field_values={ 'file': csvfile, 'project': self.project, } ).create_one() csv.extract(book) assert Field.objects.count() == 5 fieldnames = {} for field in Field.objects.all(): fieldnames[field.title] = True assert field.type == Field.STRING, "Initial type is string" assert 'id' in fieldnames, 'id should be a fieldname' assert 'age' in fieldnames, 'age should be a fieldname' assert 'name' in fieldnames, 'name should be a field name' assert 'date' in fieldnames, 'date should be a field name' assert 'place' in fieldnames, 'place should be a field name' # check structure of data in sheet for sheet in book.sheet_set.all(): fields = sheet.field_set.all() size = len(fields[0].data) assert all([len(x.data) == size for x in fields]), \ "All columns should have same size" for field in fields: v = field.data assert isinstance(v, list) for x in v: assert 'value' in x assert 'empty' in x assert isinstance(x['empty'], bool) assert 'invalid' in x assert isinstance(x['invalid'], bool) return book
def test_constraints(self): filler = AutoFixture(BasicModel, overwrite_defaults=False) for obj in filler.create(100): self.assertTrue(len(obj.chars) > 0) self.assertEqual(type(obj.chars), str_) self.assertTrue(len(obj.shortchars) <= 2) self.assertEqual(type(obj.shortchars), str_) self.assertTrue(type(obj.blankchars), str_) self.assertEqualOr(type(obj.nullchars), str_, None) self.assertEqual(type(obj.slugfield), str_) self.assertEqual(type(obj.defaultint), int) self.assertEqual(obj.defaultint, 1) self.assertEqual(type(obj.intfield), int) self.assertEqual(type(obj.sintfield), int) self.assertEqual(type(obj.pintfield), int) self.assertEqual(type(obj.psintfield), int) self.assertEqual(type(obj.datefield), date) self.assertEqual(type(obj.datetimefield), datetime) self.assertEqual(type(obj.defaultdatetime), datetime) self.assertEqual(obj.defaultdatetime, y2k()) self.assertEqual(type(obj.decimalfield), Decimal) self.assertTrue('@' in obj.emailfield) self.assertTrue('.' in obj.emailfield) self.assertTrue(' ' not in obj.emailfield) self.assertTrue(obj.ipaddressfield.count('.'), 3) self.assertTrue(len(obj.ipaddressfield) >= 7) self.assertEqual(BasicModel.objects.count(), 100)
def test_generate_only_some_foreignkeys(self): filler = AutoFixture( RelatedModel, generate_fk=('related',)) for obj in filler.create(100): self.assertEqual(obj.related.__class__, BasicModel) self.assertEqual(obj.limitedfk, None)
def test_generate_foreignkeys(self): filler = AutoFixture( RelatedModel, generate_fk=True) for obj in filler.create(100): self.assertEqual(obj.related.__class__, BasicModel) self.assertEqual(obj.limitedfk.name, 'foo')
def create(model, count, *args, **kwargs): ''' Create *count* instances of *model* using the either an appropiate autofixture that was :ref:`registry <registered>` or fall back to the default:class:`AutoFixture` class. *model* can be a model class or its string representation (e.g. ``"app.ModelClass"``). All positional and keyword arguments are passed to the autofixture constructor. It is demonstrated in the example below which will create ten superusers:: import autofixture admins = autofixture.create('auth.User', 10, field_values={'is_superuser': True}) .. note:: See :ref:`AutoFixture` for more information. :func:`create` will return a list of the created objects. ''' from django.db import models if isinstance(model, string_types): model = models.get_model(*model.split('.', 1)) if model in REGISTRY: autofixture = REGISTRY[model](model, *args, **kwargs) else: autofixture = AutoFixture(model, *args, **kwargs) return autofixture.create(count)
def test_generate_m2m_with_intermediary_model(self): filler = AutoFixture(M2MModelThrough, generate_m2m=(1, 5)) all_m2m = set() for obj in filler.create(10): self.assertTrue(1 <= obj.m2m.count() <= 5) all_m2m.update(obj.m2m.all()) self.assertEqual(SimpleModel.objects.count(), len(all_m2m))
def test_instance_selector(self): AutoFixture(SimpleModel).create(10) result = generators.InstanceSelector(SimpleModel).generate() self.assertEqual(result.__class__, SimpleModel) for i in range(10): result = generators.InstanceSelector(SimpleModel, max_count=10).generate() self.assertTrue(0 <= len(result) <= 10) for obj in result: self.assertEqual(obj.__class__, SimpleModel) for i in range(10): result = generators.InstanceSelector(SimpleModel, min_count=5, max_count=10).generate() self.assertTrue(5 <= len(result) <= 10) for obj in result: self.assertEqual(obj.__class__, SimpleModel) for i in range(10): result = generators.InstanceSelector(SimpleModel, min_count=20, max_count=100).generate() # cannot return more instances than available self.assertEqual(len(result), 10) for obj in result: self.assertEqual(obj.__class__, SimpleModel) # works also with queryset as argument result = generators.InstanceSelector( SimpleModel.objects.all()).generate() self.assertEqual(result.__class__, SimpleModel)
def test_no_follow_m2m(self): AutoFixture(SimpleModel).create(1) models = ('autofixture_test.NullableFKModel:1', ) self.options['no_follow_m2m'] = True self.command.handle(*models, **self.options) obj = NullableFKModel.objects.get() self.assertEqual(obj.m2m.count(), 0)
def test_deep_generate_foreignkeys(self): filler = AutoFixture( DeepLinkModel2, generate_fk=True) for obj in filler.create(10): self.assertEqual(obj.related.__class__, DeepLinkModel1) self.assertEqual(obj.related.related.__class__, SimpleModel) self.assertEqual(obj.related.related2.__class__, SimpleModel)
def test_field_values_overwrite_defaults(self): fixture = AutoFixture( BasicModel, field_values={ 'defaultint': 42, }) obj = fixture.create(1)[0] self.assertEqual(obj.defaultint, 42)
def test_deep_generate_foreignkeys2(self): filler = AutoFixture(DeepLinkModel2, follow_fk=False, generate_fk=('related', 'related__related')) for obj in filler.create(10): self.assertEqual(obj.related.__class__, DeepLinkModel1) self.assertEqual(obj.related.related.__class__, SimpleModel) self.assertEqual(obj.related.related2, None)
def test_unique_together(self): filler = AutoFixture(UniqueTogetherTestModel) count1 = len( filler.model._meta.get_field_by_name('choice1')[0].choices) count2 = len( filler.model._meta.get_field_by_name('choice2')[0].choices) for obj in filler.create(count1 * count2): pass
def test_generate_fk_to_self(self): ''' When a model with a reference to itself is encountered, If NULL is allowed don't generate a new instance of itself as a foreign key, so as not to reach pythons recursion limit ''' filler = AutoFixture(SelfReferencingModel, generate_fk=True) model = filler.create_one() self.assertEqual(model.parent_self, None) self.assertEqual(SelfReferencingModel.objects.count(), 1)
def test_follow_fk_for_o2o_primary_key(self): # OneToOneField on primary key should follow if it is not table inheritance filler = AutoFixture(O2OPrimaryKeyModel, follow_fk=True) simple = SimpleModel.objects.create() obj = filler.create()[0] self.assertEqual(obj.o2o, simple) self.assertRaises(CreateInstanceError, filler.create)
def test_generate_fk_for_o2o(self): # OneToOneField is the same as a ForeignKey with unique=True filler = AutoFixture(O2OModel, generate_fk=True) all_o2o = set() for obj in filler.create(10): all_o2o.add(obj.o2o) self.assertEqual(set(SimpleModel.objects.all()), all_o2o)
def test_generate_fk_for_o2o_primary_key(self): # OneToOneField on primary key should follow if it is not table inheritance filler = AutoFixture(O2OPrimaryKeyModel, generate_fk=True) all_o2o = set() for obj in filler.create(10): all_o2o.add(obj.o2o) self.assertEqual(set(SimpleModel.objects.all()), all_o2o)
def test_unique_constraint_null(self): fixture = AutoFixture( UniqueNullFieldModel, field_values={'name': generators.NoneGenerator()}) self.assertIn(constraints.unique_constraint, fixture.constraints) fixture.create_one() # Creating another entry with a null value should not raise an # exception as a unique column can contain multiple null values fixture.create_one()
def test_follow_fk_for_o2o(self): # OneToOneField is the same as a ForeignKey with unique=True filler = AutoFixture(O2OModel, follow_fk=True) simple = SimpleModel.objects.create() obj = filler.create()[0] self.assertEqual(obj.o2o, simple) self.assertRaises(CreateInstanceError, filler.create)
def test_process_gr(self): """Tests the bug when GenericRelation field being processed by autofixture.base.AutoFixtureBase#process_m2m and through table appears as None. """ count = 10 fixture = AutoFixture(GRModel) self.assertNotRaises(AttributeError, fixture.create, msg="'NoneType' object has no attribute '_meta'", args=[count]) self.assertEqual(GRModel.objects.count(), count)
def test_unique_together_constraint_nulls(self): fixture = AutoFixture(UniqueTogetherNullFieldModel, field_values={ 'field_one': generators.NoneGenerator(), 'field_two': generators.NoneGenerator() }) self.assertIn(constraints.unique_together_constraint, fixture.constraints) fixture.create_one() fixture.create_one()
def test_registered_fixture_is_used_for_fk(self): class BasicModelFixture(AutoFixture): field_values = {'chars': 'Hello World!'} autofixture.register(BasicModel, BasicModelFixture) fixture = AutoFixture(RelatedModel, generate_fk=['related']) obj = fixture.create_one() self.assertTrue(obj) self.assertEqual(obj.related.chars, 'Hello World!')
def test_unique_constraint_null(self): fixture = AutoFixture( UniqueNullFieldModel, field_values={ 'name': generators.NoneGenerator() } ) self.assertIn(constraints.unique_constraint, fixture.constraints) fixture.create_one() with self.assertRaises(CreateInstanceError): fixture.create_one()
def test_generate_m2m(self): filler = AutoFixture(M2MModel, none_p=0, generate_m2m=(1, 5)) all_m2m = set() all_secondm2m = set() for obj in filler.create(10): self.assertTrue(1 <= obj.m2m.count() <= 5) self.assertTrue(1 <= obj.secondm2m.count() <= 5) all_m2m.update(obj.m2m.all()) all_secondm2m.update(obj.secondm2m.all()) self.assertEqual(SimpleModel.objects.count(), len(all_m2m)) self.assertEqual(OtherSimpleModel.objects.count(), len(all_secondm2m))
def test_generate_m2m_with_custom_autofixture(self): filler = AutoFixture(RelationWithCustomAutofixtureModel, generate_fk=True, generate_m2m=(1, 1)) instance = filler.create_one() self.assertEqual(instance.users.count(), 1) user = instance.users.get() # Detect that the UserFixture was used. self.assertTrue(' ' not in user.username) self.assertTrue(' ' not in user.first_name) self.assertTrue(' ' not in user.last_name)