blob: 09710ebda9f2b87344c2254d7e50086430a9f286 [file] [log] [blame]
#!/usr/bin/env -S nu --stdin
#######################################################################################
# Copyright ETSI Contributors and Others.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#######################################################################################
use std assert
use std null-device
use ../../krm/convert.nu *
# --- replace environment variables tests ---
export def "test convert replace environment variables no vars" []: [
nothing -> nothing
] {
let text: string = "Hello, $USER!"
$env.USER = "test_user"
let actual: string = (
echo $text | replace environment variables
)
let expected: string = "Hello, test_user!"
assert equal $actual $expected
}
export def "test convert replace environment variables string vars" []: [
nothing -> nothing
] {
let text: string = "Hello, $USER! Your HOME is $HOME."
let vars_to_replace: string = "$USER,$HOME"
load-env {
USER: "test_user"
HOME: "/home/test_user"
}
let actual: string = (
echo $text | replace environment variables $vars_to_replace
)
let expected: string = "Hello, test_user! Your HOME is /home/test_user."
assert equal $actual $expected
}
export def "test convert replace environment variables list vars" []: [
nothing -> nothing
] {
let text: string = "Hello, $USER! Your HOME is $HOME."
let vars_to_replace: list<string> = ["USER", "HOME"]
load-env {
USER: "test_user"
HOME: "/home/test_user"
}
let actual: string = (
echo $text | replace environment variables $vars_to_replace
)
let expected: string = "Hello, test_user! Your HOME is /home/test_user."
assert equal $actual $expected
}
export def "test convert replace environment variables invalid input" []: [
nothing -> nothing
] {
let text: string = "Hello, $USER!"
let vars_to_replace: int = 123
let error_occurred: error = try {
echo $text | replace environment variables $vars_to_replace
} catch {
|err| $err.msg
}
assert equal $error_occurred "Error: Expected a string or list of strings, but received int"
}
export def "test convert replace environment variables no replacement" []: [
nothing -> nothing
] {
let text: string = "Hello, $NON_EXISTENT_VAR!"
let actual: string = (
echo $text | replace environment variables
)
let expected: string = "Hello, !"
assert equal $actual $expected
}
# --- folder to resourcelist tests ---
export def "test convert folder to resourcelist empty input" []: [
nothing -> nothing
] {
let folder: path = "./artifacts/empty"
let expected: record = {
apiVersion: "config.kubernetes.io/v1"
kind: "ResourceList"
items: []
}
let actual: record = (folder to resourcelist $folder)
assert equal $actual $expected
}
export def "test convert folder to resourcelist no substitution" []: [
nothing -> nothing
] {
let folder: path = "./artifacts/jenkins/templates"
let input_list: record = {
apiVersion: "config.kubernetes.io/v1"
kind: "ResourceList"
items: ["item1", "item2"]
}
let actual: record = (
echo $input_list | folder to resourcelist $folder
)
let expected_items: list<string> = ["item1", "item2"] | append (
kpt fn source $folder
| from yaml
| get items
)
assert equal $actual.apiVersion "config.kubernetes.io/v1"
assert equal $actual.kind "ResourceList"
assert equal $actual.items $expected_items
}
export def "test convert folder to resourcelist with substitution" []: [
nothing -> nothing
] {
let folder: path = "./artifacts/namespace/templates"
let input_list: record = {
apiVersion: "config.kubernetes.io/v1"
kind: "ResourceList"
items: ["item1", "item2"]
}
$env.TARGET_NS = "target-namespace"
let actual: record = (
echo $input_list | folder to resourcelist --subst-env $folder
)
let expected_items: list<string> = ["item1", "item2"] | append (
kpt fn source $folder
| replace environment variables
| from yaml
| get items
)
assert equal $actual.apiVersion "config.kubernetes.io/v1"
assert equal $actual.kind "ResourceList"
assert equal $actual.items $expected_items
assert equal $actual.items.2.metadata.name $env.TARGET_NS
}
export def "test convert folder to resourcelist with filter" []: [
nothing -> nothing
] {
let folder: path = "./artifacts/namespace/templates"
let input_list: record = {
apiVersion: "config.kubernetes.io/v1"
kind: "ResourceList"
items: ["item1", "item2"]
}
$env.TARGET_NS = "target-namespace"
let env_filter = "$TARGET_NS"
let actual: record = (
echo $input_list | folder to resourcelist --subst-env $folder $env_filter
)
let expected_items: list<string> = ["item1", "item2"] | append (
kpt fn source $folder
| replace environment variables $env_filter
| from yaml
| get items
)
assert equal $actual.apiVersion "config.kubernetes.io/v1"
assert equal $actual.kind "ResourceList"
assert equal $actual.items $expected_items
assert equal $actual.items.2.metadata.name $env.TARGET_NS
}
export def "test convert folder to resourcelist invalid input" []: [
nothing -> nothing
] {
let folder: path = "./non-existent-folder"
let input_list: record = {
apiVersion: "config.kubernetes.io/v1"
kind: "ResourceList"
items: ["item1", "item2"]
}
let error_occurred: bool = try {
echo $input_list | folder to resourcelist $folder err> (null-device)
} catch {
|err| $err.msg
}
assert equal $error_occurred "Can't convert to record."
}
# --- manifest to resourcelist tests ---
export def "test convert manifest to resourcelist empty input" []: [
nothing -> nothing
] {
let actual: record = manifest to resourcelist
let expected: record = {
apiVersion: "config.kubernetes.io/v1"
kind: "ResourceList"
items: []
}
assert equal $actual $expected
}
export def "test convert manifest to resourcelist single record" []: [
nothing -> nothing
] {
let manifest: record = {
name: "example"
kind: "Deployment"
}
let actual: record = (
$manifest | manifest to resourcelist
)
let expected: record = {
apiVersion: "config.kubernetes.io/v1"
kind: "ResourceList"
items: [ $manifest ]
}
assert equal $actual $expected
}
export def "test convert manifest to resourcelist list of records" []: [
nothing -> nothing
] {
let manifests: list<any> = [
{ name: "example1", kind: "Deployment" }
{ name: "example2", kind: "Service" }
]
let actual: record = (
$manifests | manifest to resourcelist
)
let expected: record = {
apiVersion: "config.kubernetes.io/v1"
kind: "ResourceList"
items: $manifests
}
assert equal $actual $expected
}
export def "test convert manifest to resourcelist invalid input" []: [
nothing -> nothing
] {
let invalid_manifest: string = "Invalid manifest"
let error_occurred: bool = try {
$invalid_manifest | manifest to resourcelist
} catch {
|err| $err.msg
}
assert equal $error_occurred "Error: Expected a record or a list of records, but received string."
}
# --- resourcelist to folder tests ---
export def "test convert resourcelist to folder dry run" []: [
nothing -> nothing
] {
let rl: record = {
apiVersion: "config.kubernetes.io/v1"
kind: "ResourceList"
items: ["item1", "item2"]
}
let output: record = (
$rl | resourcelist to folder "no-folder" true | from yaml
)
assert equal $output $rl
}
export def "test convert resourcelist to folder no sync" []: [
nothing -> nothing
] {
let source_folder: path = "./artifacts/jenkins/templates/"
let rl: record = (
convert folder to resourcelist $source_folder
)
let target_folder: string = (mktemp -t -d)
# Run the command
$rl | resourcelist to folder $target_folder
# Check if the contents were copied correctly
let actual_contents: list<string> = (
ls --short-names $target_folder
| get name
| sort
)
# Cleanup
rm -rf $target_folder
# Expected
let expected_contents: list<string> = (
ls --short-names $source_folder
| get name
| sort
)
assert equal $actual_contents $expected_contents
}
export def "test convert resourcelist to folder sync" []: [
nothing -> nothing
] {
let source_folder: path = "./artifacts/jenkins/templates/"
let rl: record = (
convert folder to resourcelist $source_folder
)
let target_folder: string = (mktemp -t -d)
# Add an extra file to the target folder (it should be removed by the synchronization)
^touch ($target_folder | path join "extra_file.txt")
# Run the command
$rl | resourcelist to folder --sync $target_folder
# Check if the contents were copied correctly
let actual_contents: list<string> = (
ls --short-names $target_folder
| get name
| sort
)
# Cleanup
rm -rf $target_folder
# Expected
let expected_contents: list<string> = (
ls --short-names $source_folder
| get name
| sort
)
assert equal $actual_contents $expected_contents
}
# export def "test convert resourcelist to folder invalid input" []: [
# nothing -> nothing
# ] {
# let invalid_input: record = { "Invalid input": "invalid value" }
# let target_folder: string = (mktemp -t -d)
# let error_occurred: any = try {
# $invalid_input | resourcelist to folder $target_folder
# } catch {
# |err| $err.msg
# }
# # Cleanup
# print $target_folder
# # rm -rf $target_folder
# assert equal $error_occurred "Can't convert to boolean."
# }
export def "test convert resourcelist to folder non-existent folder" []: [
nothing -> nothing
] {
let source_folder: path = "./artifacts/jenkins/templates/"
let rl: record = (
convert folder to resourcelist $source_folder
)
let temp_folder: string = (mktemp -t -d)
let target_folder: string = ($temp_folder | path join "new-folder")
mkdir $target_folder
# Run the command
$rl | resourcelist to folder $target_folder
# Check if the contents were copied correctly
let actual_contents: list<string> = (
ls --short-names $target_folder
| get name
| sort
)
# Cleanup
rm -rf $temp_folder
# Expected
let expected_contents: list<string> = (
ls --short-names $source_folder
| get name
| sort
)
assert equal $actual_contents $expected_contents
}