diff --git a/app/mainapp/Tests/pipelines/code-files_test.go b/app/mainapp/Tests/pipelines/code-files_test.go new file mode 100644 index 000000000..29f75dde6 --- /dev/null +++ b/app/mainapp/Tests/pipelines/code-files_test.go @@ -0,0 +1,516 @@ +package pipelinetests + +import ( + "dataplane/mainapp/Tests/testutils" + "dataplane/mainapp/code_editor/filesystem" + "dataplane/mainapp/config" + "dataplane/mainapp/database" + "dataplane/mainapp/database/models" + "log" + "net/http" + "os" + "strings" + "testing" + + "github.com/bxcodec/faker/v3" + jsoniter "github.com/json-iterator/go" + "github.com/stretchr/testify/assert" +) + +/* +For individual tests - in separate window run: go run server.go +go test -p 1 -v -count=1 -run TestCodeFiles dataplane/mainapp/Tests/pipelines +* Login +* Create pipeline +* Add pipeline flow + +* Create folder 2 +* Create folder 1 +* Rename folder +* Move folder - Tree integrity check +* Upload file - Tree integrity check +* Move file - Tree integrity check +* Rename file - Tree integrity check +* Get Files node +* Delete file - Tree integrity check +* Delete folder - Tree integrity check + +* Delete pipeline flow +* Delete pipeline +* Delete environment +* Delete temoprary environment folder + +*/ +func TestCodeFiles(t *testing.T) { + config.LoadConfig() + database.DBConnect() + + graphQLUrl := testutils.GraphQLUrlPublic + graphQLUrlPrivate := testutils.GraphQLUrlPrivate + + testUser := testutils.AdminUser + testPassword := testutils.AdminPassword + + //--------- Login ------------ + + loginUser := `{ + loginUser( + username: "` + testUser + `", + password: "` + testPassword + `", + ) { + access_token + refresh_token + } + }` + + loginUserResponse, httpLoginResponse := testutils.GraphQLRequestPublic(loginUser, "{}", graphQLUrl, t) + accessToken := jsoniter.Get(loginUserResponse, "data", "loginUser", "access_token").ToString() + + // log.Println(string(loginUserResponse)) + + if strings.Contains(string(loginUserResponse), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpLoginResponse.StatusCode, "Login user 200 status code") + + pipelineId := testutils.TextEscape(faker.UUIDHyphenated()) + + // -------- clean data ------- + database.DBConn.Where("node_id =?", "nodeID").Delete(&models.PipelineNodes{}) + database.DBConn.Where("name =?", "test_Code_Files_Environment").Delete(&models.Environment{}) + // -------- Add environment ------------- + + mutation := `mutation { + addEnvironment( + input: { + name: "test_Code_Files_Environment", + description: "" + } + ){ + id + name + description + } + }` + + response, httpResponse := testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Add environment 200 status code") + envID := jsoniter.Get(response, "data", "addEnvironment", "id").ToString() + + // -------- Create pipeline ------------- + + mutation = `mutation { + addPipeline( + name: "test_` + pipelineId + `", + environmentID: "` + envID + `", + description: "Test", + workerGroup: "python_1" + ) + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Create pipeline 200 status code") + id := jsoniter.Get(response, "data", "addPipeline").ToString() + + // Get environment folder path + f := models.CodeFolders{} + err := database.DBConn.Where("pipeline_id = ? and level = ?", id, "pipeline").Find(&f).Error + if err != nil { + t.Errorf(err.Error()) + } + folderpath, _ := filesystem.FolderConstructByID(database.DBConn, f.ParentID, envID, "") + deleteFolder := config.CodeDirectory + folderpath + + // -------- Add pipeline flow ------------- + mutation = `mutation { + addUpdatePipelineFlow( + environmentID: "` + envID + `", + pipelineID: "` + id + `", + input:{ + nodesInput: [{ + nodeID: "nodeID", + name: "TestNodePython", + nodeType: "pythonNode", + nodeTypeDesc: "", + triggerOnline: false, + description: "", + commands: [""], + workerGroup: "python_1", + meta: { + position: { + x: 75, + y: 315 + }, + data: { + language: "Python", + genericdata: null + } + }, + active: false + } + ], + edgesInput: [], + json: {} + } + ) + + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Add pipeline flow 200 status code") + + // -------- Create folder ------------- + // Get parent's folder id + nf := models.CodeFolders{} + err = database.DBConn.Where("folder_name = ? AND pipeline_id = ?", "TestNodePython", id).Find(&nf).Error + if err != nil { + t.Errorf(err.Error()) + } + + mutation = `mutation { + createFolderNode( + input: { + folderID: "Folder1-ID", + parentID: "` + nf.FolderID + `", + environmentID: "` + envID + `", + pipelineID: "` + id + `", + nodeID: "nodeID", + folderName: "Folder2", + fType: "folder", + active: true + } + ){ + folderID + parentID + folderName + level + fType + active + } + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + Folder2ID := jsoniter.Get(response, "data", "createFolderNode", "folderID").ToString() + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Add folder 200 status code") + + // -------- Create folder ------------- + + mutation = `mutation { + createFolderNode( + input: { + folderID: "Folder1-ID", + parentID: "` + nf.FolderID + `", + environmentID: "` + envID + `", + pipelineID: "` + id + `", + nodeID: "nodeID", + folderName: "Folder", + fType: "folder", + active: true + } + ){ + folderID + parentID + folderName + level + fType + active + } + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + renamedFolderID := jsoniter.Get(response, "data", "createFolderNode", "folderID").ToString() + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Add folder 200 status code") + + // -------- Rename folder ------------- + mutation = `mutation { + renameFolder( + folderID: "` + renamedFolderID + `", + environmentID: "` + envID + `", + pipelineID: "` + id + `", + nodeID: "nodeID", + newName: "Folder1" + ) + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + testutils.TreeIntegrityCheck(envID, id, "default", t) + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Rename folder 200 status code") + + // -------- Move folder ------------- + mutation = `mutation { + moveFolderNode( + folderID: "` + renamedFolderID + `", + environmentID: "` + envID + `", + pipelineID: "` + id + `", + toFolderID: "` + Folder2ID + `" + ) + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + testutils.TreeIntegrityCheck(envID, id, "afterMoveFolder", t) + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Move folder 200 status code") + + // -------- Create file ------------- + + mutation = `mutation { + uploadFileNode( + folderID: "` + renamedFolderID + `", + environmentID: "` + envID + `", + pipelineID: "` + id + `", + nodeID: "nodeID", + file: "file" + ) + }` + + response, httpResponse = testutils.GraphQLRequestPrivateUpload(accessToken, graphQLUrlPrivate, renamedFolderID, envID, id, "nodeID", t) + + log.Println(string(response)) + uploadedFileID := jsoniter.Get(response, "data", "uploadFileNode").ToString() + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + testutils.TreeIntegrityCheck(envID, id, "afterFileCreated", t) + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Add file 200 status code") + + // -------- Move file ------------- + + mutation = `mutation { + moveFileNode( + fileID: "` + uploadedFileID + `", + toFolderID: "` + Folder2ID + `", + environmentID: "` + envID + `", + pipelineID: "` + id + `" + + ) + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + testutils.TreeIntegrityCheck(envID, id, "afterFileMoved", t) + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Add file 200 status code") + + // -------- Rename file ------------- + mutation = `mutation { + renameFile( + fileID: "` + uploadedFileID + `", + environmentID: "` + envID + `", + pipelineID: "` + id + `", + nodeID: "nodeID", + newName: "dp-entrypoint_Renamed.py" + ) + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + testutils.TreeIntegrityCheck(envID, id, "afterFileRenamed", t) + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Rename file 200 status code") + + // -------- Get files node ------------- + mutation = `query { + filesNode( + environmentID: "` + envID + `", + pipelineID: "` + id + `", + nodeID: "nodeID" + ){ + folders{ + folderID + parentID + folderName + level + fType + active + } + files{ + fileID + folderID + fileName + level + fType + active + } + } + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Get files node 200 status code") + + // -------- Delete file ------------- + mutation = `mutation { + deleteFileNode( + fileID: "` + uploadedFileID + `", + environmentID: "` + envID + `", + pipelineID: "` + id + `", + nodeID: "nodeID" + ) + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + testutils.TreeIntegrityCheck(envID, id, "afterFileDeleted", t) + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Delete file 200 status code") + + // -------- Delete folder ------------- + mutation = `mutation { + deleteFolderNode( + folderID: "` + renamedFolderID + `", + environmentID: "` + envID + `", + pipelineID: "` + id + `", + nodeID: "nodeID" + ) + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + testutils.TreeIntegrityCheck(envID, id, "afterFolderDeleted", t) + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Delete folder 200 status code") + + // -------- Delete pipeline flow ------------- + mutation = `mutation { + addUpdatePipelineFlow( + environmentID: "` + envID + `", + pipelineID: "` + pipelineId + `", + input:{ + nodesInput: [], + edgesInput: [], + json: {} + } + ) + + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Delete pipeline 200 status code") + + // -------- Delete pipeline ------------- + + mutation = `mutation { + deletePipeline( + environmentID: "` + envID + `", + pipelineID: "` + id + `") + + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Delete pipeline 200 status code") + + // -------- Delete environment ------------- + mutation = `mutation { + updateDeleteEnvironment( + environment_id: "` + envID + `") + }` + + response, httpResponse = testutils.GraphQLRequestPrivate(mutation, accessToken, "{}", graphQLUrlPrivate, t) + + log.Println(string(response)) + + if strings.Contains(string(response), `"errors":`) { + t.Errorf("Error in graphql response") + } + + assert.Equalf(t, http.StatusOK, httpResponse.StatusCode, "Delete environment 200 status code") + + // -------- Remove Temporary environment + err = os.RemoveAll(deleteFolder) + if err != nil { + t.Errorf(err.Error()) + } + // -------- Remove zombie folders + database.DBConn.Where("environment_id = ? ", envID).Delete(&models.CodeFolders{}) +} diff --git a/app/mainapp/Tests/testutils/GraphqlClientPrivateUpload.go b/app/mainapp/Tests/testutils/GraphqlClientPrivateUpload.go new file mode 100644 index 000000000..81ea05fa6 --- /dev/null +++ b/app/mainapp/Tests/testutils/GraphqlClientPrivateUpload.go @@ -0,0 +1,78 @@ +package testutils + +import ( + "bytes" + "fmt" + "io" + "io/ioutil" + "mime/multipart" + "net/http" + "os" + "path/filepath" + "testing" +) + +func GraphQLRequestPrivateUpload(token string, url string, folderID string, envID string, pipelineID string, nodeID string, t *testing.T) (responseBody []byte, res *http.Response) { + + method := "POST" + + payload := &bytes.Buffer{} + writer := multipart.NewWriter(payload) + _ = writer.WriteField("operations", "{\"query\":\"\\n mutation uploadFileNode($environmentID: String!, $nodeID: String!, $pipelineID: String!, $folderID: String!, $file: Upload!) {\\n uploadFileNode(environmentID: $environmentID, nodeID: $nodeID, pipelineID: $pipelineID, folderID: $folderID, file: $file)\\n }\\n\",\"variables\":{\"environmentID\":\""+envID+"\",\"pipelineID\":\""+pipelineID+"\",\"nodeID\":\""+nodeID+"\",\"folderID\":\""+folderID+"\",\"file\":null}}\n") + _ = writer.WriteField("map", "{\"1\":[\"variables.file\"]}") + + // file, errFile3 := os.Open(config.CodeDirectory + "dp-entrypoint.py") + + file, errFile3 := os.CreateTemp("", "dp-entrypoint.py") // in Go version older than 1.17 you can use ioutil.TempFile + if errFile3 != nil { + fmt.Println(errFile3) + return + } + defer file.Close() + defer os.Remove(file.Name()) + + defer file.Close() + + part3, errFile3 := writer.CreateFormFile("1", filepath.Base("dp-entrypoint.py")) + if errFile3 != nil { + fmt.Println(errFile3) + return + } + + _, errFile3 = io.Copy(part3, file) + if errFile3 != nil { + fmt.Println(errFile3) + return + } + err := writer.Close() + if err != nil { + fmt.Println(err) + return + } + + client := &http.Client{} + req, err := http.NewRequest(method, url, payload) + + if err != nil { + fmt.Println(err) + return + } + req.Header.Add("Authorization", "Bearer "+token) + + req.Header.Set("Content-Type", writer.FormDataContentType()) + res, err = client.Do(req) + if err != nil { + fmt.Println(err) + return + } + defer res.Body.Close() + + body, err := ioutil.ReadAll(res.Body) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(string(body)) + + return body, res +} diff --git a/app/mainapp/Tests/testutils/TreeIntegrityCheck.go b/app/mainapp/Tests/testutils/TreeIntegrityCheck.go new file mode 100644 index 000000000..239f04ec2 --- /dev/null +++ b/app/mainapp/Tests/testutils/TreeIntegrityCheck.go @@ -0,0 +1,169 @@ +package testutils + +import ( + "dataplane/mainapp/code_editor/filesystem" + "dataplane/mainapp/config" + "dataplane/mainapp/database" + "dataplane/mainapp/database/models" + "log" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TreeIntegrityCheck(environmentID string, pipelineID string, checkType string, t *testing.T) { + database.DBConnect() + + // Environment folder + ef := models.CodeFolders{} + err := database.DBConn.Where("environment_id = ? and level = ?", environmentID, "environment").Find(&ef).Error + if err != nil { + log.Println("err: ", err) + } + + // Pipeline folder + pf := models.CodeFolders{} + err = database.DBConn.Where("pipeline_id = ? and level = ?", pipelineID, "pipeline").Find(&pf).Error + if err != nil { + log.Println("err: ", err) + } + + // Node folder + nf := models.CodeFolders{} + err = database.DBConn.Where("pipeline_id = ? and folder_name = ?", pipelineID, "TestNodePython").Find(&nf).Error + if err != nil { + log.Println("err: ", err) + } + + // Folder1 folder + f1 := models.CodeFolders{} + err = database.DBConn.Where("pipeline_id = ? and folder_name = ?", pipelineID, "Folder1").Find(&f1).Error + if err != nil { + log.Println("err: ", err) + } + + // Folder2 folder + f2 := models.CodeFolders{} + err = database.DBConn.Where("pipeline_id = ? and folder_name = ?", pipelineID, "Folder2").Find(&f2).Error + if err != nil { + log.Println("err: ", err) + } + + platformFolderName := ef.ParentID + "_Platform" + environmentFolderName := ef.FolderID + "_" + ef.FolderName + pipelineFolderName := pf.FolderID + "_" + pf.FolderName + nodeFolderName := nf.FolderID + "_" + nf.FolderName + F1FolderName := f1.FolderID + "_" + f1.FolderName + F2FolderName := f2.FolderID + "_" + f2.FolderName + + treeBefore := []string{} + treeBefore2 := []string{} + treeAfter := []string{} + + switch checkType { + case "afterMoveFolder": + treeBefore = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + F1FolderName} + + case "afterFileCreated": + treeBefore = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + F1FolderName, + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + F1FolderName + "/dp-entrypoint.py"} + + case "afterFileMoved": + treeBefore = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + F1FolderName, + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + "dp-entrypoint.py"} + treeBefore2 = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + "dp-entrypoint.py", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + F1FolderName} + + case "afterFileRenamed": + treeBefore = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + F1FolderName, + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + "dp-entrypoint_Renamed.py"} + treeBefore2 = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + "dp-entrypoint_Renamed.py", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + F1FolderName} + + case "afterFileDeleted": + treeBefore = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/" + F1FolderName} + + case "afterFolderDeleted": + treeBefore = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/"} + + case "default": + treeBefore = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F1FolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/"} + treeBefore2 = []string{ + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F2FolderName + "/", + config.CodeDirectory + platformFolderName + "/" + environmentFolderName + "/" + "pipelines/" + pipelineFolderName + "/" + nodeFolderName + "/" + F1FolderName + "/"} + } + + path, _ := filesystem.FolderConstructByID(database.DBConn, nf.ParentID, environmentID, "pipelines") + err = filepath.Walk(config.CodeDirectory+path, + func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() && info.Name() == ".git" { + return filepath.SkipDir + } + treeAfter = append(treeAfter, path) + return nil + }) + if err != nil { + log.Println(err) + } + + check := stringSlicesEqual(treeBefore, treeAfter) + check2 := stringSlicesEqual(treeBefore2, treeAfter) + + assert.Equalf(t, (check || check2), true, "File tree integrity check: ", checkType) + +} + +func stringSlicesEqual(a, b []string) bool { + if len(a) != len(b) { + return false + } + for i, v := range a { + if strings.TrimRight(v, "/") != strings.TrimRight(b[i], "/") { + return false + } + } + return true +}