def test_sort_relationship_descending(self):
        """Test sorting a relationhip's field in descending order."""
        a = CompanyModel.mock(name="Last")
        b = CompanyModel.mock(name="First")
        PersonModel.mock(name="A", companies=[a])
        PersonModel.mock(name="B", companies=[b])

        parameters = {'sort': '-companies.name'}
        query = Resource(self.model, parameters).sort_query(self.query)

        result = query.all()
        self.assertEqual(result[0].companies[0].name, 'Last')
    def test_include_many_to_many_relationship(self):
        """Test including a many to many relationship field."""
        company_1 = CompanyModel.mock()
        company_2 = CompanyModel.mock()
        model = PersonModel.mock(companies=[company_1, company_2])

        include = ['companies']
        iv_objects, errors = IncludeValue.generate(self.view, include)
        data = IncludeValue.include(iv_objects, model)

        self.assertTrue(errors == [])
        self.assertTrue(len(data) == 2)
    def test_include_many_to_many(self):
        """Test including a many-to-many relationship."""
        company = CompanyModel.mock()
        model = PersonModel.mock(companies=[company])

        parameters = {'include': 'companies'}
        included = Resource(self.model, parameters).compound_response(model)
        self.assertTrue(len(included) == 1)
    def test_include_nested(self):
        """Test including a nested relationship."""
        company = CompanyModel.mock()
        model = PersonModel.mock(companies=[company])
        EmployeeModel.mock(person_id=model.id)

        parameters = {'include': 'employee.person.companies'}
        included = Resource(self.model, parameters).compound_response(model)
        self.assertTrue(len(included) == 1)
    def test_filter_many_to_many_relationship(self):
        """Test filtering by a many-to-many relationship field."""
        company = CompanyModel.mock(name="company")
        PersonModel.mock(companies=[company])

        parameters = {'filter[companies.name]': 'COMPANY'}
        query = Resource(self.model, parameters).filter_query(self.query)

        result = query.all()
        self.assertEqual(len(result), 1)
    def test_include_multiple_relationships(self):
        """Test including multiple relationship fields of differing
        types.
        """
        company = CompanyModel.mock()
        model = PersonModel.mock(companies=[company])
        EmployeeModel.mock(person_id=1)

        include = ['companies', 'employee']
        iv_objects, errors = IncludeValue.generate(self.view, include)
        data = IncludeValue.include(iv_objects, model)

        self.assertTrue(errors == [])
        self.assertTrue(len(data) == 2)