Skip to content

Commit

Permalink
DEV-215 add action column to released data log (#25)
Browse files Browse the repository at this point in the history
DEV-215 add action column to released data log

This column is required to determine how the is_open flag
from RDL affect existing is_open and is_controlled flags
in RD.
  • Loading branch information
philtom-ctds authored Jun 4, 2020
1 parent a47dabd commit 40a5506
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 15 deletions.
27 changes: 20 additions & 7 deletions gdc_ng_models/models/released_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

Base = declarative_base()


RELEASE_DATA_TYPE_VALUES = ["ssm", "cnv", "case"]
RELEASED_DATA_DATA_TYPE_VALUES = frozenset({"ssm", "cnv", "case"})
RELEASED_DATA_LOG_ACTION_VALUES = frozenset({"release", "unrelease"})


class ReleasedDataMixin:
Expand All @@ -22,12 +22,16 @@ def project_id(self):

@validates("data_type")
def validate_data_type(self, key, data_type):
assert data_type in RELEASE_DATA_TYPE_VALUES
if data_type not in RELEASED_DATA_DATA_TYPE_VALUES:
raise ValueError(
""""{data_type}" is not a valid value for {key}""".format(
data_type=data_type, key=key
)
)
return data_type


class ReleasedData(Base, audit.AuditColumnsMixin, ReleasedDataMixin):

__tablename__ = "released_data"
__table_args__ = (
schema.PrimaryKeyConstraint(
Expand All @@ -53,7 +57,6 @@ def to_json(self):


class ReleasedDataLog(Base, audit.AuditColumnsMixin, ReleasedDataMixin):

__tablename__ = "released_data_log"
__table_args__ = (
schema.Index(
Expand All @@ -65,8 +68,8 @@ class ReleasedDataLog(Base, audit.AuditColumnsMixin, ReleasedDataMixin):
)

def __repr__(self):
return "<ReleasedDataLog(project_id='{}', release_number={}, data_type='{}', is_open={})>".format(
self.project_id, self.release_number, self.data_type, self.is_open,
return "<ReleasedDataLog(project_id='{}', release_number={}, data_type='{}', is_open={}, action='{}')>".format(
self.project_id, self.release_number, self.data_type, self.is_open, self.action,
)

release_data_log_id_seq = schema.Sequence(
Expand All @@ -78,6 +81,15 @@ def __repr__(self):
server_default=release_data_log_id_seq.next_value(),
)
release_number = schema.Column(sqltypes.Text, nullable=False)
action = schema.Column(sqltypes.Text, nullable=False)

@validates("action")
def validate_action(self, key, action):
if action not in RELEASED_DATA_LOG_ACTION_VALUES:
raise ValueError(
""""{action}" is not a valid value for {key}""".format(action=action, key=key)
)
return action

def to_json(self):
return {
Expand All @@ -86,4 +98,5 @@ def to_json(self):
"release_number": self.release_number,
"data_type": self.data_type,
"is_open": self.is_open,
"action": self.action,
}
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setup(
name='gdc_ng_models',
version='1.2.0',
version='1.3.0',
description='Non-graph GDC models',
license='Apache',
packages=find_packages(),
Expand Down
34 changes: 27 additions & 7 deletions tests/test_released_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,20 @@ def helper(
@pytest.fixture
def fake_released_log(create_released_data_db, db_session, request):
def helper(
name="name", code="code", release_number="1", data_type="cnv", is_open=False,
name="name",
code="code",
release_number="1",
data_type="cnv",
is_open=False,
action="release",
):
node = released_data.ReleasedDataLog(
program_name=name,
project_code=code,
release_number=release_number,
data_type=data_type,
is_open=is_open,
action=action,
)
db_session.merge(node)
return node
Expand All @@ -46,16 +52,16 @@ def test_released_data__sqlalchemy_model_registered():


@pytest.mark.parametrize("data_type", ["cnv", "ssm", "case"])
def test_released_data__good_enums(fake_released_data, db_session, data_type):
def test_released_data__valid_data_type(fake_released_data, db_session, data_type):
fake_released_data(data_type=data_type)
node = db_session.query(released_data.ReleasedData).first()

assert node.data_type == data_type
db_session.delete(node)


def test_released_data__bad_enums(fake_released_data):
with pytest.raises(AssertionError):
def test_released_data__invalid_data_type(fake_released_data):
with pytest.raises(ValueError, match=r"not a valid value for data_type"):
fake_released_data(data_type="not-applicable")


Expand All @@ -70,19 +76,33 @@ def test_release_data_log__sqlalchemy_model_registered():


@pytest.mark.parametrize("data_type", ["cnv", "ssm", "case"])
def test_release_data_log__good_enums(db_session, data_type, fake_released_log):
def test_release_data_log__valid_data_type(db_session, data_type, fake_released_log):
fake_released_log(data_type=data_type)
db_session.commit()
node = db_session.query(released_data.ReleasedDataLog).first()

assert node.data_type == data_type


def test_release_data_log__bad_enums(db_session, fake_released_log):
with pytest.raises(AssertionError):
def test_release_data_log__invalid_data_type(db_session, fake_released_log):
with pytest.raises(ValueError, match=r"not a valid value for data_type"):
fake_released_log(data_type="not-applicable")


@pytest.mark.parametrize("action", ["release", "unrelease"])
def test_release_data_log__valid_action(db_session, action, fake_released_log):
fake_released_log(action=action)
db_session.commit()
node = db_session.query(released_data.ReleasedDataLog).first()

assert node.action == action


def test_release_data_log__invalid_action(db_session, fake_released_log):
with pytest.raises(ValueError, match=r"not a valid value for action"):
fake_released_log(action="not-applicable")


def test_release_data_log__auto_increment(db_session, fake_released_log):
max_id = -1
for i in range(10):
Expand Down

0 comments on commit 40a5506

Please sign in to comment.