Skip to content

Commit

Permalink
Merge 98f52cf into c6feeed
Browse files Browse the repository at this point in the history
  • Loading branch information
Krokop committed Feb 1, 2017
2 parents c6feeed + 98f52cf commit 0c237eb
Show file tree
Hide file tree
Showing 5 changed files with 245 additions and 108 deletions.
44 changes: 44 additions & 0 deletions src/openprocurement/api/tests/award.py
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,50 @@ def test_patch_tender_award(self):
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['errors'][0]["description"], "Can update award only in active lot status")

def test_cancel_merged_award(self):
# Create first award
request_path = '/tenders/{}/awards'.format(self.tender_id)
response = self.app.post_json(request_path, {'data': {'suppliers': [test_organization], 'status': u'pending',
'bid_id': self.initial_bids[0]['id'],
'lotID': self.initial_lots[0]['id'], "value": {"amount": 500}}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
first_award = response.json['data']

response = self.app.patch_json('/tenders/{}/awards/{}'.format(self.tender_id, first_award['id']), {"data": {"status": "active"}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data']['status'], 'active')

# Create second award
request_path = '/tenders/{}/awards'.format(self.tender_id)
response = self.app.post_json(request_path, {'data': {'suppliers': [test_organization], 'status': u'pending',
'bid_id': self.initial_bids[0]['id'],
'lotID': self.initial_lots[0]['id'], "value": {"amount": 500}}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
second_award = response.json['data']

response = self.app.patch_json('/tenders/{}/awards/{}'.format(self.tender_id, second_award['id']), {"data": {"status": "active"}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json['data']['status'], 'active')

# Merge contract
response = self.app.get('/tenders/{}/contracts'.format(self.tender_id))
response = self.app.patch_json('/tenders/{}/contracts/{}?acc_token={}'.format(
self.tender_id, response.json['data'][0]['id'], self.tender_token),
{"data": {"additionalAwardIDs": [response.json['data'][1]['awardID']]}})

self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')

# Try to cancel second award
response = self.app.patch_json('/tenders/{}/awards/{}'.format(self.tender_id, second_award['id']),
{"data": {"status": "cancelled"}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.json['errors'][0]["description"], "Can\'t cancel award while it is a part of merged contracts.")


class TenderAwardComplaintResourceTest(BaseTenderWebTest):
#initial_data = tender_data
Expand Down
162 changes: 161 additions & 1 deletion src/openprocurement/api/tests/cancellation.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
import unittest

from openprocurement.api.tests.base import BaseTenderWebTest, test_lots, test_bids
from openprocurement.api.tests.base import BaseTenderWebTest, test_lots, test_bids, test_organization


class TenderCancellationResourceTest(BaseTenderWebTest):
Expand Down Expand Up @@ -409,6 +409,166 @@ def test_patch_tender_cancellation(self):
self.assertEqual(response.json['data']["reason"], "cancellation reason")


class TenderLotCancellationContractTest(BaseTenderWebTest):
initial_status = 'active.qualification'
initial_lots = 2 * test_lots
initial_bids = test_bids

def test_create_lot_cancellation_on_merged_contract(self):
second_lot_id = self.initial_lots[1]['id']

# Create awards
request_path = '/tenders/{}/awards'.format(self.tender_id)
response = self.app.post_json(request_path, {'data': {'suppliers': [test_organization], 'status': u'pending',
'bid_id': self.initial_bids[0]['id'],
'lotID': self.initial_lots[0]['id'], "value": {"amount": 500}}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
first_award = response.json['data']
response = self.app.post_json(request_path, {'data': {'suppliers': [test_organization], 'status': u'pending',
'bid_id': self.initial_bids[1]['id'],
'lotID': self.initial_lots[1]['id'], "value": {"amount": 500}}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
second_award = response.json['data']
response = self.app.patch_json('/tenders/{}/awards/{}'.format(self.tender_id, first_award['id']), {"data": {"status": "active"}})
self.assertEqual(response.json['data']['status'], 'active')
response = self.app.patch_json('/tenders/{}/awards/{}'.format(self.tender_id, second_award['id']), {"data": {"status": "active"}})
self.assertEqual(response.json['data']['status'], 'active')

# Merge contract
response = self.app.get('/tenders/{}/contracts'.format(self.tender_id))
response = self.app.patch_json('/tenders/{}/contracts/{}?acc_token={}'.format(
self.tender_id, response.json['data'][0]['id'], self.tender_token),
{"data": {"additionalAwardIDs": [response.json['data'][1]['awardID']]}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')

# Create cancellation on lot
response = self.app.post_json('/tenders/{}/cancellations'.format(self.tender_id),
{"data": {
"reason": "cancellation reason",
"cancellationOf": "lot",
"relatedLot": second_lot_id}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.json['errors'][0]["description"],
"Can add cancellation on lot if corresponding contract is merged.")

def test_create_cancellation_on_lot_with_cancelled_awards(self):
""" Try create cancellation when we already have cancelled award """
# Create awards
request_path = '/tenders/{}/awards'.format(self.tender_id)
response = self.app.post_json(request_path, {'data': {'suppliers': [test_organization],
'status': u'pending',
'bid_id': self.initial_bids[0]['id'],
'lotID': self.initial_lots[0]['id'],
'value': {"amount": 500}}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
first_award = response.json['data']
response = self.app.post_json(request_path, {'data': {'suppliers': [test_organization],
'status': u'pending',
'bid_id': self.initial_bids[1]['id'],
'lotID': self.initial_lots[1]['id'],
"value": {"amount": 500}}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
second_award = response.json['data']
response = self.app.patch_json(
'/tenders/{}/awards/{}'.format(self.tender_id, first_award['id']),
{"data": {"status": "active"}})
self.assertEqual(response.json['data']['status'], 'active')
response = self.app.patch_json(
'/tenders/{}/awards/{}'.format(self.tender_id, second_award['id']),
{"data": {"status": "active"}})
self.assertEqual(response.json['data']['status'], 'active')

# Cancel first award
response = self.app.patch_json(
'/tenders/{}/awards/{}'.format(self.tender_id, first_award['id']),
{"data": {"status": "cancelled"}})
self.assertEqual(response.json['data']['status'], 'cancelled')

# Check number awards
awards = self.app.get('/tenders/{}/awards?acc_token={}'.format(self.tender_id, self.tender_token))
self.assertEqual(len(awards.json['data']), 3)

# Get new award
new_awards = [award for award in awards.json['data']
if award['lotID'] == self.initial_lots[0]['id']
and award['status'] == 'pending']
self.assertEqual(len(new_awards), 1)
new_award = new_awards[0]

# Active and merge new award
response = self.app.patch_json('/tenders/{}/awards/{}?acc_token={}'.format(
self.tender_id, new_award['id'], self.tender_token),
{'data': {'status': 'active'}})
third_award = response.json['data']

response = self.app.get('/tenders/{}/contracts'.format(self.tender_id))
second_contract = [c for c in response.json['data'] if c['awardID'] == second_award['id']][0]
response = self.app.patch_json('/tenders/{}/contracts/{}?acc_token={}'.format(
self.tender_id, second_contract['id'], self.tender_token),
{"data": {"additionalAwardIDs": [third_award['id']]}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')

# Create cancellation on lot
response = self.app.post_json('/tenders/{}/cancellations'.format(self.tender_id),
{"data": {"reason": "cancellation reason",
"cancellationOf": "lot",
"relatedLot": third_award['lotID']}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.json['errors'][0]["description"],
"Can add cancellation on lot if corresponding contract is merged.")

def test_update_lot_cancellation_on_merged_contract(self):
second_lot_id = self.initial_lots[1]['id']

# Create awards
request_path = '/tenders/{}/awards'.format(self.tender_id)
response = self.app.post_json(request_path, {'data': {'suppliers': [test_organization], 'status': u'pending',
'bid_id': self.initial_bids[0]['id'],
'lotID': self.initial_lots[0]['id'], "value": {"amount": 500}}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
first_award = response.json['data']
response = self.app.post_json(request_path, {'data': {'suppliers': [test_organization], 'status': u'pending',
'bid_id': self.initial_bids[1]['id'],
'lotID': self.initial_lots[1]['id'], "value": {"amount": 500}}})
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
second_award = response.json['data']
response = self.app.patch_json('/tenders/{}/awards/{}'.format(self.tender_id, first_award['id']), {"data": {"status": "active"}})
self.assertEqual(response.json['data']['status'], 'active')
response = self.app.patch_json('/tenders/{}/awards/{}'.format(self.tender_id, second_award['id']), {"data": {"status": "active"}})
self.assertEqual(response.json['data']['status'], 'active')

# Create cancellation on lot
response = self.app.post_json('/tenders/{}/cancellations'.format(self.tender_id),
{"data": {'reason': 'cancellation reason',
"cancellationOf": "lot",
"relatedLot": second_lot_id}})
self.assertEqual(response.status, '201 Created')
cancellation = response.json['data']

# Merge contract
response = self.app.get('/tenders/{}/contracts'.format(self.tender_id))
response = self.app.patch_json('/tenders/{}/contracts/{}?acc_token={}'.format(
self.tender_id, response.json['data'][0]['id'], self.tender_token),
{"data": {"additionalAwardIDs": [response.json['data'][1]['awardID']]}})
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.content_type, 'application/json')

# Activate cancellation on lot
response = self.app.patch_json('/tenders/{}/cancellations/{}'.format(self.tender_id, cancellation['id']),
{'data': {"status": "active"}}, status=403)
self.assertEqual(response.status, '403 Forbidden')
self.assertEqual(response.json['errors'][0]["description"],
"Can update cancellation on lot if corresponding contract is merged.")


class TenderCancellationDocumentResourceTest(BaseTenderWebTest):

def setUp(self):
Expand Down

0 comments on commit 0c237eb

Please sign in to comment.