The unique constraint on SeviceCallbackApi was on service_id only.

Now that we have 2 types of api callbacks the constraint to be on service_id + callback_type.
This commit is contained in:
Rebecca Law
2018-07-25 14:12:13 +01:00
parent e4bef01ae1
commit a812060915
2 changed files with 48 additions and 1 deletions

View File

@@ -597,7 +597,7 @@ class ServiceInboundApi(db.Model, Versioned):
class ServiceCallbackApi(db.Model, Versioned): class ServiceCallbackApi(db.Model, Versioned):
__tablename__ = 'service_callback_api' __tablename__ = 'service_callback_api'
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
service_id = db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), index=True, nullable=False, unique=True) service_id = db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), index=True, nullable=False)
service = db.relationship('Service', backref='service_callback_api') service = db.relationship('Service', backref='service_callback_api')
url = db.Column(db.String(), nullable=False) url = db.Column(db.String(), nullable=False)
callback_type = db.Column(db.String(), db.ForeignKey('service_callback_type.name'), nullable=True) callback_type = db.Column(db.String(), db.ForeignKey('service_callback_type.name'), nullable=True)
@@ -607,6 +607,10 @@ class ServiceCallbackApi(db.Model, Versioned):
updated_by = db.relationship('User') updated_by = db.relationship('User')
updated_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False) updated_by_id = db.Column(UUID(as_uuid=True), db.ForeignKey('users.id'), index=True, nullable=False)
__table_args__ = (
UniqueConstraint('service_id', 'callback_type', name='uix_service_callback_type'),
)
@property @property
def bearer_token(self): def bearer_token(self):
if self._bearer_token: if self._bearer_token:

View File

@@ -56,6 +56,49 @@ def test_save_service_callback_api_fails_if_service_does_not_exist(notify_db, no
save_service_callback_api(service_callback_api) save_service_callback_api(service_callback_api)
def test_update_service_callback_api_unique_constraint(sample_service):
service_callback_api = ServiceCallbackApi(
service_id=sample_service.id,
url="https://some_service/callback_endpoint",
bearer_token="some_unique_string",
updated_by_id=sample_service.users[0].id,
callback_type='delivery_status'
)
save_service_callback_api(service_callback_api)
another = ServiceCallbackApi(
service_id=sample_service.id,
url="https://some_service/another_callback_endpoint",
bearer_token="different_string",
updated_by_id=sample_service.users[0].id,
callback_type='delivery_status'
)
with pytest.raises(expected_exception=SQLAlchemyError):
save_service_callback_api(another)
def test_update_service_callback_can_add_two_api_of_different_types(sample_service):
delivery_status = ServiceCallbackApi(
service_id=sample_service.id,
url="https://some_service/callback_endpoint",
bearer_token="some_unique_string",
updated_by_id=sample_service.users[0].id,
callback_type='delivery_status'
)
save_service_callback_api(delivery_status)
complaint = ServiceCallbackApi(
service_id=sample_service.id,
url="https://some_service/another_callback_endpoint",
bearer_token="different_string",
updated_by_id=sample_service.users[0].id,
callback_type='complaint'
)
save_service_callback_api(complaint)
results = ServiceCallbackApi.query.order_by(ServiceCallbackApi.callback_type).all()
assert len(results) == 2
assert results[0].serialize() == complaint.serialize()
assert results[1].serialize() == delivery_status.serialize()
def test_update_service_callback_api(sample_service): def test_update_service_callback_api(sample_service):
service_callback_api = ServiceCallbackApi( service_callback_api = ServiceCallbackApi(
service_id=sample_service.id, service_id=sample_service.id,