Пример #1
0
def test_team_member_list_update_remove_all():
    """Tests removing all team members."""
    project = InvestmentProjectFactory()

    team_members = InvestmentProjectTeamMemberFactory.create_batch(
        2,
        investment_project=project,
    )

    child_serializer = IProjectTeamMemberSerializer()
    serializer = IProjectTeamMemberListSerializer(child=child_serializer)

    assert serializer.update(team_members, []) == []
    assert project.team_members.count() == 0
Пример #2
0
def test_team_member_list_update_mixed_changes():
    """Tests making mixed changes to team members."""
    project = InvestmentProjectFactory()

    team_members = InvestmentProjectTeamMemberFactory.create_batch(
        2,
        investment_project=project,
        role='old role',
    )
    adviser = AdviserFactory()

    new_team_member_data = [
        {
            'investment_project': project,
            'adviser': team_members[1].adviser,
            'role': 'new role',
        },
        {
            'investment_project': project,
            'adviser': adviser,
            'role': 'new team member',
        },
    ]

    child_serializer = IProjectTeamMemberSerializer()
    serializer = IProjectTeamMemberListSerializer(child=child_serializer)

    updated_team_members = serializer.update(team_members,
                                             new_team_member_data)

    assert len(updated_team_members) == 2
    assert updated_team_members[0].adviser == new_team_member_data[0][
        'adviser']
    assert updated_team_members[0].role == new_team_member_data[0]['role']
    assert updated_team_members[1].adviser == new_team_member_data[1][
        'adviser']
    assert updated_team_members[1].role == new_team_member_data[1]['role']

    assert project.team_members.count() == 2
Пример #3
0
    def test_export(self, setup_es, request_sortby, orm_ordering):
        """Test export of investment project search results."""
        url = reverse('api-v3:search:investment_project-export')

        InvestmentProjectFactory()
        InvestmentProjectFactory(cdms_project_code='cdms-code')
        VerifyWinInvestmentProjectFactory()
        won_project = WonInvestmentProjectFactory()
        InvestmentProjectTeamMemberFactory.create_batch(3, investment_project=won_project)

        setup_es.indices.refresh()

        data = {}
        if request_sortby:
            data['sortby'] = request_sortby

        with freeze_time('2018-01-01 11:12:13'):
            response = self.api_client.post(url, data=data)

        assert response.status_code == status.HTTP_200_OK
        assert parse_header(response.get('Content-Disposition')) == (
            'attachment', {'filename': 'Data Hub - Investment projects - 2018-01-01-11-12-13.csv'},
        )

        sorted_projects = InvestmentProject.objects.order_by(orm_ordering, 'pk')
        response_text = response.getvalue().decode('utf-8-sig')
        reader = DictReader(StringIO(response_text))

        assert reader.fieldnames == list(SearchInvestmentExportAPIView.field_titles.values())

        expected_row_data = [
            {
                'Date created': project.created_on,
                'Project reference': project.project_code,
                'Project name': project.name,
                'Investor company': project.investor_company.name,
                'Country of origin':
                    get_attr_or_none(project, 'investor_company.registered_address_country.name'),
                'Investment type': get_attr_or_none(project, 'investment_type.name'),
                'Status': project.get_status_display(),
                'Stage': get_attr_or_none(project, 'stage.name'),
                'Link':
                    f'{settings.DATAHUB_FRONTEND_URL_PREFIXES["investment-project"]}'
                    f'/{project.pk}',
                'Actual land date': project.actual_land_date,
                'Estimated land date': project.estimated_land_date,
                'FDI value': get_attr_or_none(project, 'fdi_value.name'),
                'Sector': get_attr_or_none(project, 'sector.name'),
                'Date of latest interaction': None,
                'Project manager': get_attr_or_none(project, 'project_manager.name'),
                'Client relationship manager':
                    get_attr_or_none(project, 'client_relationship_manager.name'),
                'Global account manager':
                    get_attr_or_none(project, 'investor_company.one_list_account_owner.name'),
                'Project assurance adviser':
                    get_attr_or_none(project, 'project_assurance_adviser.name'),
                'Other team members': _join_values(project.team_members.all(), 'adviser.name'),
                'Delivery partners': _join_values(project.delivery_partners.all()),
                'Possible UK regions': _join_values(project.uk_region_locations.all()),
                'Actual UK regions': _join_values(project.actual_uk_regions.all()),
                'Specific investment programme':
                    get_attr_or_none(project, 'specific_programme.name'),
                'Referral source activity':
                    get_attr_or_none(project, 'referral_source_activity.name'),
                'Referral source activity website':
                    get_attr_or_none(project, 'referral_source_activity_website.name'),
                'Total investment': project.total_investment,
                'New jobs': project.number_new_jobs,
                'Average salary of new jobs': get_attr_or_none(project, 'average_salary.name'),
                'Safeguarded jobs': project.number_safeguarded_jobs,
                'Level of involvement': get_attr_or_none(project, 'level_of_involvement.name'),
                'R&D budget': project.r_and_d_budget,
                'Associated non-FDI R&D project': project.non_fdi_r_and_d_budget,
                'New to world tech': project.new_tech_to_uk,
            }
            for project in sorted_projects
        ]

        expected_rows = format_csv_data(expected_row_data)
        actual_rows = [dict(item) for item in reader]

        # Support for ordering will be added to StringAgg in Django 2.2. In the meantime,
        # StringAgg fields are unordered and we use this workaround to compare them.
        unordered_fields = (
            'Other team members',
            'Delivery partners',
            'Possible UK regions',
            'Actual UK regions',
        )

        for row in chain(actual_rows, expected_rows):
            for field in unordered_fields:
                row[field] = frozenset(row[field].split(', '))

        assert actual_rows == expected_rows