def test_hurryup(self): self.audit_activity_normal_lifecycle(['approve']) activity = AuditActivity.objects.all()[0] token = generateToken(activity.creator) client = Client() response = client.get( '/api/v1/mine-audit-activities', content_type='application/json', HTTP_AUTHORIZATION=token) self.assertEquals(response.status_code, 200) result = json.loads(response.content.decode('utf-8')) item = result['activities'][0] self.assertEqual(item['canHurryup'], True) response = client.post( '/api/v1/audit-activities/{}/actions/hurryup'.format(activity.pk), content_type='application/json', HTTP_AUTHORIZATION=token) self.assertEquals(response.status_code, 200) step = activity.currentStep() message = Message.objects.get(profile=step.assignee, category='hurryup', activity=activity) self.assertEqual(message.read, False) response = client.get( '/api/v1/mine-audit-activities', content_type='application/json', HTTP_AUTHORIZATION=token) result = json.loads(response.content.decode('utf-8')) item = result['activities'][0] self.assertEqual(item['canHurryup'], False)
def test_hurryup_twice_one_day(self): self.audit_activity_normal_lifecycle(['approve']) activity = AuditActivity.objects.all()[0] token = generateToken(activity.creator) client = Client() response = client.post( '/api/v1/audit-activities/{}/actions/hurryup'.format(activity.pk), content_type='application/json', HTTP_AUTHORIZATION=token) self.assertEquals(response.status_code, 200) step = activity.currentStep() message = Message.objects.get(profile=step.assignee, category='hurryup', activity=activity) self.assertEqual(message.read, False) response = client.post( '/api/v1/audit-activities/{}/actions/hurryup'.format(activity.pk), content_type='application/json', HTTP_AUTHORIZATION=token) self.assertEquals(response.status_code, 200) msgs = Message.objects\ .filter(profile=step.assignee, category='hurryup', activity=activity)\ .count() self.assertEqual(msgs, 1)
def loginWithCode(request): data = json.loads(request.body.decode('utf-8')) try: profile = Profile.objects.get(phone=data['phone']) if checkCode(profile.phone, data['code']) and \ not profile.blocked: return JsonResponse({'token': generateToken(profile)}) else: return JsonResponse({'errorId': 'unauthorized'}, status=401) except: logger.exception('fail to login') return JsonResponse({'errorId': 'unauthorized'}, status=401)
def login(request): data = json.loads(request.body.decode('utf-8')) try: profile = Profile.objects.get(name=data['name']) if profile.user.check_password(data['password']) and \ not profile.blocked: return JsonResponse({'token': generateToken(profile)}) else: return JsonResponse({'errorId': 'unauthorized'}, status=401) except: logger.exception('fail to login') return JsonResponse({'errorId': 'unauthorized'}, status=401)
def test_query_configs(self): self.audit_activity_normal_lifecycle([]) activity = AuditActivity.objects.all()[0] token = generateToken(activity.creator) client = Client() response = client.get( '/api/v1/audit-configs', HTTP_AUTHORIZATION=token ) self.assertEqual(response.status_code, 200) result = json.loads(response.content.decode('utf-8')) self.assertEqual(len(result['configs']), 2)
def test_cancel_audit_activity_with_approved_steps(self): self.audit_activity_normal_lifecycle(['approve']) activity = AuditActivity.objects.all()[0] token = generateToken(activity.creator) client = Client() response = client.post( '/api/v1/audit-activities/{}/actions/cancel'.format(activity.pk), content_type='application/json', HTTP_AUTHORIZATION=token ) self.assertEquals(response.status_code, 400) result = json.loads(response.content.decode('utf-8')) self.assertEqual(result['errorId'], 'invalid-state')
def test_submit_audit_activity_with_invalid_state(self): self.audit_activity_normal_lifecycle([]) activity = AuditActivity.objects.all()[0] token = generateToken(activity.creator) client = Client() response = client.post( '/api/v1/audit-activities/{}/actions/submit-audit'.format( str(activity.pk)), HTTP_AUTHORIZATION=token ) self.assertEqual(response.status_code, 400) result = json.loads(response.content.decode('utf-8')) self.assertEqual(result['errorId'], 'invalid-state')
def test_approve_step_with_invalid_profile(self): self.audit_activity_normal_lifecycle(['approve', 'approve']) activity = AuditActivity.objects.all()[0] steps = activity.steps() step = steps[2] token = generateToken(self.lee) client = Client() response = client.post( '/api/v1/audit-steps/{}/actions/reject'.format(step.pk), content_type='application/json', HTTP_AUTHORIZATION=token ) self.assertEquals(response.status_code, 400) result = json.loads(response.content.decode('utf-8')) self.assertEqual(result['errorId'], 'invalid-assignee')
def test_relaunch_activity(self): self.audit_activity_normal_lifecycle(['approve', 'reject']) activity = AuditActivity.objects.all()[0] token = generateToken(activity.creator) client = Client() response = client.post( '/api/v1/audit-activities/{}/actions/relaunch'.format( str(activity.pk)), HTTP_AUTHORIZATION=token ) self.assertEqual(response.status_code, 200) result = json.loads(response.content.decode('utf-8')) activity = AuditActivity.objects.get(pk=activity.pk) self.assertEqual(activity.archived, True) activity = AuditActivity.objects.get(pk=result['id']) self.assertEqual(activity.state, AuditActivity.StateDraft)
def test_query_transaction_stat(self): self._test_transaction_stat() user = User.objects.create(username='******') profile = Profile.objects.create(name='jack', user=user, phone='foobar') token = generateToken(profile) client = Client() r = client.get('/api/v1/transaction-record-stats', HTTP_AUTHORIZATION=token) self.assertEqual(r.status_code, 200) result = json.loads(r.content.decode('utf-8')) self.assertEqual(result['total'], 3) records = result['records'] actual = [{ 'name': r['name'], 'income': r['income'], 'outcome': r['outcome'], 'balance': r['balance'] } for r in records] expected = [{ 'name': 'fin1', 'income': '11000.00', 'outcome': '400.00', 'balance': '10600.00' }, { 'name': 'fin2', 'income': '1000.00', 'outcome': '100.00', 'balance': '900.00' }, { 'name': 'fin3', 'income': '0.00', 'outcome': '0.00', 'balance': '0.00' }] self.assertListEqual(actual, expected)
def test_query_processed_activities(self): self.audit_activity_normal_lifecycle(['approve']) token = generateToken(self.lee) client = Client() response = client.get( '/api/v1/processed-audit-activities?type=baoxiao&creator=jack', HTTP_AUTHORIZATION=token ) self.assertEquals(response.status_code, 200) result = json.loads(response.content.decode('utf-8')) self.assertEqual(result['total'], 1) self.assertEqual(len(result['activities']), 1) client = Client() response = client.get( '/api/v1/processed-audit-activities?type=baoxiao&creator=jack&start=20', HTTP_AUTHORIZATION=token ) self.assertEquals(response.status_code, 200) result = json.loads(response.content.decode('utf-8')) self.assertEqual(result['total'], 1) self.assertEqual(len(result['activities']), 0)
def test_query_mine_activities(self): self.audit_activity_normal_lifecycle([]) activity = AuditActivity.objects.all()[0] token = generateToken(activity.creator) client = Client() response = client.get( '/api/v1/mine-audit-activities?type=baoxiao&state=processing', HTTP_AUTHORIZATION=token ) self.assertEqual(response.status_code, 200) result = json.loads(response.content.decode('utf-8')) self.assertEqual(result['total'], 1) self.assertEqual(len(result['activities']), 1) response = client.get( '/api/v1/mine-audit-activities?start=20', HTTP_AUTHORIZATION=token ) self.assertEqual(response.status_code, 200) result = json.loads(response.content.decode('utf-8')) self.assertEqual(result['total'], 1) self.assertEqual(len(result['activities']), 0)
def setUp(self): self.profile = helpers.prepareProfile('张三', 'root', '18888888888') self.generateToken = generateToken(self.profile)
def audit_activity_normal_lifecycle(self, actions, config=None, submitDirectly=True, creator=None): self.perpareData() open_account_config = specs.createAuditConfig( spec='fin.open_account:_.owner->fin.owner->root.ceo...') baoxiao_config = specs.createAuditConfig( spec='fin.baoxiao:_.owner->fin.accountant->root.ceo') if config is None: config = baoxiao_config else: config = AuditActivityConfig.objects.get(subtype=config) client = Client() if creator is not None: creator = Profile.objects.get(name=creator) else: creator = self.jack token = generateToken(creator) response = client.post( '/api/v1/audit-activities', json.dumps({ 'config': str(config.pk), 'submit': submitDirectly, 'extra': {} }), content_type='application/json', HTTP_AUTHORIZATION=token ) self.assertEquals(response.status_code, 200) result = json.loads(response.content.decode('utf-8')) self.assertEqual(result['ok'], True) activity = AuditActivity.objects.all()[0] self.assertEqual(activity.creator, creator) if submitDirectly: self.assertEqual(activity.state, AuditActivity.StateProcessing) else: self.assertEqual(activity.state, AuditActivity.StateDraft) self.assertEqual(len(activity.steps()), 0) if not submitDirectly: response = client.post( '/api/v1/audit-activities/{}/actions/submit-audit'.format( str(activity.pk)), HTTP_AUTHORIZATION=token ) self.assertEquals(response.status_code, 200) result = json.loads(response.content.decode('utf-8')) self.assertEqual(result['ok'], True) activity = AuditActivity.objects.all()[0] self.assertEqual(activity.state, AuditActivity.StateProcessing) steps = AuditStep.objects \ .filter(activity=activity) \ .order_by('position') if config.subtype == 'baoxiao': if creator.name == 'ceo': expect_steps = [ {'assignee': self.lucy}, {'assignee': self.ceo} ] else: expect_steps = [ {'assignee': self.lee}, {'assignee': self.lucy}, {'assignee': self.ceo} ] else: if creator.department.code == 'fin': expect_steps = [ {'assignee': self.neo}, {'assignee': self.ceo} ] else: expect_steps = [ {'assignee': self.lee}, {'assignee': self.neo}, {'assignee': self.ceo} ] for step in steps: es = expect_steps[step.position] self.assertEqual(es['assignee'], step.assignee) self.assertEqual(step.state, AuditStep.StatePending) for action in actions: if action == 'cancel': response = client.post( '/api/v1/audit-activities/{}/actions/cancel'.format( activity.pk), content_type='application/json', HTTP_AUTHORIZATION=token ) self.assertEquals(response.status_code, 200) if action == 'approve': step = activity.currentStep() token = generateToken(step.assignee) response = client.post( '/api/v1/audit-steps/{}/actions/approve'.format(step.pk), content_type='application/json', HTTP_AUTHORIZATION=token ) self.assertEquals(response.status_code, 200) if action == 'reject': step = activity.currentStep() token = generateToken(step.assignee) response = client.post( '/api/v1/audit-steps/{}/actions/reject'.format(step.pk), content_type='application/json', HTTP_AUTHORIZATION=token ) self.assertEquals(response.status_code, 200)
def test_query_taizhang_stats(self): self._test_taizhang_stat_and_customer_stat() user = User.objects.create(username='******') profile = Profile.objects.create(name='jack', user=user, phone='foobar') token = generateToken(profile) client = Client() r = client.get('/api/v1/taizhang-stats', HTTP_AUTHORIZATION=token) self.assertEqual(r.status_code, 200) result = json.loads(r.content.decode('utf-8')) self.assertEqual(result['total'], 6) stats = result['stats'] expect = [ { 'company': '公司1', 'asset': '电解铜', 'xiaoshoue': '1500635.50', 'lirune': '4985.50', 'kuchun_liang': '9600.00', 'zijin_zhanya': '2200.00' }, { 'company': '公司1', 'asset': '螺纹钢', 'xiaoshoue': '19931485.50', 'lirune': '3985.50', 'kuchun_liang': '190000.00', 'zijin_zhanya': '2000.00' }, { 'company': '公司2', 'asset': '电解铜', 'xiaoshoue': '1500635.50', 'lirune': '4985.50', 'kuchun_liang': '9600.00', 'zijin_zhanya': '2200.00' }, { 'company': '公司2', 'asset': '螺纹钢', 'xiaoshoue': '19931485.50', 'lirune': '3985.50', 'kuchun_liang': '190000.00', 'zijin_zhanya': '2000.00' }, { 'company': '公司3', 'asset': '电解铜', 'xiaoshoue': '599817.75', 'lirune': '1992.75', 'kuchun_liang': '3800.00', 'zijin_zhanya': '2000.00' }, { 'company': '公司3', 'asset': '螺纹钢', 'xiaoshoue': '0.00', 'lirune': '0.00', 'kuchun_liang': '0.00', 'zijin_zhanya': '0.00' }, ] self.assertListEqual(stats, expect)