Skip to content

Commit

Permalink
Refactor repository to not create blank credentials. Remove commit op…
Browse files Browse the repository at this point in the history
…tion in favor of ref option to match API and allow setting the ref on CTL.
  • Loading branch information
FragmentedPacket committed Jan 18, 2025
1 parent dbbe385 commit 9012b62
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 21 deletions.
28 changes: 20 additions & 8 deletions infrahub_sdk/ctl/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ def get_repository_config(repo_config_file: Path) -> InfrahubRepositoryConfig:
try:
data = InfrahubRepositoryConfig(**config_file_data)
except ValidationError as exc:
console.print(f"[red]Repository config file not valid, found {len(exc.errors())} error(s)")
console.print(
f"[red]Repository config file not valid, found {len(exc.errors())} error(s)"
)
for error in exc.errors():
loc_str = [str(item) for item in error["loc"]]
console.print(f" {'/'.join(loc_str)} | {error['msg']} ({error['type']})")
Expand Down Expand Up @@ -70,7 +72,7 @@ async def add(
description: str = "",
username: str | None = None,
password: str = "",
commit: str = "",
ref: str = "",
read_only: bool = False,
debug: bool = False,
branch: str = typer.Option("main", help="Branch on which to add the repository."),
Expand All @@ -85,20 +87,30 @@ async def add(
"name": {"value": name},
"location": {"value": location},
"description": {"value": description},
"commit": {"value": commit},
"ref": {"value": ref},
},
}

client = initialize_client()

credential = await client.create(kind="CorePasswordCredential", name=name, username=username, password=password)
await credential.save(allow_upsert=True)
input_data["data"]["credential"] = {"id": credential.id}
if username or password:
credential = await client.create(
kind="CorePasswordCredential",
name=name,
username=username,
password=password,
)
await credential.save(allow_upsert=True)
input_data["data"]["credential"] = {"id": credential.id}

query = Mutation(
mutation="CoreReadOnlyRepositoryCreate" if read_only else "CoreRepositoryCreate",
mutation="CoreReadOnlyRepositoryCreate"
if read_only
else "CoreRepositoryCreate",
input_data=input_data,
query={"ok": None},
)

await client.execute_graphql(query=query.render(), branch_name=branch, tracker="mutation-repository-create")
await client.execute_graphql(
query=query.render(), branch_name=branch, tracker="mutation-repository-create"
)
78 changes: 65 additions & 13 deletions tests/unit/ctl/test_repository_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@

runner = CliRunner()

requires_python_310 = pytest.mark.skipif(sys.version_info < (3, 10), reason="Requires Python 3.10 or higher")
requires_python_310 = pytest.mark.skipif(
sys.version_info < (3, 10), reason="Requires Python 3.10 or higher"
)


@pytest.fixture
Expand All @@ -28,6 +30,54 @@ def mock_client() -> mock.Mock:
class TestInfrahubctlRepository:
"""Groups the 'infrahubctl repository' test cases."""

@requires_python_310
def test_repo_no_username_or_password(self, mock_init_client, mock_client) -> None:
"""Case allow no username to be passed in and set it as None rather than blank string that fails."""
mock_cred = mock.AsyncMock()
mock_cred.id = "1234"
mock_client.create.return_value = mock_cred

mock_init_client.return_value = mock_client
output = runner.invoke(
app,
[
"repository",
"add",
"Gitlab",
"https://gitlab.com/opsmill/example-repo.git",
],
)
assert output.exit_code == 0
mock_client.create.assert_not_called()
mock_cred.save.assert_not_called()
mock_client.execute_graphql.assert_called_once()
mock_client.execute_graphql.assert_called_with(
query="""
mutation {
CoreRepositoryCreate(
data: {
name: {
value: "Gitlab"
}
location: {
value: "https://gitlab.com/opsmill/example-repo.git"
}
description: {
value: ""
}
ref: {
value: ""
}
}
){
ok
}
}
""",
branch_name="main",
tracker="mutation-repository-create",
)

@requires_python_310
def test_repo_no_username(self, mock_init_client, mock_client) -> None:
"""Case allow no username to be passed in and set it as None rather than blank string that fails."""
Expand Down Expand Up @@ -72,7 +122,7 @@ def test_repo_no_username(self, mock_init_client, mock_client) -> None:
description: {
value: ""
}
commit: {
ref: {
value: ""
}
credential: {
Expand Down Expand Up @@ -134,7 +184,7 @@ def test_repo_username(self, mock_init_client, mock_client) -> None:
description: {
value: ""
}
commit: {
ref: {
value: ""
}
credential: {
Expand Down Expand Up @@ -164,7 +214,7 @@ def test_repo_readonly_true(self, mock_init_client, mock_client) -> None:
"repository",
"add",
"Gitlab",
"https://gitlab.com/FragmentedPacket/nautobot-plugin-ansible-filters.git",
"https://gitlab.com/opsmill/example-repo.git",
"--password",
"mySup3rSecureP@ssw0rd",
"--read-only",
Expand All @@ -190,12 +240,12 @@ def test_repo_readonly_true(self, mock_init_client, mock_client) -> None:
value: "Gitlab"
}
location: {
value: "https://gitlab.com/FragmentedPacket/nautobot-plugin-ansible-filters.git"
value: "https://gitlab.com/opsmill/example-repo.git"
}
description: {
value: ""
}
commit: {
ref: {
value: ""
}
credential: {
Expand All @@ -212,7 +262,9 @@ def test_repo_readonly_true(self, mock_init_client, mock_client) -> None:
)

@requires_python_310
def test_repo_description_commit_branch(self, mock_init_client, mock_client) -> None:
def test_repo_description_commit_branch(
self, mock_init_client, mock_client
) -> None:
"""Case allow no username to be passed in and set it as None rather than blank string that fails."""
mock_cred = mock.AsyncMock()
mock_cred.id = "1234"
Expand All @@ -225,15 +277,15 @@ def test_repo_description_commit_branch(self, mock_init_client, mock_client) ->
"repository",
"add",
"Gitlab",
"https://gitlab.com/FragmentedPacket/nautobot-plugin-ansible-filters.git",
"https://gitlab.com/opsmill/example-repo.git",
"--password",
"mySup3rSecureP@ssw0rd",
"--username",
"opsmill",
"--description",
"This is a test description",
"--commit",
"myHashCommit",
"--ref",
"my-custom-branch",
"--branch",
"develop",
],
Expand All @@ -258,13 +310,13 @@ def test_repo_description_commit_branch(self, mock_init_client, mock_client) ->
value: "Gitlab"
}
location: {
value: "https://gitlab.com/FragmentedPacket/nautobot-plugin-ansible-filters.git"
value: "https://gitlab.com/opsmill/example-repo.git"
}
description: {
value: "This is a test description"
}
commit: {
value: "myHashCommit"
ref: {
value: "my-custom-branch"
}
credential: {
id: "1234"
Expand Down

0 comments on commit 9012b62

Please sign in to comment.