mirror of
				https://github.com/peeringdb/peeringdb.git
				synced 2024-05-11 05:55:09 +00:00 
			
		
		
		
	
		
			
	
	
		
			99 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			99 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								Unit-tests for quick search functionality - note that advanced search is not
							 | 
						||
| 
								 | 
							
								tested here as that is using the PDB API entirely.
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import pytest
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from django.test import TestCase
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import peeringdb_server.search as search
							 | 
						||
| 
								 | 
							
								import peeringdb_server.models as models
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class SearchTests(TestCase):
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Test quick-search functionality
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @classmethod
							 | 
						||
| 
								 | 
							
								    def setUpTestData(cls):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # in case other tests updated the search index through object
							 | 
						||
| 
								 | 
							
								        # creation we need to flush it
							 | 
						||
| 
								 | 
							
								        search.SEARCH_CACHE["search_index"] = {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        cls.instances = {}
							 | 
						||
| 
								 | 
							
								        # create an instance of each searchable model, so we have something
							 | 
						||
| 
								 | 
							
								        # to search for
							 | 
						||
| 
								 | 
							
								        cls.org = models.Organization.objects.create(name="Test org")
							 | 
						||
| 
								 | 
							
								        for model in search.searchable_models:
							 | 
						||
| 
								 | 
							
								            if model.handleref.tag == "net":
							 | 
						||
| 
								 | 
							
								                kwargs = {"asn": 1}
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                kwargs = {}
							 | 
						||
| 
								 | 
							
								            cls.instances[model.handleref.tag] = model.objects.create(
							 | 
						||
| 
								 | 
							
								                status="ok", org=cls.org, name="Test %s" % model.handleref.tag,
							 | 
						||
| 
								 | 
							
								                **kwargs)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_search(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        search for entities containing 'Test' - this should return all
							 | 
						||
| 
								 | 
							
								        instances we created during setUp
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        rv = search.search("Test")
							 | 
						||
| 
								 | 
							
								        for k, inst in self.instances.items():
							 | 
						||
| 
								 | 
							
								            assert k in rv
							 | 
						||
| 
								 | 
							
								            assert len(rv[k]) == 1
							 | 
						||
| 
								 | 
							
								            assert rv[k][0]["name"] == inst.search_result_name
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        rv = search.search("as1")
							 | 
						||
| 
								 | 
							
								        assert len(rv["net"]) == 1
							 | 
						||
| 
								 | 
							
								        assert rv["net"][0]["name"] == self.instances["net"].search_result_name
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        rv = search.search("asn1")
							 | 
						||
| 
								 | 
							
								        assert len(rv["net"]) == 1
							 | 
						||
| 
								 | 
							
								        assert rv["net"][0]["name"] == self.instances["net"].search_result_name
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_search_case(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        search for entities containing 'test' - this should return all
							 | 
						||
| 
								 | 
							
								        instances we created during setUp since matching is case-insensitive
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        rv = search.search("test")
							 | 
						||
| 
								 | 
							
								        for k, inst in self.instances.items():
							 | 
						||
| 
								 | 
							
								            assert k in rv
							 | 
						||
| 
								 | 
							
								            assert len(rv[k]) == 1
							 | 
						||
| 
								 | 
							
								            assert rv[k][0]["name"] == inst.search_result_name
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def test_index_updates(self):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        test that indexes get updated correctly when objects are created
							 | 
						||
| 
								 | 
							
								        or deleted or updated from pending to ok
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # this object will be status pending and should not be returned in the search
							 | 
						||
| 
								 | 
							
								        # results
							 | 
						||
| 
								 | 
							
								        new_ix_p = models.InternetExchange.objects.create(
							 | 
						||
| 
								 | 
							
								            status="pending", org=self.org, name="Test IU ix")
							 | 
						||
| 
								 | 
							
								        self.test_search()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # this object will be status ok, and should show up in the index
							 | 
						||
| 
								 | 
							
								        new_ix_o = models.InternetExchange.objects.create(
							 | 
						||
| 
								 | 
							
								            status="ok", org=self.org, name="Test IU P ix")
							 | 
						||
| 
								 | 
							
								        rv = search.search("test")
							 | 
						||
| 
								 | 
							
								        assert len(rv["ix"]) == 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # now we switch the first object to ok as well and it as well should show up in the
							 | 
						||
| 
								 | 
							
								        # index
							 | 
						||
| 
								 | 
							
								        new_ix_p.status = "ok"
							 | 
						||
| 
								 | 
							
								        new_ix_p.save()
							 | 
						||
| 
								 | 
							
								        rv = search.search("test")
							 | 
						||
| 
								 | 
							
								        assert len(rv["ix"]) == 3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #finally we delete both and they should disappear again
							 | 
						||
| 
								 | 
							
								        new_ix_p.delete()
							 | 
						||
| 
								 | 
							
								        new_ix_o.delete()
							 | 
						||
| 
								 | 
							
								        self.test_search()
							 |