예제 #1
0
    def test_confirm_disbursement_resets_on_failure(self):
        self.login(credentials={
            'username': '******',
            'password': '******'
        })

        disbursement = SAMPLE_DISBURSEMENTS[4]
        self.pending_detail(disbursement=disbursement)
        responses.add(responses.POST,
                      api_url('/disbursements/actions/preconfirm/'),
                      status=200)
        responses.add(
            responses.POST,
            nomis_url(
                '/prison/{nomis_id}/offenders/{prisoner_number}/transactions/'.
                format(nomis_id=disbursement['prison'],
                       prisoner_number=disbursement['prisoner_number'])),
            status=500)
        responses.add(responses.POST,
                      api_url('/disbursements/actions/reset/'),
                      status=200)

        with silence_logger():
            response = self.client.post(self.url(disbursement['id']),
                                        data={'confirmation': 'yes'},
                                        follow=True)
        self.assertOnPage(response, 'disbursements:pending_detail')
        self.assertContains(response,
                            'Payment not confirmed due to technical error')
예제 #2
0
    def add_nomis_responses_for_disbursement(self, disbursement):
        if disbursement['prisoner_name'] == 'PRISONER MOVED':
            responses.add(
                responses.GET,
                nomis_url(
                    '/prison/{nomis_id}/offenders/{prisoner_number}/accounts/'.
                    format(nomis_id=disbursement['prison'],
                           prisoner_number=disbursement['prisoner_number'])),
                status=500)
        else:
            responses.add(
                responses.GET,
                nomis_url(
                    '/prison/{nomis_id}/offenders/{prisoner_number}/accounts/'.
                    format(nomis_id=disbursement['prison'],
                           prisoner_number=disbursement['prisoner_number'])),
                json={
                    'cash': 10000,
                    'spends': 2000,
                    'savings': 10000
                },
                status=200)

        responses.add(
            responses.GET,
            nomis_url('/offenders/{prisoner_number}/location/'.format(
                prisoner_number=disbursement['prisoner_number'])),
            json={
                'establishment': {
                    'code': ('LEI' if disbursement['prisoner_name']
                             == 'PRISONER MOVED' else disbursement['prison']),
                    'desc':
                    'HMP'
                }
            },
            status=200)
예제 #3
0
    def enter_amount(self, amount=10, cash=5000):
        responses.add(
            responses.GET,
            nomis_url(
                '/prison/{nomis_id}/offenders/{prisoner_number}/accounts/'.
                format(nomis_id=self.nomis_id,
                       prisoner_number=self.prisoner_number)),
            json={
                'cash': cash,
                'spends': 2000,
                'savings': 10000
            },
            status=200,
        )

        return self.client.post(reverse('disbursements:amount'),
                                data={'amount': amount},
                                follow=True)
    def enter_amount(self, amount=10, cash=5000):
        responses.add(
            responses.GET,
            nomis_url('/prison/{nomis_id}/offenders/{prisoner_number}/accounts/'.format(
                nomis_id=self.nomis_id, prisoner_number=self.prisoner_number
            )),
            json={
                'cash': cash,
                'spends': 2000,
                'savings': 10000
            },
            status=200,
        )

        return self.client.post(
            reverse('disbursements:amount'),
            data={'amount': amount},
            follow=True
        )
