Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("feature_external_resources", "0003_add_gitlab_resource_types"),
]

operations = [
migrations.AlterField(
model_name="featureexternalresource",
name="type",
field=models.CharField(
choices=[
("GITHUB_ISSUE", "GitHub Issue"),
("GITHUB_PR", "GitHub PR"),
("GITLAB_ISSUE", "GitLab Issue"),
("GITLAB_MR", "GitLab MR"),
("AZURE_DEVOPS_PULL_REQUEST", "Azure DevOps Pull Request"),
("AZURE_DEVOPS_WORK_ITEM", "Azure DevOps Work Item"),
],
max_length=30,
),
),
]
12 changes: 11 additions & 1 deletion api/features/feature_external_resources/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,23 @@ class ResourceType(models.TextChoices):
GITLAB_ISSUE = "GITLAB_ISSUE", "GitLab Issue"
GITLAB_MR = "GITLAB_MR", "GitLab MR"

# Azure DevOps external resource types
AZURE_DEVOPS_PULL_REQUEST = "AZURE_DEVOPS_PULL_REQUEST", "Azure DevOps Pull Request"
AZURE_DEVOPS_WORK_ITEM = "AZURE_DEVOPS_WORK_ITEM", "Azure DevOps Work Item"


GITLAB_RESOURCE_TYPES: tuple[ResourceType, ...] = (
ResourceType.GITLAB_ISSUE,
ResourceType.GITLAB_MR,
)


AZURE_DEVOPS_RESOURCE_TYPES: tuple[ResourceType, ...] = (
ResourceType.AZURE_DEVOPS_PULL_REQUEST,
ResourceType.AZURE_DEVOPS_WORK_ITEM,
)


tag_by_type_and_state = {
ResourceType.GITHUB_ISSUE.value: {
"open": GitHubTag.ISSUE_OPEN.value,
Expand All @@ -54,7 +64,7 @@ class ResourceType(models.TextChoices):

class FeatureExternalResource(LifecycleModelMixin, models.Model): # type: ignore[misc]
url = models.URLField()
type = models.CharField(max_length=20, choices=ResourceType.choices)
type = models.CharField(max_length=30, choices=ResourceType.choices)

# JSON filed containing any metadata related to the external resource
metadata = models.TextField(null=True)
Expand Down
27 changes: 27 additions & 0 deletions api/projects/tags/migrations/0010_add_azure_devops_tag_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("tags", "0009_add_gitlab_tag_type"),
]

operations = [
migrations.AlterField(
model_name="tag",
name="type",
field=models.CharField(
choices=[
("NONE", "None"),
("STALE", "Stale"),
("GITHUB", "Github"),
("UNHEALTHY", "Unhealthy"),
("GITLAB", "Gitlab"),
("AZURE_DEVOPS", "Azure Devops"),
],
default="NONE",
help_text="Field used to provide a consistent identifier for the FE and API to use for business logic.",
max_length=100,
),
),
]
1 change: 1 addition & 0 deletions api/projects/tags/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class TagType(models.Choices):
GITHUB = "GITHUB"
UNHEALTHY = "UNHEALTHY"
GITLAB = "GITLAB"
AZURE_DEVOPS = "AZURE_DEVOPS"


class Tag(AbstractBaseExportableModel):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
from features.feature_external_resources.models import (
AZURE_DEVOPS_RESOURCE_TYPES,
GITLAB_RESOURCE_TYPES,
ResourceType,
)


def test_resource_type__azure_devops_pull_request__has_value_and_label() -> None:
# Given
member = ResourceType.AZURE_DEVOPS_PULL_REQUEST

# When
value = member.value
label = member.label

# Then
assert value == "AZURE_DEVOPS_PULL_REQUEST"
assert label == "Azure DevOps Pull Request"


def test_resource_type__azure_devops_work_item__has_value_and_label() -> None:
# Given
member = ResourceType.AZURE_DEVOPS_WORK_ITEM

# When
value = member.value
label = member.label

# Then
assert value == "AZURE_DEVOPS_WORK_ITEM"
assert label == "Azure DevOps Work Item"


def test_azure_devops_resource_types__contains_pull_request_and_work_item__matches_expected_set() -> (
None
):
# Given
tuple_under_test = AZURE_DEVOPS_RESOURCE_TYPES

# When
members = set(tuple_under_test)

# Then
assert members == {
ResourceType.AZURE_DEVOPS_PULL_REQUEST,
ResourceType.AZURE_DEVOPS_WORK_ITEM,
}


def test_resource_type_groupings__azure_devops_and_gitlab__are_disjoint() -> None:
# Given
azure_devops_members = set(AZURE_DEVOPS_RESOURCE_TYPES)
gitlab_members = set(GITLAB_RESOURCE_TYPES)

# When
overlap = azure_devops_members & gitlab_members

# Then
assert overlap == set()


def test_resource_type_field__choices__include_azure_devops_values() -> None:
# Given
from features.feature_external_resources.models import FeatureExternalResource

# When
field = FeatureExternalResource._meta.get_field("type")
assert field.choices is not None
choice_values = {value for value, _label in field.choices}

# Then
assert "AZURE_DEVOPS_PULL_REQUEST" in choice_values
assert "AZURE_DEVOPS_WORK_ITEM" in choice_values
37 changes: 37 additions & 0 deletions api/tests/unit/projects/tags/test_unit_projects_tags_models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from projects.tags.models import TagType


def test_tag_type__azure_devops__has_value() -> None:
# Given
tag_type = TagType.AZURE_DEVOPS

# When
value = tag_type.value

# Then
assert value == "AZURE_DEVOPS"


def test_tag_type__members__include_existing_and_azure() -> None:
# Given
tag_types = TagType

# When
values = {member.value for member in tag_types}

# Then
assert values == {"NONE", "STALE", "GITHUB", "UNHEALTHY", "GITLAB", "AZURE_DEVOPS"}


def test_tag_type_field__choices__include_azure_devops() -> None:
# Given
from projects.tags.models import Tag

field = Tag._meta.get_field("type")
assert field.choices is not None # type narrowing for mypy strict

# When
choice_values = {value for value, _label in field.choices}

# Then
assert "AZURE_DEVOPS" in choice_values
Loading
Loading