def test_manual_mapping(self): reference_mapping = { "testapp_grandchildindexable": { "_id": {"path": "childindexable_ptr_id"}, "dynamic": "strict", "properties": { "id": {"type": "integer"}, "polymorphic_ctype_id": {"type": "integer"}, "parentindexable_ptr_id": {"type": "integer"}, "childindexable_ptr_id": {"type": "integer"}, "foo": {"type": "string"}, "bar": {"type": "integer", "store": "yes"}, "baz": {"type": "date"}, "related": { "type": "object", "properties": { "qux": { "type": "string" } } }, } } } self.assertEqual(reference_mapping, GrandchildIndexable.get_mapping())
def test_prevent_type_change(self): """Make sure a malicious user can't change content type.""" indexable = GrandchildIndexable(foo="AirWolf", bar=10, baz=date(1980, 1, 1)) indexable.save() serializer_class = indexable.get_serializer_class() serializer = serializer_class(indexable) data = serializer.data # change the polymorphic content type to something different separate_ctype = ContentType.objects.get_for_model(SeparateIndexable, for_concrete_model=False) data['polymorphic_ctype'] = separate_ctype.id serializer = serializer_class(data=data) self.assertTrue(serializer.is_valid()) serializer.save() self.assertIsInstance(serializer.object, GrandchildIndexable) # and check the ctype anyways: grandchild_ctype = ContentType.objects.get_for_model(GrandchildIndexable, for_concrete_model=False) self.assertEqual(indexable.polymorphic_ctype_id, grandchild_ctype.id)
def test_mapping_type_names(self): self.assertEqual(ParentIndexable.get_mapping_type_name(), "testapp_parentindexable") self.assertEqual(ChildIndexable.get_mapping_type_name(), "testapp_childindexable") self.assertEqual(GrandchildIndexable.get_mapping_type_name(), "testapp_grandchildindexable") self.assertEqual(SeparateIndexable.get_mapping_type_name(), "testapp_separateindexable") self.assertEqual( ParentIndexable.get_mapping_type_names(), [ ParentIndexable.get_mapping_type_name(), ChildIndexable.get_mapping_type_name(), GrandchildIndexable.get_mapping_type_name(), ] ) self.assertEqual( SeparateIndexable.get_mapping_type_names(), [ SeparateIndexable.get_mapping_type_name(), ] )
def test_mapping_type_names(self): self.assertEqual(ParentIndexable.get_mapping_type_name(), "testapp_parentindexable") self.assertEqual(ChildIndexable.get_mapping_type_name(), "testapp_childindexable") self.assertEqual(GrandchildIndexable.get_mapping_type_name(), "testapp_grandchildindexable") self.assertEqual(SeparateIndexable.get_mapping_type_name(), "testapp_separateindexable") self.assertEqual(ParentIndexable.get_mapping_type_names(), [ ParentIndexable.get_mapping_type_name(), ChildIndexable.get_mapping_type_name(), GrandchildIndexable.get_mapping_type_name(), ]) self.assertEqual(SeparateIndexable.get_mapping_type_names(), [ SeparateIndexable.get_mapping_type_name(), MixedIndexable.get_mapping_type_name(), ])
def test_prevent_type_change(self): """Make sure a malicious user can't change content type.""" indexable = GrandchildIndexable(foo="AirWolf", bar=10, baz=date(1980, 1, 1)) indexable.save() serializer_class = indexable.get_serializer_class() serializer = serializer_class(indexable) data = serializer.data # change the polymorphic content type to something different separate_ctype = ContentType.objects.get_for_model( SeparateIndexable, for_concrete_model=False) data['polymorphic_ctype'] = separate_ctype.id serializer = serializer_class(data=data) self.assertTrue(serializer.is_valid()) serializer.save() self.assertIsInstance(serializer.object, GrandchildIndexable) # and check the ctype anyways: grandchild_ctype = ContentType.objects.get_for_model( GrandchildIndexable, for_concrete_model=False) self.assertEqual(indexable.polymorphic_ctype_id, grandchild_ctype.id)
def test_extract_document(self): related = RelatedModel.objects.create(qux="qux") test_obj = GrandchildIndexable( foo="Testing", bar=7, baz=datetime.datetime(year=2014, month=4, day=23, hour=9).replace(tzinfo=timezone.utc), related=related ) test_obj.save(index=False) reference_document = { "id": test_obj.pk, "parentindexable_ptr_id": test_obj.pk, "childindexable_ptr_id": test_obj.pk, "polymorphic_ctype_id": test_obj.polymorphic_ctype_id, "foo": "Testing", "bar": 7, "baz": "2014-04-23T09:00:00+00:00", "related_id": related.id } self.assertEqual(reference_document, test_obj.extract_document())
def test_index_upgrade(self): ParentIndexable(foo="Fighters").save() ChildIndexable(foo="Fighters", bar=69).save() GrandchildIndexable(foo="Fighters", bar=69, baz=datetime.datetime.now() - datetime.timedelta(hours=1)).save() SeparateIndexable(junk="Testing").save() # make sure we have some indexed stuff ParentIndexable.search_objects.refresh() SeparateIndexable.search_objects.refresh() self.assertEqual(ParentIndexable.search_objects.s().count(), 3) self.assertEqual(SeparateIndexable.search_objects.s().count(), 1) call_command("synces", "vtest123", drop_existing_indexes=True) call_command("bulk_index", index_suffix="vtest123") call_command("es_swap_aliases", "vtest123") ParentIndexable.search_objects.refresh() SeparateIndexable.search_objects.refresh() # Let's make sure that everything has the right counts self.assertEqual(ParentIndexable.search_objects.s().count(), 3) self.assertEqual(SeparateIndexable.search_objects.s().count(), 1) self.delete_indexes_with_suffix("vtest123") # clean up
def test_bulk_index(self): ParentIndexable(foo="Fighters").save(index=False) ChildIndexable(foo="Fighters", bar=69).save(index=False) GrandchildIndexable(foo="Fighters", bar=69, baz=datetime.datetime.now() - datetime.timedelta(hours=1)).save(index=False) SeparateIndexable(junk="Testing").save(index=False) # Let's make sure that nothing is indexed yet. self.assertEqual(ParentIndexable.search_objects.s().count(), 0) self.assertEqual(SeparateIndexable.search_objects.s().count(), 0) # Now that everything has been made, let's try a bulk_index. call_command("bulk_index") ParentIndexable.search_objects.refresh() SeparateIndexable.search_objects.refresh() # Let's make sure that everything has the right counts self.assertEqual(ParentIndexable.search_objects.s().count(), 3) self.assertEqual(SeparateIndexable.search_objects.s().count(), 1) # Let's add another one, make sure the counts are right. ParentIndexable(foo="Mr. T").save(index=False) self.assertEqual(ParentIndexable.search_objects.s().count(), 3) call_command("bulk_index") ParentIndexable.search_objects.refresh() self.assertEqual(ParentIndexable.search_objects.s().count(), 4) # Let's f**k up some data in ES. obj = ParentIndexable.objects.all()[0] es = get_es(urls=settings.ES_URLS) doc = obj.extract_document() doc["foo"] = "DATA LOVERS" es.update(index=obj.get_index_name(), doc_type=obj.get_mapping_type_name(), id=obj.id, body=dict(doc=doc, doc_as_upsert=True), refresh=True) # Make sure the bad data works self.assertEqual( ParentIndexable.search_objects.query( foo__match="DATA LOVERS").count(), 1) call_command("bulk_index") ParentIndexable.search_objects.refresh() self.assertEqual( ParentIndexable.search_objects.query( foo__match="DATA LOVERS").count(), 0) # Let's delete an item from the db. obj = ParentIndexable.objects.all()[0] obj.delete() # Make sure the count is the same self.assertEqual(ParentIndexable.search_objects.s().count(), 4) # This shoulnd't remove the item call_command("bulk_index") ParentIndexable.search_objects.refresh() self.assertEqual(ParentIndexable.search_objects.s().count(), 4) # This should call_command("synces", self.index_suffix, drop_existing_indexes=True) call_command("es_swap_aliases", self.index_suffix) call_command("bulk_index") ParentIndexable.search_objects.refresh() self.assertEqual(ParentIndexable.search_objects.s().count(), 3)