kubectx
The atago project wrote these specs on its own initiative and runs them in its own CI, to exercise atago against a real program. They are not kubectx’s official test suite, and the kubectx project is not affiliated with atago.
Summary #
2 suites · 31 scenarios
Contents #
- kubectx (third-party CLI, kubeconfig state machine) — 18 scenarios
- usage is printed for –help and -h
- listing without a kubeconfig warns on stderr and still succeeds
- one context is listed and listing changes nothing
- both contexts are listed, one per line
- switching writes the choice into the kubeconfig and reports it on stderr
- the dash toggles between the last two contexts
- the dash fails when no previous context was recorded
- an unknown context name fails and leaves the kubeconfig untouched
- –current fails while no context is selected
- renaming replaces the old name in the listing
- a dot renames the current context
- deleting a context removes it from the listing
- a dot deletes the current context
- deleting an unknown context fails and keeps the file intact
- several contexts are deleted in one call
- a batch delete naming one unknown context fails after deleting the rest
- unsetting clears the selection
- the interactive picker selects a context by typed query
- kubens (third-party CLI, namespace state machine) — 13 scenarios
- usage is printed for –help and -h
- listing without a kubeconfig fails
- the namespaces of the current context are listed
- switching writes the namespace into the current context
- an unknown namespace is refused and changes nothing
- –force accepts a namespace the cluster does not have
- the dash toggles between the last two namespaces
- the dash fails when this context has no previous namespace
- the dash fails when no context is selected
- –current reports default before any namespace is chosen
- –current reports the namespace after it is set
- –current fails when no context is selected
- unsetting returns the context to the default namespace
kubectx (third-party CLI, kubeconfig state machine) #
kubectx switches the active kubectl
context. It is a small program with a large contract: it rewrites the
kubeconfig in place, remembers the previous context in a file under the
user’s home so that kubectx - can toggle, splits machine-readable output
(context names) from human status lines, and answers with exit 1 for every
mistake a user can make with a context name.
kubectx keeps its own test suite in Bats, and every one of those tests is reproduced here, so the two can be compared. The scenarios then go past what a Bats suite observes: which stream each line went to, what the kubeconfig on disk looks like afterwards, that a failed command leaves it untouched, that the previous-context state lands under the isolated home rather than the real one, and what the interactive picker does when a terminal is attached.
No cluster is contacted. Every kubeconfig here is a throwaway fixture written in the scenario workdir, naming servers that are never dialed.
Source: test/e2e/thirdparty/kubectx/kubectx.atago.yaml
Scenario: usage is printed for –help and -h #
only when kubectx --help succeeds
Given #
- Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
When #
kubectx --help
kubectx -h
Then #
- after
kubectx --help:- exit code is
0 - stdout contains
USAGE:,kubectx <NEW_NAME>=<NAME>
- exit code is
- after
kubectx -h:- exit code is
0 - stdout contains
USAGE:
- exit code is
Scenario: listing without a kubeconfig warns on stderr and still succeeds #
only when kubectx --help succeeds
Given #
- Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
When #
kubectx
Then #
- exit code is
0 - stdout is empty
- stderr equals an exact value
- file
configdoes not exist
Expected output #
expected stderr:
warning: kubeconfig file not found
Scenario: one context is listed and listing changes nothing #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: ""
When #
kubectx
Then #
- exit code is
0 - stdout equals an exact value
- stderr is empty
- the step changed exactly created nothing, modified nothing, deleted nothing, ignoring
.atago-home/**
Expected output #
expected stdout:
user1@cluster1
Scenario: both contexts are listed, one per line #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx
Then #
- exit code is
0 - stdout equals an exact value
Expected output #
expected stdout:
user1@cluster1
user2@cluster1
Scenario: switching writes the choice into the kubeconfig and reports it on stderr #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx user1@cluster1
kubectx user2@cluster1
kubectx -c
kubectx --current
Then #
- after
kubectx user1@cluster1:- exit code is
0 - stdout is empty
- stderr contains
Switched to context "user1@cluster1". - file
configcontainscurrent-context: "user1@cluster1"
- exit code is
- after
kubectx user2@cluster1:- exit code is
0 - file
configcontainscurrent-context: "user2@cluster1"
- exit code is
- after
kubectx -c:- exit code is
0 - stdout equals an exact value
- exit code is
- after
kubectx --current:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
user2@cluster1
expected stdout:
user2@cluster1
Scenario: the dash toggles between the last two contexts #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx user1@cluster1
kubectx user2@cluster1
kubectx -
kubectx --current
kubectx -
kubectx --current
Then #
- after
kubectx user1@cluster1:- exit code is
0
- exit code is
- after
kubectx user2@cluster1:- exit code is
0 - file
.atago-home/.cache/kubectxequals exact bytes
- exit code is
- after
kubectx -:- exit code is
0 - stderr contains
Switched to context "user1@cluster1".
- exit code is
- after
kubectx --current:- exit code is
0 - stdout equals an exact value
- exit code is
- after
kubectx -:- exit code is
0
- exit code is
- after
kubectx --current:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
user1@cluster1
expected stdout:
user2@cluster1
Scenario: the dash fails when no previous context was recorded #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: ""
When #
kubectx -
Then #
- exit code is
1 - stdout is empty
- stderr contains
no previous context found - the step changed exactly created nothing, modified nothing, deleted nothing, ignoring
.atago-home/**
Scenario: an unknown context name fails and leaves the kubeconfig untouched #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: ""
When #
kubectx unknown-context
Then #
- exit code is
1 - stdout is empty
- stderr contains
no context exists with the name: "unknown-context" - the step changed exactly created nothing, modified nothing, deleted nothing, ignoring
.atago-home/**
Scenario: –current fails while no context is selected #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: ""
When #
kubectx -c
kubectx --current
Then #
- after
kubectx -c:- exit code is
1 - stdout is empty
- stderr contains
current-context is not set
- exit code is
- after
kubectx --current:- exit code is
1
- exit code is
Scenario: renaming replaces the old name in the listing #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx new-context=user1@cluster1
kubectx
Then #
- after
kubectx new-context=user1@cluster1:- exit code is
0 - stderr contains
Context user1@cluster1 renamed to new-context.
- exit code is
- after
kubectx:- exit code is
0 - stdout equals an exact value
- file
configdoes not containuser1@cluster1
- exit code is
Expected output #
expected stdout:
new-context
user2@cluster1
Scenario: a dot renames the current context #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx user2@cluster1
kubectx new-context=.
kubectx
kubectx --current
Then #
- after
kubectx user2@cluster1:- exit code is
0
- exit code is
- after
kubectx new-context=.:- exit code is
0
- exit code is
- after
kubectx:- exit code is
0 - stdout equals an exact value
- exit code is
- after
kubectx --current:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
new-context
user1@cluster1
expected stdout:
new-context
Scenario: deleting a context removes it from the listing #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx -d user1@cluster1
kubectx
Then #
- after
kubectx -d user1@cluster1:- exit code is
0 - stderr contains
Deleted context user1@cluster1.
- exit code is
- after
kubectx:- exit code is
0 - stdout equals an exact value
- file
configcontainsname: user1,name: cluster1
- exit code is
Expected output #
expected stdout:
user2@cluster1
Scenario: a dot deletes the current context #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx user2@cluster1
kubectx -d .
kubectx
Then #
- after
kubectx user2@cluster1:- exit code is
0
- exit code is
- after
kubectx -d .:- exit code is
0
- exit code is
- after
kubectx:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
user1@cluster1
Scenario: deleting an unknown context fails and keeps the file intact #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: ""
When #
kubectx -d unknown-context
Then #
- exit code is
1 - stderr contains
context does not exist - the step changed exactly created nothing, modified nothing, deleted nothing, ignoring
.atago-home/**
Scenario: several contexts are deleted in one call #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx -d user1@cluster1 user2@cluster1
kubectx
Then #
- after
kubectx -d user1@cluster1 user2@cluster1:- exit code is
0
- exit code is
- after
kubectx:- exit code is
0 - stdout is empty
- exit code is
Scenario: a batch delete naming one unknown context fails after deleting the rest #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx -d user1@cluster1 non-existent user2@cluster1
kubectx
Then #
- after
kubectx -d user1@cluster1 non-existent user2@cluster1:- exit code is
1
- exit code is
- after
kubectx:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
user2@cluster1
Scenario: unsetting clears the selection #
only when kubectx --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
kubectx user1@cluster1
kubectx -u
kubectx --current
kubectx
Then #
- after
kubectx user1@cluster1:- exit code is
0
- exit code is
- after
kubectx -u:- exit code is
0 - stderr contains
Active context unset
- exit code is
- after
kubectx --current:- exit code is
1 - stderr contains
current-context is not set
- exit code is
- after
kubectx:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
user1@cluster1
user2@cluster1
Scenario: the interactive picker selects a context by typed query #
only when fzf --version succeeds · skipped on Windows
Given #
- Fixture file
configis created. - The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
- name: user2
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
- name: user2@cluster1
context: {cluster: cluster1, user: user2}
current-context: ""
When #
# interactive (pty): kubectx
Then #
- exit code is
0 - file
configcontainscurrent-context: "user2@cluster1"
kubens (third-party CLI, namespace state machine) #
kubens is kubectx’s sibling: it sets the namespace of the current kubectl context. The contract has one more dimension than kubectx’s, because a namespace only means anything relative to a context — the previous-namespace memory is kept per context, and every command fails when no context is selected at all.
kubens ships its own Bats suite, and every test in it is reproduced here.
The scenarios then pin what that suite leaves open: which stream each line
goes to, that the chosen namespace really lands in the kubeconfig on disk,
that a rejected name changes nothing, and what --force does with a
namespace the cluster does not have.
Listing namespaces would need a cluster, so the suite sets the same short-circuit environment variable kubens’ own tests use and never opens a socket.
Source: test/e2e/thirdparty/kubectx/kubens.atago.yaml
Scenario: usage is printed for –help and -h #
only when kubens --help succeeds
Given #
- Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
When #
kubens --help
kubens -h
Then #
- after
kubens --help:- exit code is
0 - stdout contains
USAGE:,kubens <NAME>
- exit code is
- after
kubens -h:- exit code is
0 - stdout contains
USAGE:
- exit code is
Scenario: listing without a kubeconfig fails #
only when kubens --help succeeds
Given #
- Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
When #
kubens
Then #
- exit code is
1 - stdout is empty
Scenario: the namespaces of the current context are listed #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: "user1@cluster1"
When #
kubens
Then #
- exit code is
0 - stdout contains
ns1,ns2 - stderr is empty
Scenario: switching writes the namespace into the current context #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: "user1@cluster1"
When #
kubens ns1
kubens --current
Then #
- after
kubens ns1:- exit code is
0 - stdout is empty
- stderr contains
Active namespace is "ns1" - the step changed exactly created nothing, modified
config, deleted nothing, ignoring.atago-home/** - file
configcontainsnamespace: ns1
- exit code is
- after
kubens --current:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
ns1
Scenario: an unknown namespace is refused and changes nothing #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: "user1@cluster1"
When #
kubens unknown-namespace
Then #
- exit code is
1 - stdout is empty
- stderr contains
no namespace exists with name "unknown-namespace" - the step changed exactly created nothing, modified nothing, deleted nothing, ignoring
.atago-home/**
Scenario: –force accepts a namespace the cluster does not have #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: "user1@cluster1"
When #
kubens --force not-yet-created
Then #
- exit code is
0 - stderr contains
Active namespace is "not-yet-created" - file
configcontainsnamespace: not-yet-created
Scenario: the dash toggles between the last two namespaces #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: "user1@cluster1"
When #
kubens ns1
kubens ns2
kubens -
kubens --current
kubens -
kubens --current
Then #
- after
kubens ns1:- exit code is
0
- exit code is
- after
kubens ns2:- exit code is
0 - file
.atago-home/.cache/kubens/user1@cluster1equals exact bytes
- exit code is
- after
kubens -:- exit code is
0
- exit code is
- after
kubens --current:- exit code is
0 - stdout equals an exact value
- exit code is
- after
kubens -:- exit code is
0
- exit code is
- after
kubens --current:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
ns1
expected stdout:
ns2
Scenario: the dash fails when this context has no previous namespace #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: "user1@cluster1"
When #
kubens -
Then #
- exit code is
1 - stdout is empty
- stderr contains
No previous namespace found for current context
Scenario: the dash fails when no context is selected #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: ""
When #
kubens -
Then #
- exit code is
1 - stderr contains
current-context is not set
Scenario: –current reports default before any namespace is chosen #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: "user1@cluster1"
When #
kubens -c
kubens --current
Then #
- after
kubens -c:- exit code is
0 - stdout equals an exact value
- exit code is
- after
kubens --current:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
default
expected stdout:
default
Scenario: –current reports the namespace after it is set #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: "user1@cluster1"
When #
kubens ns1
kubens -c
kubens --current
Then #
- after
kubens ns1:- exit code is
0
- exit code is
- after
kubens -c:- exit code is
0 - stdout equals an exact value
- exit code is
- after
kubens --current:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
ns1
expected stdout:
ns1
Scenario: –current fails when no context is selected #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: ""
When #
kubens -c
kubens --current
Then #
- after
kubens -c:- exit code is
1
- exit code is
- after
kubens --current:- exit code is
1
- exit code is
Scenario: unsetting returns the context to the default namespace #
only when kubens --help succeeds
Given #
- Fixture file
configis created. - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected). - Environment variables are set: KUBECONFIG, _MOCK_NAMESPACES.
- The command runs with an isolated home under
${workdir}/.atago-home(HOME/XDG or APPDATA redirected).
Inputs #
Fixture config:
apiVersion: v1
kind: Config
clusters:
- name: cluster1
cluster: {server: https://cluster1.example.com}
users:
- name: user1
user: {}
contexts:
- name: user1@cluster1
context: {cluster: cluster1, user: user1}
current-context: "user1@cluster1"
When #
kubens ns2
kubens -u
kubens --current
Then #
- after
kubens ns2:- exit code is
0
- exit code is
- after
kubens -u:- exit code is
0 - stderr contains
Active namespace is "default"
- exit code is
- after
kubens --current:- exit code is
0 - stdout equals an exact value
- exit code is
Expected output #
expected stdout:
default