예제 #5
0
    def test_confirm_disbursement(self):
        self.login(credentials={
            'username': '******',
            'password': '******'
        })

        disbursement = SAMPLE_DISBURSEMENTS[4]
        self.pending_detail(disbursement=disbursement)
        responses.add(responses.POST,
                      api_url('/disbursements/actions/preconfirm/'),
                      status=200)
        responses.add(
            responses.POST,
            nomis_url(
                '/prison/{nomis_id}/offenders/{prisoner_number}/transactions/'.
                format(nomis_id=disbursement['prison'],
                       prisoner_number=disbursement['prisoner_number'])),
            json={'id': '12345-1'},
            status=200)
        responses.add(responses.POST,
                      api_url('/disbursements/actions/confirm/'),
                      status=200)

        response = self.client.post(self.url(disbursement['id']),
                                    data={'confirmation': 'yes'},
                                    follow=True)
        self.assertOnPage(response, 'disbursements:confirmed')
        self.assertContains(response, '12345-1')
        nomis_call = responses.calls[-3]
        nomis_request = json.loads(nomis_call.request.body.decode())
        self.assertDictEqual(
            nomis_request, {
                'type': 'RELA',
                'description': 'Sent to Katy Hicks',
                'amount': 3000,
                'client_transaction_id': 'd660',
                'client_unique_ref': 'd660',
            })
    def test_new_credits_submit(self):
        with responses.RequestsMock() as rsps:
            # get new credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?ordering=-received_at&offset=0&limit=100&status=credit_pending&resolution=pending'),
                json=wrap_response_data(CREDIT_1, CREDIT_2),
                status=200,
                match_querystring=True,
            )
            # get manual credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=manual&status=credit_pending&offset=0&limit=100&ordering=-received_at'),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # create batch
            rsps.add(
                rsps.POST,
                api_url('/credits/batches/'),
                status=201,
            )
            # credit credits to NOMIS and API
            rsps.add(
                rsps.POST,
                nomis_url('/prison/BXI/offenders/A1234BC/transactions/'),
                json={'id': '6244779-1'},
                status=200,
            )
            rsps.add(
                rsps.POST,
                api_url('/credits/actions/credit/'),
                status=204,
            )
            rsps.add(
                rsps.POST,
                nomis_url('/prison/BXI/offenders/A1234GG/transactions/'),
                json={'id': '6244780-1'},
                status=200,
            )
            rsps.add(
                rsps.POST,
                api_url('/credits/actions/credit/'),
                status=204,
            )
            # REDIRECT after success
            # get active batches
            rsps.add(
                rsps.GET,
                api_url('/credits/batches/'),
                json=wrap_response_data(PROCESSING_BATCH),
                status=200,
            )
            # get incomplete credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=pending&pk=1&pk=2'),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # get complete credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=credited&pk=1&pk=2'),
                json=wrap_response_data(CREDIT_1, CREDIT_2),
                status=200,
                match_querystring=True,
            )
            # delete completed batch
            rsps.add(
                rsps.DELETE,
                api_url('/credits/batches/%s/' % PROCESSING_BATCH['id']),
                status=200,
            )
            # get new credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?ordering=-received_at&offset=0&limit=100&status=credit_pending&resolution=pending'),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # get manual credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=manual&status=credit_pending&offset=0&limit=100&ordering=-received_at'),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )

            self.login()
            response = self.client.post(
                self.url,
                data={'credits': [1, 2], 'submit_new': None},
                follow=True
            )
            self.assertEqual(response.status_code, 200)
            expected_calls = [
                [{'id': 1, 'credited': True, 'nomis_transaction_id': '6244779-1'}],
                [{'id': 2, 'credited': True, 'nomis_transaction_id': '6244780-1'}]
            ]
            self.assertTrue(
                json.loads(rsps.calls[4].request.body.decode('utf-8')) in expected_calls and
                json.loads(rsps.calls[6].request.body.decode('utf-8')) in expected_calls
            )
            self.assertContains(response, '2 credits sent to NOMIS')
            self.assertEqual(len(mail.outbox), 2)
            self.assertTrue(
                '£52.00' in mail.outbox[0].body and '£45.00' in mail.outbox[1].body or
                '£52.00' in mail.outbox[1].body and '£45.00' in mail.outbox[0].body
            )
    def test_new_credits_submit_with_uncreditable(self):
        with responses.RequestsMock() as rsps:
            # get new credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?ordering=-received_at&offset=0&limit=100&status=credit_pending&resolution=pending'),
                json=wrap_response_data(CREDIT_1, CREDIT_2),
                status=200,
                match_querystring=True,
            )
            # get manual credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=manual&status=credit_pending&offset=0&limit=100&ordering=-received_at'),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # create batch
            rsps.add(
                rsps.POST,
                api_url('/credits/batches/'),
                status=201,
            )
            # credit credits to NOMIS and API
            rsps.add(
                rsps.POST,
                nomis_url('/prison/BXI/offenders/A1234BC/transactions/'),
                status=400,
            )
            rsps.add(
                rsps.POST,
                api_url('/credits/actions/setmanual/'),
                status=204,
            )
            rsps.add(
                rsps.POST,
                nomis_url('/prison/BXI/offenders/A1234GG/transactions/'),
                json={'id': '6244780-1'},
                status=200,
            )
            rsps.add(
                rsps.POST,
                api_url('/credits/actions/credit/'),
                status=204,
            )
            # REDIRECT after success
            # get active batches
            rsps.add(
                rsps.GET,
                api_url('/credits/batches/'),
                json=wrap_response_data(PROCESSING_BATCH),
                status=200,
            )
            # get incomplete credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=pending&pk=1&pk=2'),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # get complete credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=credited&pk=1&pk=2'),
                json=wrap_response_data(CREDIT_2),
                status=200,
                match_querystring=True,
            )
            # delete completed batch
            rsps.add(
                rsps.DELETE,
                api_url('/credits/batches/%s/' % PROCESSING_BATCH['id']),
                status=200,
            )
            # get new credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?ordering=-received_at&offset=0&limit=100&status=credit_pending&resolution=pending'),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # get manual credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=manual&status=credit_pending&offset=0&limit=100&ordering=-received_at'),
                json=wrap_response_data(CREDIT_1),
                status=200,
                match_querystring=True,
            )
            rsps.add(
                rsps.GET,
                nomis_url('/offenders/A1234BC/location/'),
                json={
                    'establishment': {
                        'code': 'LEI',
                        'desc': 'LEEDS (HMP)'
                    }
                },
                status=200,
            )

            self.login()
            with silence_logger(name='mtp', level=logging.CRITICAL):
                response = self.client.post(
                    self.url,
                    data={'credits': [1, 2], 'submit_new': None},
                    follow=True
                )
            self.assertEqual(response.status_code, 200)
            self.assertContains(response, '1 credit sent to NOMIS')
            self.assertContains(response, '1 credit needs your manual input in NOMIS')
            self.assertEqual(len(mail.outbox), 1)
