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)
Esempio n. 3
0
 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(),
         ]
     )
Esempio n. 4
0
 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(),
     ])
Esempio n. 5
0
 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())
Esempio n. 7
0
    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
Esempio n. 8
0
    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)