Skip to content

Commit 54f8148

Browse files
Store publish date (jsocol#150)
* Store publish date * PR review
1 parent d9d6a7a commit 54f8148

14 files changed

+88
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""Add published_at in UseCaseVersion
2+
3+
Revision ID: 7aa804ae672a
4+
Revises: 8deee2aef34b
5+
Create Date: 2022-05-31 15:20:15.856959
6+
7+
"""
8+
import sqlalchemy as sa
9+
10+
from alembic import op
11+
12+
revision = "7aa804ae672a"
13+
down_revision = "8deee2aef34b"
14+
branch_labels = None
15+
depends_on = None
16+
17+
18+
def upgrade():
19+
op.add_column(
20+
"use_case_versions",
21+
sa.Column("published_at", sa.DateTime, nullable=True),
22+
)
23+
24+
op.execute(
25+
"""
26+
update use_case_versions set published_at = created_at
27+
where use_case_versions.id in (
28+
select production_version_id from use_cases where production_version_id is not null
29+
);
30+
"""
31+
)
32+
33+
34+
def downgrade():
35+
op.drop_column("use_case_versions", "published_at")

tests/api/namespace/use_case/test_create_flow.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ def test_create_flow_with_existing_flow(
125125
is_production_version,
126126
):
127127
use_case = UseCaseFactory()
128-
created_at = datetime.utcnow()
128+
published_at = datetime.utcnow()
129129
UseCaseVersionFactory(
130130
use_case=use_case,
131131
is_production_version=is_production_version,
132-
created_at=created_at,
132+
published_at=published_at,
133133
)
134134
response = client.post(
135135
f"/use_cases/{use_case.uuid}/flows", json=reference_flow, params=params
@@ -146,7 +146,7 @@ def test_create_flow_with_existing_flow(
146146
assert response.json() == {
147147
"meta": {
148148
"has_pending_changes": True,
149-
"last_published_date": common.add_utc_tz(created_at)
149+
"last_published_date": common.add_utc_tz(published_at)
150150
if is_production_version
151151
else None,
152152
"latest_version_date": common.add_utc_tz(latest_version.created_at),

tests/api/namespace/use_case/test_publish_use_case.py

+28-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
# pylint: disable=redefined-outer-name
2+
import datetime as dt
3+
24
import pytest
35

46
from tests.api.namespace.use_case import common
57
from tests.factories.use_case_factory import UseCaseFactory
8+
from tests.factories.use_case_version_factory import UseCaseVersionFactory
69
from tests.fixtures.valid_flow_json import * # noqa: F401, F403, pylint: disable=wildcard-import,unused-wildcard-import
710
from use_case_executor.domain.flow.schema_version import SchemaVersion
811

@@ -84,7 +87,7 @@ def test_publish_use_case_sets_latest_flow_as_production(
8487
assert response.json() == {
8588
"meta": {
8689
"has_pending_changes": False,
87-
"last_published_date": common.add_utc_tz(published_version.created_at),
90+
"last_published_date": common.add_utc_tz(published_version.published_at),
8891
"latest_version_date": common.add_utc_tz(published_version.created_at),
8992
},
9093
"data": common.make_flow_variant(
@@ -94,3 +97,27 @@ def test_publish_use_case_sets_latest_flow_as_production(
9497

9598
session.expire_all()
9699
assert use_case.production_version_id == versions[-1].id
100+
101+
102+
def test_publish_use_case_updates_published_at_even_if_the_use_case_is_already_published(
103+
non_debug_client,
104+
use_case,
105+
session,
106+
params,
107+
):
108+
initial_published_at = dt.datetime.utcnow()
109+
UseCaseVersionFactory(
110+
use_case=use_case, published_at=initial_published_at, is_production_version=True
111+
)
112+
assert initial_published_at == use_case.production_version.published_at
113+
114+
response = non_debug_client.post(
115+
f"/use_cases/{use_case.uuid}/flows/latest/publish", params=params
116+
)
117+
118+
assert response.status_code == 200
119+
published_at = response.json()["meta"]["last_published_date"]
120+
assert published_at != initial_published_at
121+
122+
session.expire_all()
123+
assert published_at == common.add_utc_tz(use_case.production_version.published_at)

tests/api/namespace/use_case/test_read_flow.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def test_get_latest_flow_returns_latest_flow(
116116
"meta": {
117117
"has_pending_changes": production_version_index != len(versions) - 1,
118118
"last_published_date": common.add_utc_tz(
119-
versions[production_version_index].created_at
119+
versions[production_version_index].published_at
120120
)
121121
if production_version_index is not None
122122
else None,
@@ -160,7 +160,7 @@ def test_get_production_flow_returns_production_flow(
160160
"meta": {
161161
"has_pending_changes": production_version_index != len(versions) - 1,
162162
"last_published_date": common.add_utc_tz(
163-
versions[production_version_index].created_at
163+
versions[production_version_index].published_at
164164
)
165165
if production_version_index is not None
166166
else None,

tests/api/namespace/use_case/test_reset_production_state.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def test_production_version_is_republished(
134134
assert response.json() == {
135135
"meta": {
136136
"has_pending_changes": False,
137-
"last_published_date": common.add_utc_tz(new_version.created_at),
137+
"last_published_date": common.add_utc_tz(new_version.published_at),
138138
"latest_version_date": common.add_utc_tz(new_version.created_at),
139139
},
140140
"data": common.make_flow_variant(

tests/domain/execute_use_case_and_send_answer/test_incoming_message_returns_a_fallback_message.py

+1
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ def test_user_event_sender_exceptions_results_in_fallback_message_being_sent(
141141
use_case_uuid=use_case.uuid,
142142
created_at=dt.datetime.utcnow(),
143143
flow=flow,
144+
published_at=None,
144145
),
145146
)
146147
mock_repository.set_are_all_variables_declared_on_instance_return_value(

tests/domain/execute_use_case_and_send_answer/test_position.py

+2
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ def test_position_is_passed_to_execute_flow_from_position( # pylint: disable=to
8888
use_case_uuid=use_case.uuid,
8989
created_at=dt.datetime.utcnow(),
9090
flow=flow,
91+
published_at=None,
9192
),
9293
)
9394
mock_repository.set_are_all_variables_declared_on_instance_return_value(
@@ -173,6 +174,7 @@ def test_next_position_is_saved_in_the_repository( # pylint: disable=too-many-a
173174
use_case_uuid=use_case.uuid,
174175
created_at=dt.datetime.utcnow(),
175176
flow=flow,
177+
published_at=None,
176178
),
177179
)
178180
mock_repository.set_are_all_variables_declared_on_instance_return_value(

tests/domain/execute_use_case_and_send_answer/test_production_vs_latest.py

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def test_flow_returns_answer_text_in_the_content_language(
4040
use_case_uuid=use_case.uuid,
4141
created_at=dt.datetime.utcnow(),
4242
flow=flow,
43+
published_at=None,
4344
),
4445
)
4546
else:
@@ -57,6 +58,7 @@ def test_flow_returns_answer_text_in_the_content_language(
5758
use_case_uuid=use_case.uuid,
5859
created_at=dt.datetime.utcnow(),
5960
flow=flow,
61+
published_at=dt.datetime.utcnow(),
6062
),
6163
)
6264
mock_repository.set_are_all_variables_declared_on_instance_return_value(

tests/domain/execute_use_case_and_send_answer/test_variables_validation.py

+4
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ def test_unknown_variable_in_user_input_node_raises_invalid_flow_configuration_e
9999
use_case_uuid=use_case.uuid,
100100
created_at=dt.datetime.utcnow(),
101101
flow=flow,
102+
published_at=None,
102103
),
103104
)
104105
mock_repository.set_are_all_variables_declared_on_instance_return_value(
@@ -178,6 +179,7 @@ def test_unknown_variable_in_variable_text_piece_data_raises_invalid_flow_config
178179
use_case_uuid=use_case.uuid,
179180
created_at=dt.datetime.utcnow(),
180181
flow=flow,
182+
published_at=None,
181183
),
182184
)
183185
mock_repository.set_are_all_variables_declared_on_instance_return_value(
@@ -281,6 +283,7 @@ def test_unknown_variable_in_variable_text_piece_data_in_create_ticket_raises_in
281283
use_case_uuid=use_case.uuid,
282284
created_at=dt.datetime.utcnow(),
283285
flow=flow,
286+
published_at=None,
284287
),
285288
)
286289
mock_repository.set_are_all_variables_declared_on_instance_return_value(
@@ -377,6 +380,7 @@ def test_unknown_variable_in_variable_text_piece_data_in_create_ticket_success_r
377380
use_case_uuid=use_case.uuid,
378381
created_at=dt.datetime.utcnow(),
379382
flow=flow,
383+
published_at=None,
380384
),
381385
)
382386
mock_repository.set_are_all_variables_declared_on_instance_return_value(

tests/factories/use_case_version_factory.py

+3
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@ class Meta:
2424
created_at = factory.LazyFunction(dt.datetime.utcnow)
2525
use_case = factory.SubFactory(UseCaseFactory)
2626
flow = factory.LazyFunction(make_flow)
27+
published_at = None
2728

2829
@factory.post_generation
2930
def is_production_version(self, create, extracted, **kwargs):
3031
if not extracted:
3132
return
3233

34+
if self.published_at is None:
35+
self.published_at = dt.datetime.utcnow()
3336
self.use_case.production_version = self
3437
if create:
3538
common.test_session.commit()

use_case_executor/adapters/database_repository/models/use_case.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def has_pending_changes(self) -> bool:
5959
def get_last_published_date(self) -> Optional[str]:
6060
if self.production_version is None:
6161
return None
62-
return utils.add_utc_tz(date_time=self.production_version.created_at)
62+
return utils.add_utc_tz(date_time=self.production_version.published_at)
6363

6464
def get_latest_version_date(self) -> Optional[str]:
6565
latest_version = self.get_latest_version()

use_case_executor/adapters/database_repository/models/use_case_version.py

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class UseCaseVersion(Base):
2222
)
2323
created_at = sa.Column(sa.DateTime, nullable=False, server_default=func.now())
2424
flow = sa.Column(JSONB(none_as_null=True), nullable=False)
25+
published_at = sa.Column(sa.DateTime, nullable=True)
2526

2627
use_case = relationship("UseCase", foreign_keys=[use_case_uuid])
2728

@@ -31,4 +32,5 @@ def to_domain_object(self) -> DomainUseCaseVersion:
3132
use_case_uuid=self.use_case_uuid,
3233
created_at=self.created_at,
3334
flow=facade.validate_flow(flow_dict=self.flow),
35+
published_at=self.published_at,
3436
)

use_case_executor/api/namespaces/use_cases/flows.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime as dt
12
from enum import Enum
23
from typing import Optional
34

@@ -221,6 +222,7 @@ def _create_use_case_flow(use_case: UseCase, use_case_version: UseCaseVersion) -
221222
def _update_use_case_production_version(
222223
use_case: UseCase, production_version: UseCaseVersion
223224
) -> None:
225+
production_version.published_at = dt.datetime.utcnow()
224226
use_case.production_version = production_version
225227

226228

use_case_executor/domain/use_case/use_case_version.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import dataclasses
22
import datetime as dt
3+
from typing import Optional
34
from uuid import UUID
45

56
from use_case_executor.domain.flow.flow import Flow
@@ -11,3 +12,4 @@ class UseCaseVersion:
1112
use_case_uuid: UUID
1213
created_at: dt.datetime
1314
flow: Flow
15+
published_at: Optional[dt.datetime]

0 commit comments

Comments
 (0)