예제 #8
0
    def test_new_credits_submit(self):
        with responses.RequestsMock() as rsps:
            # get new credits
            rsps.add(
                rsps.GET,
                api_url(
                    '/credits/?ordering=-received_at&offset=0&limit=100&status=credit_pending&resolution=pending'
                ),
                json=wrap_response_data(CREDIT_1, CREDIT_2),
                status=200,
                match_querystring=True,
            )
            # get manual credits
            rsps.add(
                rsps.GET,
                api_url(
                    '/credits/?resolution=manual&status=credit_pending&offset=0&limit=100&ordering=-received_at'
                ),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # create batch
            rsps.add(
                rsps.POST,
                api_url('/credits/batches/'),
                status=201,
            )
            # credit credits to NOMIS and API
            rsps.add(
                rsps.POST,
                nomis_url('/prison/BXI/offenders/A1234BC/transactions/'),
                json={'id': '6244779-1'},
                status=200,
            )
            rsps.add(
                rsps.POST,
                api_url('/credits/actions/credit/'),
                status=204,
            )
            rsps.add(
                rsps.POST,
                nomis_url('/prison/BXI/offenders/A1234GG/transactions/'),
                json={'id': '6244780-1'},
                status=200,
            )
            rsps.add(
                rsps.POST,
                api_url('/credits/actions/credit/'),
                status=204,
            )
            # REDIRECT after success
            # get active batches
            rsps.add(
                rsps.GET,
                api_url('/credits/batches/'),
                json=wrap_response_data(PROCESSING_BATCH),
                status=200,
            )
            # get incomplete credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=pending&pk=1&pk=2'),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # get complete credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=credited&pk=1&pk=2'),
                json=wrap_response_data(CREDIT_1, CREDIT_2),
                status=200,
                match_querystring=True,
            )
            # delete completed batch
            rsps.add(
                rsps.DELETE,
                api_url('/credits/batches/%s/' % PROCESSING_BATCH['id']),
                status=200,
            )
            # get new credits
            rsps.add(
                rsps.GET,
                api_url(
                    '/credits/?ordering=-received_at&offset=0&limit=100&status=credit_pending&resolution=pending'
                ),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # get manual credits
            rsps.add(
                rsps.GET,
                api_url(
                    '/credits/?resolution=manual&status=credit_pending&offset=0&limit=100&ordering=-received_at'
                ),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )

            self.login()
            response = self.client.post(self.url,
                                        data={
                                            'credits': [1, 2],
                                            'submit_new': None
                                        },
                                        follow=True)
            self.assertEqual(response.status_code, 200)
            expected_calls = [[{
                'id': 1,
                'credited': True,
                'nomis_transaction_id': '6244779-1'
            }],
                              [{
                                  'id': 2,
                                  'credited': True,
                                  'nomis_transaction_id': '6244780-1'
                              }]]
            self.assertTrue(
                json.loads(rsps.calls[4].request.body.decode('utf-8'))
                in expected_calls
                and json.loads(rsps.calls[6].request.body.decode('utf-8'))
                in expected_calls)
            self.assertContains(response, '2 credits sent to NOMIS')
            self.assertEqual(len(mail.outbox), 2)
            self.assertTrue('£52.00' in mail.outbox[0].body
                            and '£45.00' in mail.outbox[1].body
                            or '£52.00' in mail.outbox[1].body
                            and '£45.00' in mail.outbox[0].body)
예제 #9
0
    def test_new_credits_submit_with_uncreditable(self):
        with responses.RequestsMock() as rsps:
            # get new credits
            rsps.add(
                rsps.GET,
                api_url(
                    '/credits/?ordering=-received_at&offset=0&limit=100&status=credit_pending&resolution=pending'
                ),
                json=wrap_response_data(CREDIT_1, CREDIT_2),
                status=200,
                match_querystring=True,
            )
            # get manual credits
            rsps.add(
                rsps.GET,
                api_url(
                    '/credits/?resolution=manual&status=credit_pending&offset=0&limit=100&ordering=-received_at'
                ),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # create batch
            rsps.add(
                rsps.POST,
                api_url('/credits/batches/'),
                status=201,
            )
            # credit credits to NOMIS and API
            rsps.add(
                rsps.POST,
                nomis_url('/prison/BXI/offenders/A1234BC/transactions/'),
                status=400,
            )
            rsps.add(
                rsps.POST,
                api_url('/credits/actions/setmanual/'),
                status=204,
            )
            rsps.add(
                rsps.POST,
                nomis_url('/prison/BXI/offenders/A1234GG/transactions/'),
                json={'id': '6244780-1'},
                status=200,
            )
            rsps.add(
                rsps.POST,
                api_url('/credits/actions/credit/'),
                status=204,
            )
            # REDIRECT after success
            # get active batches
            rsps.add(
                rsps.GET,
                api_url('/credits/batches/'),
                json=wrap_response_data(PROCESSING_BATCH),
                status=200,
            )
            # get incomplete credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=pending&pk=1&pk=2'),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # get complete credits
            rsps.add(
                rsps.GET,
                api_url('/credits/?resolution=credited&pk=1&pk=2'),
                json=wrap_response_data(CREDIT_2),
                status=200,
                match_querystring=True,
            )
            # delete completed batch
            rsps.add(
                rsps.DELETE,
                api_url('/credits/batches/%s/' % PROCESSING_BATCH['id']),
                status=200,
            )
            # get new credits
            rsps.add(
                rsps.GET,
                api_url(
                    '/credits/?ordering=-received_at&offset=0&limit=100&status=credit_pending&resolution=pending'
                ),
                json=wrap_response_data(),
                status=200,
                match_querystring=True,
            )
            # get manual credits
            rsps.add(
                rsps.GET,
                api_url(
                    '/credits/?resolution=manual&status=credit_pending&offset=0&limit=100&ordering=-received_at'
                ),
                json=wrap_response_data(CREDIT_1),
                status=200,
                match_querystring=True,
            )
            rsps.add(
                rsps.GET,
                nomis_url('/offenders/A1234BC/location/'),
                json={'establishment': {
                    'code': 'LEI',
                    'desc': 'LEEDS (HMP)'
                }},
                status=200,
            )

            self.login()
            with silence_logger(name='mtp', level=logging.CRITICAL):
                response = self.client.post(self.url,
                                            data={
                                                'credits': [1, 2],
                                                'submit_new': None
                                            },
                                            follow=True)
            self.assertEqual(response.status_code, 200)
            self.assertContains(response, '1 credit sent to NOMIS')
            self.assertContains(response,
                                '1 credit needs your manual input in NOMIS')
            self.assertEqual(len(mail.outbox), 1)