mirror of
https://github.com/GSA/notifications-api.git
synced 2026-04-12 13:19:30 -04:00
Merge pull request #1987 from alphagov/fix-unique-key-service_callback_api
Fix unique constraint on ServiceCallbackApi
This commit is contained in:
@@ -597,7 +597,7 @@ class ServiceInboundApi(db.Model, Versioned):
|
||||
class ServiceCallbackApi(db.Model, Versioned):
|
||||
__tablename__ = 'service_callback_api'
|
||||
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')
|
||||
url = db.Column(db.String(), nullable=False)
|
||||
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_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
|
||||
def bearer_token(self):
|
||||
if self._bearer_token:
|
||||
|
||||
23
migrations/versions/0208_fix_unique_index.py
Normal file
23
migrations/versions/0208_fix_unique_index.py
Normal file
@@ -0,0 +1,23 @@
|
||||
"""
|
||||
|
||||
Revision ID: 0208_fix_unique_index
|
||||
Revises: 0207_set_callback_history_type
|
||||
Create Date: 2018-07-25 13:55:24.941794
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
|
||||
revision = '84c3b6eb16b3'
|
||||
down_revision = '0207_set_callback_history_type'
|
||||
|
||||
|
||||
def upgrade():
|
||||
op.create_unique_constraint('uix_service_callback_type', 'service_callback_api', ['service_id', 'callback_type'])
|
||||
op.drop_index('ix_service_callback_api_service_id', table_name='service_callback_api')
|
||||
op.create_index(op.f('ix_service_callback_api_service_id'), 'service_callback_api', ['service_id'], unique=False)
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_index(op.f('ix_service_callback_api_service_id'), table_name='service_callback_api')
|
||||
op.create_index('ix_service_callback_api_service_id', 'service_callback_api', ['service_id'], unique=True)
|
||||
op.drop_constraint('uix_service_callback_type', 'service_callback_api', type_='unique')
|
||||
@@ -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)
|
||||
|
||||
|
||||
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):
|
||||
service_callback_api = ServiceCallbackApi(
|
||||
service_id=sample_service.id,
|
||||
|
||||
Reference in New Issue
Block a user