|
1 | 1 | import pytest |
| 2 | +from django.utils import timezone |
2 | 3 |
|
3 | 4 | from audit.constants import ( |
4 | 5 | RELEASE_PIPELINE_CREATED_MESSAGE, |
5 | 6 | RELEASE_PIPELINE_DELETED_MESSAGE, |
6 | | - RELEASE_PIPELINE_PUBLISHED_MESSAGE, |
7 | 7 | ) |
8 | | -from audit.models import AuditLog |
9 | | -from audit.related_object_type import RelatedObjectType |
10 | 8 | from environments.models import Environment |
| 9 | +from features.models import Feature |
11 | 10 | from features.release_pipelines.core.exceptions import InvalidPipelineStateError |
12 | 11 | from features.release_pipelines.core.models import ( |
13 | 12 | PipelineStage, |
14 | 13 | ReleasePipeline, |
15 | 14 | ) |
| 15 | +from features.versioning.models import EnvironmentFeatureVersion |
16 | 16 | from users.models import FFAdminUser |
17 | 17 |
|
18 | 18 |
|
19 | | -def test_release_pipeline_publish_creates_audit_log( |
20 | | - release_pipeline: ReleasePipeline, admin_user: FFAdminUser |
21 | | -) -> None: |
22 | | - # When |
23 | | - release_pipeline.publish(admin_user) |
24 | | - |
25 | | - # Then |
26 | | - assert ( |
27 | | - AuditLog.objects.filter( |
28 | | - related_object_id=release_pipeline.id, |
29 | | - related_object_type=RelatedObjectType.RELEASE_PIPELINE.name, |
30 | | - project=release_pipeline.project, |
31 | | - log=RELEASE_PIPELINE_PUBLISHED_MESSAGE % release_pipeline.name, |
32 | | - author=admin_user, |
33 | | - ).exists() |
34 | | - is True |
35 | | - ) |
36 | | - |
37 | | - |
38 | 19 | def test_release_pipeline_publish_raises_error_if_pipeline_is_already_published( |
39 | 20 | release_pipeline: ReleasePipeline, admin_user: FFAdminUser |
40 | 21 | ) -> None: |
@@ -153,3 +134,52 @@ def test_release_pipeline_get_delete_log_message( |
153 | 134 |
|
154 | 135 | # Then |
155 | 136 | assert release_pipeline.get_delete_log_message(release_pipeline) == expected_message |
| 137 | + |
| 138 | + |
| 139 | +def test_release_pipeline_unpublish( |
| 140 | + release_pipeline: ReleasePipeline, admin_user: FFAdminUser |
| 141 | +) -> None: |
| 142 | + # Given - the pipeline is already published |
| 143 | + release_pipeline.publish(admin_user) |
| 144 | + |
| 145 | + # When |
| 146 | + release_pipeline.unpublish(admin_user) |
| 147 | + |
| 148 | + # Then |
| 149 | + assert release_pipeline.published_at is None |
| 150 | + assert release_pipeline.published_by is None |
| 151 | + |
| 152 | + |
| 153 | +def test_should_raise_error_when_unpublishing_unpublished_pipeline( |
| 154 | + release_pipeline: ReleasePipeline, admin_user: FFAdminUser |
| 155 | +) -> None: |
| 156 | + # When/ Then |
| 157 | + with pytest.raises(InvalidPipelineStateError, match="Pipeline is not published."): |
| 158 | + release_pipeline.unpublish(admin_user) |
| 159 | + |
| 160 | + |
| 161 | +def test_release_pipeline_has_feature_in_flight( |
| 162 | + release_pipeline: ReleasePipeline, |
| 163 | + environment: Environment, |
| 164 | + pipeline_stage_enable_feature_on_enter: PipelineStage, |
| 165 | + admin_user: FFAdminUser, |
| 166 | + feature: Feature, |
| 167 | +) -> None: |
| 168 | + # Given an unpublished environment feature version |
| 169 | + environment_version = EnvironmentFeatureVersion.objects.create( |
| 170 | + feature=feature, |
| 171 | + environment=environment, |
| 172 | + pipeline_stage=pipeline_stage_enable_feature_on_enter, |
| 173 | + published_at=None, |
| 174 | + ) |
| 175 | + |
| 176 | + # Then |
| 177 | + assert release_pipeline.has_feature_in_flight() is True |
| 178 | + |
| 179 | + # Next, publish the environment feature version |
| 180 | + environment_version.published_at = timezone.now() |
| 181 | + environment_version.published_by = admin_user |
| 182 | + environment_version.save() |
| 183 | + |
| 184 | + # Then |
| 185 | + assert release_pipeline.has_feature_in_flight() is False |
0 commit comments