Skip to content

Commit

Permalink
test(api): add tests for variables API
Browse files Browse the repository at this point in the history
  • Loading branch information
nejch committed Aug 31, 2020
1 parent 4492fc4 commit 66d108d
Show file tree
Hide file tree
Showing 7 changed files with 288 additions and 41 deletions.
193 changes: 193 additions & 0 deletions gitlab/tests/objects/test_variables.py
@@ -0,0 +1,193 @@
"""
GitLab API:
https://docs.gitlab.com/ee/api/instance_level_ci_variables.html
https://docs.gitlab.com/ee/api/project_level_variables.html
https://docs.gitlab.com/ee/api/group_level_variables.html
"""

import re

import pytest
import responses

from gitlab.v4.objects import GroupVariable, ProjectVariable, Variable


key = "TEST_VARIABLE_1"
value = "TEST_1"
new_value = "TEST_2"

variable_content = {
"key": key,
"variable_type": "env_var",
"value": value,
"protected": False,
"masked": True,
}
variables_url = re.compile(
r"http://localhost/api/v4/(((groups|projects)/1)|(admin/ci))/variables"
)
variables_key_url = re.compile(
rf"http://localhost/api/v4/(((groups|projects)/1)|(admin/ci))/variables/{key}"
)


@pytest.fixture
def resp_list_variables():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url=variables_url,
json=[variable_content],
content_type="application/json",
status=200,
)
yield rsps


@pytest.fixture
def resp_get_variable():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url=variables_key_url,
json=variable_content,
content_type="application/json",
status=200,
)
yield rsps


@pytest.fixture
def resp_create_variable():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.POST,
url=variables_url,
json=variable_content,
content_type="application/json",
status=200,
)
yield rsps


@pytest.fixture
def resp_update_variable():
updated_content = dict(variable_content)
updated_content["value"] = new_value

with responses.RequestsMock() as rsps:
rsps.add(
method=responses.PUT,
url=variables_key_url,
json=updated_content,
content_type="application/json",
status=200,
)
yield rsps


@pytest.fixture
def resp_delete_variable(no_content):
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.DELETE,
url=variables_key_url,
json=no_content,
content_type="application/json",
status=204,
)
yield rsps


def test_list_instance_variables(gl, resp_list_variables):
variables = gl.variables.list()
assert isinstance(variables, list)
assert isinstance(variables[0], Variable)
assert variables[0].value == value


def test_get_instance_variable(gl, resp_get_variable):
variable = gl.variables.get(key)
assert isinstance(variable, Variable)
assert variable.value == value


def test_create_instance_variable(gl, resp_create_variable):
variable = gl.variables.create({"key": key, "value": value})
assert isinstance(variable, Variable)
assert variable.value == value


def test_update_instance_variable(gl, resp_update_variable):
variable = gl.variables.get(key, lazy=True)
variable.value = new_value
variable.save()
assert variable.value == new_value


def test_delete_instance_variable(gl, resp_delete_variable):
variable = gl.variables.get(key, lazy=True)
variable.delete()


def test_list_project_variables(project, resp_list_variables):
variables = project.variables.list()
assert isinstance(variables, list)
assert isinstance(variables[0], ProjectVariable)
assert variables[0].value == value


def test_get_project_variable(project, resp_get_variable):
variable = project.variables.get(key)
assert isinstance(variable, ProjectVariable)
assert variable.value == value


def test_create_project_variable(project, resp_create_variable):
variable = project.variables.create({"key": key, "value": value})
assert isinstance(variable, ProjectVariable)
assert variable.value == value


def test_update_project_variable(project, resp_update_variable):
variable = project.variables.get(key, lazy=True)
variable.value = new_value
variable.save()
assert variable.value == new_value


def test_delete_project_variable(project, resp_delete_variable):
variable = project.variables.get(key, lazy=True)
variable.delete()


def test_list_group_variables(group, resp_list_variables):
variables = group.variables.list()
assert isinstance(variables, list)
assert isinstance(variables[0], GroupVariable)
assert variables[0].value == value


def test_get_group_variable(group, resp_get_variable):
variable = group.variables.get(key)
assert isinstance(variable, GroupVariable)
assert variable.value == value


def test_create_group_variable(group, resp_create_variable):
variable = group.variables.create({"key": key, "value": value})
assert isinstance(variable, GroupVariable)
assert variable.value == value


def test_update_group_variable(group, resp_update_variable):
variable = group.variables.get(key, lazy=True)
variable.value = new_value
variable.save()
assert variable.value == new_value


def test_delete_group_variable(group, resp_delete_variable):
variable = group.variables.get(key, lazy=True)
variable.delete()
48 changes: 48 additions & 0 deletions tools/functional/api/test_variables.py
@@ -0,0 +1,48 @@
"""
GitLab API:
https://docs.gitlab.com/ee/api/instance_level_ci_variables.html
https://docs.gitlab.com/ee/api/project_level_variables.html
https://docs.gitlab.com/ee/api/group_level_variables.html
"""


