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')
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)
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 )
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)
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)