diff --git a/integration-tests/variable_write_test.go b/integration-tests/variable_write_test.go index faf469d1..c6c9f6ea 100644 --- a/integration-tests/variable_write_test.go +++ b/integration-tests/variable_write_test.go @@ -98,6 +98,31 @@ func TestVariableCreate(t *testing.T) { assertTrimmed(t, "false", f.Run("var:get", "-p", p, "env:TEST", "-l", "p", "-P", "visible_runtime")) } +func TestVariableCreateUpdateWithLevel(t *testing.T) { + // Regression test: var:create --update must forward --level to var:update + // when the variable exists at both levels. + s := setupVariableTest(t) + s.apiHandler.SetEnvironments([]*mockapi.Environment{s.mainEnv}) + + f, p := s.factory, s.projectID + + f.Run("var:create", "-p", p, "-l", "p", "env:FOO", "--value", "project-value") + f.Run("var:create", "-p", p, "-e", "main", "-l", "e", "env:FOO", "--value", "env-value") + + _, stdErr, err := f.RunCombinedOutput("var:create", "-p", p, "-e", "main", "-u", "-l", "e", + "--name", "env:FOO", "--value", "env-value2") + assert.NoError(t, err) + assert.NotContains(t, stdErr, "Variable found at both project and environment levels") + + _, stdErr, err = f.RunCombinedOutput("var:create", "-p", p, "-e", "main", "-u", "-l", "p", + "--name", "env:FOO", "--value", "project-value2") + assert.NoError(t, err) + assert.NotContains(t, stdErr, "Variable found at both project and environment levels") + + assertTrimmed(t, "env-value2", f.Run("var:get", "-p", p, "-e", "main", "env:FOO", "-l", "e", "-P", "value")) + assertTrimmed(t, "project-value2", f.Run("var:get", "-p", p, "-e", "main", "env:FOO", "-l", "p", "-P", "value")) +} + func TestVariableCreateDefaultEnvironment(t *testing.T) { // Regression test for CLI-164: using "-e ." (the default-environment code) // must not fail form validation of the --environment option. diff --git a/legacy/src/Command/Variable/VariableCreateCommand.php b/legacy/src/Command/Variable/VariableCreateCommand.php index 7be070ca..82d238ad 100644 --- a/legacy/src/Command/Variable/VariableCreateCommand.php +++ b/legacy/src/Command/Variable/VariableCreateCommand.php @@ -89,7 +89,8 @@ protected function execute(InputInterface $input, OutputInterface $output): int if (($prefix = Option::stringOrNull($input, 'prefix')) && $prefix !== 'none') { $name = rtrim($prefix, ':') . ':' . $name; } - $existing = $this->variableCommandUtil->getExistingVariable($name, $selection, $this->variableCommandUtil->getRequestedLevel($input), false); + $level = $this->variableCommandUtil->getRequestedLevel($input); + $existing = $this->variableCommandUtil->getExistingVariable($name, $selection, $level, false); if ($existing) { if (!Option::bool($input, 'update')) { $this->stdErr->writeln('The variable already exists: ' . $name . ''); @@ -115,6 +116,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($selection->hasEnvironment()) { $arguments['--environment'] = $selection->getEnvironment()->id; } + if ($level !== null) { + $arguments['--level'] = $level; + } foreach ($this->form->getFields() as $field) { $argName = '--' . $field->getOptionName(); $value = $field->getValueFromInput($input, false);