Exemple #1
0
 def test_try_assign_hostname_category_without_code(self):
     bo_asset_2 = BackOfficeAssetFactory(model=self.model_without_code,
                                         hostname='abcd')
     bo_asset_2._try_assign_hostname(commit=True)
     self.assertEqual(bo_asset_2.hostname, 'abcd')
Exemple #2
0
class TestBackOfficeAssetTransitions(TransitionTestCase, RalphTestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.user_pl = UserFactory(country=Country.pl)
        cls.region_pl = RegionFactory(name='PL', country=Country.pl)
        cls.region_us = RegionFactory(name='US', country=Country.us)
        cls.region_us_2 = RegionFactory(name='US', country=Country.us)
        cls.category = CategoryFactory(code='PC')
        cls.model = BackOfficeAssetModelFactory(category=cls.category)

    def setUp(self):
        super().setUp()
        AssetLastHostname.objects.create(prefix='POLPC', counter=1000)
        self.bo_asset = BackOfficeAssetFactory(
            model=self.model,
            hostname='abc',
            region=self.region_us,
        )
        self.bo_asset._try_assign_hostname(commit=True, force=True)
        self.request = RequestFactory().get('/assets/')
        self.request.user = self.user_pl
        # ugly hack from https://code.djangoproject.com/ticket/17971
        setattr(self.request, 'session', 'session')
        messages = FallbackStorage(self.request)
        setattr(self.request, '_messages', messages)

    def test_convert_to_data_center_asset(self):
        bo_asset = BackOfficeAssetFactory()
        transition = Transition.objects.create(
            name='transition',
            model=TransitionModel.get_for_field(bo_asset, 'status'),
            source=0,
            target=0,
        )
        bo_asset_pk = bo_asset.pk
        hostname = bo_asset.hostname
        rack = RackFactory()
        BackOfficeAsset.convert_to_data_center_asset(
            instances=[bo_asset],
            rack=rack.id,
            service_env=ServiceEnvironmentFactory().id,
            position=1,
            model=DataCenterAssetModelFactory().id,
            request=None,
            transition_id=transition.pk,
        )
        dc_asset = DataCenterAsset.objects.get(pk=bo_asset_pk)
        self.assertEqual(dc_asset.rack.id, rack.id)
        self.assertFalse(
            BackOfficeAsset.objects.filter(pk=bo_asset_pk).exists())
        self.assertEqual(dc_asset.hostname, hostname)

    def test_convert_to_data_center_asset_preserves_status_name(self):
        bo_asset = BackOfficeAssetFactory(
            status=BackOfficeAssetStatus.from_name('damaged'))
        transition = Transition.objects.create(
            name='transition',
            model=TransitionModel.get_for_field(bo_asset, 'status'),
            source=0,
            target=0,
        )
        bo_asset_pk = bo_asset.pk
        bo_asset_status_name = BackOfficeAssetStatus.from_id(
            bo_asset.status).name
        rack = RackFactory()
        BackOfficeAsset.convert_to_data_center_asset(
            instances=[bo_asset],
            rack=rack.id,
            service_env=ServiceEnvironmentFactory().id,
            position=1,
            model=DataCenterAssetModelFactory().id,
            request=None,
            transition_id=transition.pk,
        )
        dc_asset = DataCenterAsset.objects.get(pk=bo_asset_pk)
        dc_asset_status_name = DataCenterAssetStatus.from_id(
            dc_asset.status).name
        self.assertEqual(bo_asset_status_name, dc_asset_status_name)

    def test_convert_to_data_center_asset_uses_default_from_transition(self):
        target_status_id = DataCenterAssetStatus.from_name(
            "new"  # status name common for dc_asset and bo_asset
        ).id
        bo_asset = BackOfficeAssetFactory(
            status=BackOfficeAssetStatus.from_name('damaged'))
        transition = Transition.objects.create(
            name='transition',
            model=TransitionModel.get_for_field(bo_asset, 'status'),
            source=0,
            target=target_status_id,
        )
        bo_asset_pk = bo_asset.pk
        target_status_name = BackOfficeAssetStatus.from_id(
            target_status_id).name
        rack = RackFactory()
        BackOfficeAsset.convert_to_data_center_asset(
            instances=[bo_asset],
            rack=rack.id,
            service_env=ServiceEnvironmentFactory().id,
            position=1,
            model=DataCenterAssetModelFactory().id,
            request=None,
            transition_id=transition.pk,
        )
        dc_asset = DataCenterAsset.objects.get(pk=bo_asset_pk)
        dc_asset_status_name = DataCenterAssetStatus.from_id(
            dc_asset.status).name
        self.assertEqual(target_status_name, dc_asset_status_name)

    def test_convert_to_data_center_asset_uses_default_from_settings(self):
        target_status_id = DataCenterAssetStatus.from_id(
            settings.CONVERT_TO_DATACENTER_ASSET_DEFAULT_STATUS_ID).id
        bo_asset = BackOfficeAssetFactory(
            status=BackOfficeAssetStatus.from_name('damaged'))
        transition = Transition.objects.create(
            name='transition',
            model=TransitionModel.get_for_field(bo_asset, 'status'),
            source=0,
            target=target_status_id,
        )
        bo_asset_pk = bo_asset.pk
        target_status_name = BackOfficeAssetStatus.from_id(
            target_status_id).name
        rack = RackFactory()
        BackOfficeAsset.convert_to_data_center_asset(
            instances=[bo_asset],
            rack=rack.id,
            service_env=ServiceEnvironmentFactory().id,
            position=1,
            model=DataCenterAssetModelFactory().id,
            request=None,
            transition_id=transition.pk,
        )
        dc_asset = DataCenterAsset.objects.get(pk=bo_asset_pk)
        dc_asset_status_name = DataCenterAssetStatus.from_id(
            dc_asset.status).name
        self.assertEqual(target_status_name, dc_asset_status_name)

    def test_assign_many_licences(self):
        asset = BackOfficeAssetFactory()
        licences = [LicenceFactory() for i in range(2)]
        self.assertFalse(asset.licences.all())

        BackOfficeAsset.assign_licence(
            instances=[asset],
            request=None,
            licences=licences,
        )

        self.assertCountEqual(
            [base_obj_lic.licence.id for base_obj_lic in asset.licences.all()],
            [licence.id for licence in licences],
        )

    def test_change_hostname(self):
        _, transition, _ = self._create_transition(
            model=self.bo_asset,
            name='test',
            source=[BackOfficeAssetStatus.new.id],
            target=BackOfficeAssetStatus.used.id,
            actions=['change_hostname'])
        run_field_transition([self.bo_asset],
                             field='status',
                             transition_obj_or_name=transition,
                             data={'change_hostname__country': Country.pl},
                             requester=self.request.user)
        self.assertEqual(self.bo_asset.hostname, 'POLPC01001')

    def test_assign_owner(self):
        _, transition, _ = self._create_transition(
            model=self.bo_asset,
            name='test',
            source=[BackOfficeAssetStatus.new.id],
            target=BackOfficeAssetStatus.used.id,
            actions=['assign_owner'])
        run_field_transition([self.bo_asset],
                             field='status',
                             transition_obj_or_name=transition,
                             data={'assign_owner__owner': self.user_pl.id},
                             requester=self.request.user)

    def test_assign_hostname_assigns_hostname_when_its_empty(self):
        hostname = ''
        self.bo_asset = BackOfficeAssetFactory(
            model=self.model,
            hostname=hostname,
            region=self.region_us,
        )
        _, transition, _ = self._create_transition(
            model=self.bo_asset,
            name='assign_hostname_if_empty_or_country_not_match',
            source=[BackOfficeAssetStatus.new.id],
            target=BackOfficeAssetStatus.used.id,
            actions=['assign_hostname_if_empty_or_country_not_match'])
        self.assertEquals(self.bo_asset.hostname, hostname)

        run_field_transition([self.bo_asset],
                             field='status',
                             transition_obj_or_name=transition,
                             data={},
                             requester=self.request.user)

        self.assertNotEquals(self.bo_asset.hostname, hostname)

    def test_assign_hostname_skips_hostname_when_its_already_set(self):
        # hostname must include country-code to be skipped during assigning
        hostname = 'the-same-hostname-across-transitions-{}'.format('USA')
        self.bo_asset = BackOfficeAssetFactory(
            model=self.model,
            hostname=hostname,
            region=self.region_us,
        )
        _, transition, _ = self._create_transition(
            model=self.bo_asset,
            name='assign_hostname_if_empty_or_country_not_match',
            source=[BackOfficeAssetStatus.new.id],
            target=BackOfficeAssetStatus.used.id,
            actions=['assign_hostname_if_empty_or_country_not_match'])
        self.assertEquals(self.bo_asset.hostname, hostname)

        run_field_transition([self.bo_asset],
                             field='status',
                             transition_obj_or_name=transition,
                             data={},
                             requester=self.request.user)

        self.assertEquals(self.bo_asset.hostname, hostname)

    def test_return_report_when_user_not_assigned(self):
        _, transition, _ = self._create_transition(
            model=self.bo_asset,
            name='test',
            source=[BackOfficeAssetStatus.new.id],
            target=BackOfficeAssetStatus.used.id,
            actions=['return_report'])
        with self.assertRaises(TransitionNotAllowedError):
            _check_instances_for_transition(instances=[self.bo_asset],
                                            transition=transition,
                                            requester=self.user_pl)

    def test_return_report_when_requester_is_not_assets_owner(self):
        _, transition, _ = self._create_transition(
            model=self.bo_asset,
            name='test',
            source=[BackOfficeAssetStatus.new.id],
            target=BackOfficeAssetStatus.used.id,
            actions=['must_be_owner_of_asset'])
        with self.assertRaises(TransitionNotAllowedError):
            _check_instances_for_transition(instances=[self.bo_asset],
                                            transition=transition,
                                            requester=self.user_pl)

    @patch.object(ExternalService, "run")
    def test_a_report_is_generated(self, mock_method):
        GENERATED_FILE_CONTENT = REPORT_TEMPLATE = b'some-content'
        mock_method.return_value = GENERATED_FILE_CONTENT
        report_template = ReportTemplateFactory(template__data=REPORT_TEMPLATE)
        user = UserFactory()
        instances = [
            BackOfficeAssetFactory(
                user=UserFactory(first_name="James", last_name="Bond"))
        ]

        attachment = BackOfficeAsset._generate_report(report_template.name,
                                                      user, instances,
                                                      report_template.language)

        correct_filename = '{}_{}-{}_{}.pdf'.format(
            timezone.now().isoformat()[:10],
            'james',
            'bond',
            report_template.report.name,
        )
        self.assertEqual(attachment.original_filename, correct_filename)
        self.assertEqual(attachment.file.read(), GENERATED_FILE_CONTENT)

    @patch('ralph.back_office.helpers.get_email_context_for_transition')
    def test_send_attachments_to_user_action_sends_email(self, mockemctx):
        mockemctx.return_value = EmailContext(from_email="*****@*****.**",
                                              subject="sub",
                                              body="bod")
        bo_asset = BackOfficeAssetFactory(model=self.model)
        _, transition, _ = self._create_transition(
            model=bo_asset,
            name='transition name',
            source=[BackOfficeAssetStatus.new.id],
            target=BackOfficeAssetStatus.used.id,
            actions=['return_report'])
        attachment = Attachment.objects.create(
            file=SimpleUploadedFile('test_file.pdf',
                                    b'some content',
                                    content_type='application/pdf'),
            uploaded_by=self.user_pl,
        )

        bo_asset.send_attachments_to_user(self.user_pl,
                                          transition.id,
                                          attachments=[attachment])

        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].from_email, "*****@*****.**")

    def test_send_attachments_to_user_action_dont_send_email_without_attachments(
            self):  # noqa: E501
        bo_asset = BackOfficeAssetFactory(model=self.model)
        _, transition, _ = self._create_transition(
            model=self.bo_asset,
            name='transition name',
            source=[BackOfficeAssetStatus.new.id],
            target=BackOfficeAssetStatus.used.id,
            actions=['return_report'])

        bo_asset.send_attachments_to_user(self.user_pl, transition.id)

        self.assertEqual(len(mail.outbox), 0)
