Feature 11074: Enhanced OSM declarative modelling for applications. OSM's SDK for intent manipulation

Change-Id: I6d03faa143eafcf30380b3b854c54f177dcf8f25
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
diff --git a/docker/osm-nushell-krm-functions/krm/tests/convert.nu b/docker/osm-nushell-krm-functions/krm/tests/convert.nu
new file mode 100644
index 0000000..09710eb
--- /dev/null
+++ b/docker/osm-nushell-krm-functions/krm/tests/convert.nu
@@ -0,0 +1,448 @@
+#!/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
+}