def test_instance_variables(gl):
variable = gl.variables.create({"key": "key1", "value": "value1"})
assert variable.value == "value1"
assert len(gl.variables.list()) == 1

variable.value = "new_value1"
variable.save()
variable = gl.variables.get(variable.key)
assert variable.value == "new_value1"

variable.delete()
assert len(gl.variables.list()) == 0


def test_group_variables(group):
variable = group.variables.create({"key": "key1", "value": "value1"})
assert variable.value == "value1"
assert len(group.variables.list()) == 1

variable.value = "new_value1"
variable.save()
variable = group.variables.get(variable.key)
assert variable.value == "new_value1"

variable.delete()
assert len(group.variables.list()) == 0


def test_project_variables(project):
variable = project.variables.create({"key": "key1", "value": "value1"})
assert variable.value == "value1"
assert len(project.variables.list()) == 1

variable.value = "new_value1"
variable.save()
variable = project.variables.get(variable.key)
assert variable.value == "new_value1"

variable.delete()
assert len(project.variables.list()) == 0
21 changes: 21 additions & 0 deletions tools/functional/cli/conftest.py
@@ -0,0 +1,21 @@
import pytest


@pytest.fixture
def gitlab_cli(script_runner, CONFIG):
"""Wrapper fixture to help make test cases less verbose."""

def _gitlab_cli(subcommands):
"""
Return a script_runner.run method that takes a default gitlab
command, and subcommands passed as arguments inside test cases.
"""
command = ["gitlab", "--config-file", CONFIG]

for subcommand in subcommands:
# ensure we get strings (e.g from IDs)
command.append(str(subcommand))

return script_runner.run(*command)

return _gitlab_cli
19 changes: 19 additions & 0 deletions tools/functional/cli/test_cli_variables.py
@@ -0,0 +1,19 @@
def test_list_instance_variables(gitlab_cli, gl):
cmd = ["variable", "list"]
ret = gitlab_cli(cmd)

assert ret.success


def test_list_group_variables(gitlab_cli, group):
cmd = ["group-variable", "list", "--group-id", group.id]
ret = gitlab_cli(cmd)

assert ret.success


def test_list_project_variables(gitlab_cli, project):
cmd = ["project-variable", "list", "--project-id", project.id]
ret = gitlab_cli(cmd)

assert ret.success
27 changes: 6 additions & 21 deletions tools/functional/conftest.py
@@ -1,10 +1,15 @@
import os
import tempfile
from random import randint

import pytest

import gitlab


TEMP_DIR = tempfile.gettempdir()


def random_id():
"""
Helper to ensure new resource creation does not clash with
Expand All @@ -17,27 +22,7 @@ def random_id():

@pytest.fixture(scope="session")
def CONFIG():
return "/tmp/python-gitlab.cfg"


@pytest.fixture
def gitlab_cli(script_runner, CONFIG):
"""Wrapper fixture to help make test cases less verbose."""

def _gitlab_cli(subcommands):
"""
Return a script_runner.run method that takes a default gitlab
command, and subcommands passed as arguments inside test cases.
"""
command = ["gitlab", "--config-file", CONFIG]

for subcommand in subcommands:
# ensure we get strings (e.g from IDs)
command.append(str(subcommand))

return script_runner.run(*command)

return _gitlab_cli
return os.path.join(TEMP_DIR, "python-gitlab.cfg")


@pytest.fixture(scope="session")
Expand Down
2 changes: 1 addition & 1 deletion tools/functional_tests.sh
Expand Up @@ -18,4 +18,4 @@ setenv_script=$(dirname "$0")/build_test_env.sh || exit 1
BUILD_TEST_ENV_AUTO_CLEANUP=true
. "$setenv_script" "$@" || exit 1

pytest "$(dirname "$0")/functional/cli"
pytest --script-launch-mode=subprocess "$(dirname "$0")/functional/cli"
19 changes: 0 additions & 19 deletions tools/python_test_v4.py
Expand Up @@ -367,17 +367,6 @@
assert len(gm1.issues()) == 0
assert len(gm1.merge_requests()) == 0

# group variables
group1.variables.create({"key": "foo", "value": "bar"})
g_v = group1.variables.get("foo")
assert g_v.value == "bar"
g_v.value = "baz"
g_v.save()
g_v = group1.variables.get("foo")
assert g_v.value == "baz"
assert len(group1.variables.list()) == 1
g_v.delete()
assert len(group1.variables.list()) == 0

# group labels
# group1.labels.create({"name": "foo", "description": "bar", "color": "#112233"})
Expand Down Expand Up @@ -856,14 +845,6 @@
assert len(admin_project.triggers.list()) == 1
tr1.delete()

# variables
v1 = admin_project.variables.create({"key": "key1", "value": "value1"})
assert len(admin_project.variables.list()) == 1
v1.value = "new_value1"
v1.save()
v1 = admin_project.variables.get(v1.key)
assert v1.value == "new_value1"
v1.delete()

# branches and merges
to_merge = admin_project.branches.create({"branch": "branch1", "ref": "master"})
Expand Down

0 comments on commit 66d108d

Please sign in to comment.