Exemple #3
0
class TestBackOfficeAsset(RalphTestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.region_pl = RegionFactory(name='PL', country=Country.pl)
        cls.region_us = RegionFactory(name='US', country=Country.us)
        cls.category = CategoryFactory(code='PC')
        cls.category_without_code = CategoryFactory()
        cls.model = BackOfficeAssetModelFactory(category=cls.category)
        cls.model_without_code = BackOfficeAssetModelFactory(
            category=cls.category_without_code)

    def setUp(self):
        super().setUp()
        AssetLastHostname.objects.create(prefix='POLPC', counter=1000)
        self.bo_asset = BackOfficeAssetFactory(
            model=self.model,
            hostname='abc',
            region=self.region_pl,
        )
        self.bo_asset_2 = BackOfficeAssetFactory(
            model=self.model,
            hostname='abc2',
            region=self.region_pl,
            status=BackOfficeAssetStatus.liquidated.id,
            invoice_date=None)
        self.bo_asset_3 = BackOfficeAssetFactory(
            model=self.model,
            hostname='abc3',
            region=self.region_pl,
            status=BackOfficeAssetStatus.liquidated.id,
            invoice_date=datetime(2016, 1, 11).date(),
            depreciation_rate=50)
        self.bo_asset_4 = BackOfficeAssetFactory(
            model=self.model,
            hostname='abc3',
            region=self.region_pl,
            status=BackOfficeAssetStatus.liquidated.id,
            invoice_date=datetime(2016, 1, 11).date(),
            depreciation_end_date=datetime(2015, 1, 11).date(),
            depreciation_rate=50)
        self.category_parent = CategoryFactory(code='Mob1',
                                               default_depreciation_rate=30)
        self.category_2 = CategoryFactory(code='Mob2',
                                          default_depreciation_rate=25)
        self.category_3 = CategoryFactory(code='Mob3',
                                          parent=self.category_parent,
                                          default_depreciation_rate=0)

    def test_try_assign_hostname(self):
        self.bo_asset._try_assign_hostname(commit=True)
        self.assertEqual(self.bo_asset.hostname, 'POLPC01001')

    def test_try_assign_hostname_no_change(self):
        self.bo_asset.hostname = 'POLPC01001'
        self.bo_asset.save()
        self.bo_asset._try_assign_hostname(commit=True)
        self.assertEqual(self.bo_asset.hostname, 'POLPC01001')

    def test_try_assign_hostname_no_hostname(self):
        self.bo_asset.hostname = ''
        self.bo_asset.save()
        self.bo_asset._try_assign_hostname(commit=True)
        self.assertEqual(self.bo_asset.hostname, 'POLPC01001')

    def test_try_assign_hostname_forced(self):
        self.bo_asset.hostname = 'POLPC001010'
        self.bo_asset.save()
        self.bo_asset._try_assign_hostname(commit=True, force=True)
        self.assertEqual(self.bo_asset.hostname, 'POLPC01001')

    def test_try_assign_hostname_with_country(self):
        self.bo_asset._try_assign_hostname(country='US', commit=True)
        self.assertEqual(self.bo_asset.hostname, 'USPC00001')

    def test_try_assign_hostname_category_without_code(self):
        bo_asset_2 = BackOfficeAssetFactory(model=self.model_without_code,
                                            hostname='abcd')
        bo_asset_2._try_assign_hostname(commit=True)
        self.assertEqual(bo_asset_2.hostname, 'abcd')

    def test_get_autocomplete_queryset(self):
        queryset = BackOfficeAsset.get_autocomplete_queryset()
        self.assertEquals(1, queryset.count())

    def test_buyout_date(self):
        self.assertEqual(self.bo_asset_3.buyout_date,
                         datetime(2018, 2, 11).date())

        self.assertEqual(self.bo_asset_2.buyout_date, None)

    def test_butout_date_with_depreciation_end_date(self):
        self.assertEqual(self.bo_asset_4.buyout_date,
                         datetime(2015, 1, 11).date())

    def test_get_depreciation_rate(self):
        self.assertEqual(self.category_2.get_default_depreciation_rate(), 25)
        self.assertEqual(self.category_3.get_default_depreciation_rate(), 30)