blob: 8dd9c29fce8bb6c89bc15a899c97544bae6a8113 [file]
/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You 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.
*/
package remote
import (
"net/http"
"testing"
"github.com/apache/incubator-devlake/core/models"
"github.com/apache/incubator-devlake/core/plugin"
"github.com/apache/incubator-devlake/test/helper"
"github.com/stretchr/testify/require"
)
func TestCreateConnection(t *testing.T) {
client := CreateClient(t)
CreateTestConnection(client)
conns := client.ListConnections(PLUGIN_NAME)
require.Equal(t, 1, len(conns))
require.Equal(t, EMPTY_TOKEN, conns[0].Token)
}
func TestDeleteConnection(t *testing.T) {
client := CreateClient(t)
CreateTestConnection(client)
conns := client.ListConnections(PLUGIN_NAME)
require.Equal(t, 1, len(conns))
require.Equal(t, EMPTY_TOKEN, conns[0].Token)
refs := client.DeleteConnection(PLUGIN_NAME, conns[0].ID)
require.Equal(t, 0, len(refs.Projects))
require.Equal(t, 0, len(refs.Blueprints))
}
func TestDeleteConnection_Conflict(t *testing.T) {
client := CreateClient(t)
params := CreateTestBlueprints(t, client, 1)
conns := client.ListConnections(PLUGIN_NAME)
require.Equal(t, 1, len(conns))
require.Equal(t, EMPTY_TOKEN, conns[0].Token)
refs := client.SetExpectedStatusCode(http.StatusConflict).DeleteConnection(PLUGIN_NAME, params.connection.ID)
require.Equal(t, 1, len(refs.Projects))
require.Equal(t, 1, len(refs.Blueprints))
client.DeleteBlueprint(params.blueprints[0].ID)
client.SetExpectedStatusCode(http.StatusConflict).DeleteConnection(PLUGIN_NAME, params.connection.ID)
client.DeleteScope(PLUGIN_NAME, params.connection.ID, params.scope.Id, false)
client.DeleteConnection(PLUGIN_NAME, conns[0].ID)
}
func TestDeleteConnection_WithDependentScopesAndConfig(t *testing.T) {
client := CreateClient(t)
connection := CreateTestConnection(client)
config := CreateTestScopeConfig(client, connection.ID)
scope := CreateTestScope(client, config, connection.ID)
refs := client.SetExpectedStatusCode(http.StatusConflict).DeleteConnection(PLUGIN_NAME, connection.ID)
require.Equal(t, 0, len(refs.Projects))
require.Equal(t, 0, len(refs.Blueprints))
client.DeleteScope(PLUGIN_NAME, connection.ID, scope.Id, false)
refs = client.DeleteConnection(PLUGIN_NAME, connection.ID)
require.Equal(t, 0, len(refs.Projects))
require.Equal(t, 0, len(refs.Blueprints))
scopeRes := client.SetExpectedStatusCode(http.StatusBadRequest).ListScopes(PLUGIN_NAME, connection.ID, false).Scopes
require.Equal(t, 0, len(scopeRes))
configs := client.ListScopeConfigs(PLUGIN_NAME, connection.ID)
require.Equal(t, 0, len(configs))
}
func TestRemoteScopeGroups(t *testing.T) {
client := CreateClient(t)
connection := CreateTestConnection(client)
output := client.RemoteScopes(helper.RemoteScopesQuery{
PluginName: PLUGIN_NAME,
ConnectionId: connection.ID,
})
scopeGroups := output.Children
require.Equal(t, 1, len(scopeGroups))
scope := scopeGroups[0]
require.Equal(t, "Group 1", scope.Name)
require.Equal(t, "group1", scope.Id)
require.Equal(t, "group", scope.Type)
require.Nil(t, scope.ParentId)
require.Nil(t, scope.Data)
}
func TestRemoteScopes(t *testing.T) {
client := CreateClient(t)
connection := CreateTestConnection(client)
output := client.RemoteScopes(helper.RemoteScopesQuery{
PluginName: PLUGIN_NAME,
ConnectionId: connection.ID,
GroupId: "group1",
})
scopes := output.Children
require.Equal(t, 1, len(scopes))
scope := scopes[0]
require.Equal(t, "Project 1", scope.Name)
require.Equal(t, "p1", scope.Id)
require.Equal(t, "group1", *scope.ParentId)
require.Equal(t, "scope", scope.Type)
require.NotNil(t, scope.Data)
cicdScope := helper.Cast[FakeProject](scope.Data)
require.Equal(t, connection.ID, cicdScope.ConnectionId)
require.Equal(t, "p1", cicdScope.Id)
require.Equal(t, "Project 1", cicdScope.Name)
require.Equal(t, "http://fake.org/api/project/p1", cicdScope.Url)
}
func TestCreateScope(t *testing.T) {
client := CreateClient(t)
conn := CreateTestConnection(client)
scopeConfig := CreateTestScopeConfig(client, conn.ID)
scope := CreateTestScope(client, scopeConfig, conn.ID)
scopes := client.ListScopes(PLUGIN_NAME, conn.ID, false).Scopes
require.Equal(t, 1, len(scopes))
cicdScope := helper.Cast[FakeProject](client.GetScope(PLUGIN_NAME, conn.ID, scope.Id, false).Scope)
require.Equal(t, scope.Id, cicdScope.Id)
cicdScope0 := helper.Cast[FakeProject](scopes[0].Scope)
require.Equal(t, scope.Id, cicdScope0.Id)
require.Equal(t, conn.ID, cicdScope.ConnectionId)
require.Equal(t, "p1", cicdScope.Id)
require.Equal(t, "Project 1", cicdScope.Name)
require.Equal(t, "http://fake.org/api/project/p1", cicdScope.Url)
cicdScope.Name = "scope-name-2"
client.UpdateScope(PLUGIN_NAME, conn.ID, cicdScope.Id, cicdScope)
cicdScope = helper.Cast[FakeProject](client.GetScope(PLUGIN_NAME, conn.ID, scope.Id, false).Scope)
require.Equal(t, "scope-name-2", cicdScope.Name)
}
func TestRunPipeline(t *testing.T) {
client := CreateClient(t)
conn := CreateTestConnection(client)
scopeConfig := CreateTestScopeConfig(client, conn.ID)
scope := CreateTestScope(client, scopeConfig, conn.ID)
pipeline := client.RunPipeline(models.NewPipeline{
Name: "remote_test",
Plan: []models.PipelineStage{
{
{
Plugin: PLUGIN_NAME,
Subtasks: nil,
Options: map[string]interface{}{
"connectionId": conn.ID,
"scopeId": scope.Id,
},
},
},
},
})
require.Equal(t, models.TASK_COMPLETED, pipeline.Status)
require.Equal(t, 1, pipeline.FinishedTasks)
require.Equal(t, "", pipeline.ErrorName)
}
func TestBlueprintV200_withScopeDeletion_Conflict(t *testing.T) {
client := CreateClient(t)
params := CreateTestBlueprints(t, client, 1)
client.TriggerBlueprint(params.blueprints[0].ID)
scopesResponse := client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 1, len(scopesResponse))
require.Equal(t, 1, len(scopesResponse[0].Blueprints))
refs := DeleteScopeWithDataIntegrityValidation(t, client.SetExpectedStatusCode(http.StatusConflict), params.connection.ID, params.scope.Id, false)
require.Equal(t, 1, len(refs.Blueprints))
require.Equal(t, 1, len(refs.Projects))
scopesResponse = client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 1, len(scopesResponse))
bpsResult := client.ListBlueprints()
require.Equal(t, 1, len(bpsResult.Blueprints))
}
func TestBlueprintV200_withBlueprintDeletion(t *testing.T) {
client := CreateClient(t)
params := CreateTestBlueprints(t, client, 2)
client.TriggerBlueprint(params.blueprints[0].ID)
scopesResponse := client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 1, len(scopesResponse))
require.Equal(t, 2, len(scopesResponse[0].Blueprints))
client.DeleteBlueprint(params.blueprints[0].ID)
scopesResponse = client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 1, len(scopesResponse))
bpsList := client.ListBlueprints()
require.Equal(t, 1, len(bpsList.Blueprints))
require.Equal(t, params.blueprints[1].ID, bpsList.Blueprints[0].ID)
projectsResponse := client.ListProjects()
require.Equal(t, 2, len(projectsResponse.Projects))
}
func TestBlueprintV200_withBlueprintDeletion_thenScopeDeletion(t *testing.T) {
client := CreateClient(t)
params := CreateTestBlueprints(t, client, 1)
client.TriggerBlueprint(params.blueprints[0].ID)
scopesResponse := client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 1, len(scopesResponse))
require.Equal(t, 1, len(scopesResponse[0].Blueprints))
client.DeleteBlueprint(params.blueprints[0].ID)
scopesResponse = client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 1, len(scopesResponse))
bpsList := client.ListBlueprints()
require.Equal(t, 0, len(bpsList.Blueprints))
refs := DeleteScopeWithDataIntegrityValidation(t, client, params.connection.ID, params.scope.Id, false)
require.Equal(t, 0, len(refs.Blueprints))
require.Equal(t, 0, len(refs.Projects))
scopesResponse = client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 0, len(scopesResponse))
projectsResponse := client.ListProjects()
require.Equal(t, 1, len(projectsResponse.Projects))
}
func TestBlueprintV200_withProjectDeletion_thenScopeDeletion(t *testing.T) {
client := CreateClient(t)
params := CreateTestBlueprints(t, client, 1)
client.TriggerBlueprint(params.blueprints[0].ID)
scopesResponse := client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 1, len(scopesResponse))
require.Equal(t, 1, len(scopesResponse[0].Blueprints))
client.DeleteProject(params.projects[0].Name)
scopesResponse = client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 1, len(scopesResponse))
bpsList := client.ListBlueprints()
require.Equal(t, 0, len(bpsList.Blueprints))
refs := DeleteScopeWithDataIntegrityValidation(t, client, params.connection.ID, params.scope.Id, false)
require.Equal(t, 0, len(refs.Blueprints))
require.Equal(t, 0, len(refs.Projects))
scopesResponse = client.ListScopes(PLUGIN_NAME, params.connection.ID, true).Scopes
require.Equal(t, 0, len(scopesResponse))
projectsResponse := client.ListProjects()
require.Equal(t, 0, len(projectsResponse.Projects))
}
func TestCreateScopeConfig(t *testing.T) {
client := CreateClient(t)
connection := CreateTestConnection(client)
scopeConfig := FakeScopeConfig{Name: "Scope config", Env: "test env", Entities: []string{plugin.DOMAIN_TYPE_CICD}}
res := client.CreateScopeConfig(PLUGIN_NAME, connection.ID, scopeConfig)
scopeConfig = helper.Cast[FakeScopeConfig](res)
res = client.GetScopeConfig(PLUGIN_NAME, connection.ID, scopeConfig.Id)
scopeConfig = helper.Cast[FakeScopeConfig](res)
require.Equal(t, "Scope config", scopeConfig.Name)
require.Equal(t, "test env", scopeConfig.Env)
require.Equal(t, []string{plugin.DOMAIN_TYPE_CICD}, scopeConfig.Entities)
}
func TestUpdateScopeConfig(t *testing.T) {
client := CreateClient(t)
connection := CreateTestConnection(client)
res := client.CreateScopeConfig(PLUGIN_NAME, connection.ID, FakeScopeConfig{Name: "old name", Env: "old env", Entities: []string{}})
oldScopeConfig := helper.Cast[FakeScopeConfig](res)
client.PatchScopeConfig(PLUGIN_NAME, connection.ID, oldScopeConfig.Id, FakeScopeConfig{Name: "new name", Env: "new env", Entities: []string{plugin.DOMAIN_TYPE_CICD}})
res = client.GetScopeConfig(PLUGIN_NAME, connection.ID, oldScopeConfig.Id)
scopeConfig := helper.Cast[FakeScopeConfig](res)
require.Equal(t, "new name", scopeConfig.Name)
require.Equal(t, "new env", scopeConfig.Env)
}
func TestDeleteScopeConfig(t *testing.T) {
client := CreateClient(t)
connection := CreateTestConnection(client)
scopeConfig := FakeScopeConfig{Name: "Scope config", Env: "test env", Entities: []string{plugin.DOMAIN_TYPE_CICD}}
scopeConfig = helper.Cast[FakeScopeConfig](client.CreateScopeConfig(PLUGIN_NAME, connection.ID, scopeConfig))
configs := helper.Cast[[]FakeScopeConfig](client.ListScopeConfigs(PLUGIN_NAME, connection.ID))
require.Equal(t, 1, len(configs))
client.DeleteScopeConfig(PLUGIN_NAME, connection.ID, scopeConfig.Id)
configs = helper.Cast[[]FakeScopeConfig](client.ListScopeConfigs(PLUGIN_NAME, connection.ID))
require.Equal(t, 0, len(configs))
}
func TestDeleteScopeConfig_WithReferencingScope(t *testing.T) {
client := CreateClient(t)
connection := CreateTestConnection(client)
scopeConfig := FakeScopeConfig{Name: "Scope config", Env: "test env", Entities: []string{plugin.DOMAIN_TYPE_CICD}}
scopeConfig = helper.Cast[FakeScopeConfig](client.CreateScopeConfig(PLUGIN_NAME, connection.ID, scopeConfig))
scope := CreateTestScope(client, &scopeConfig, connection.ID)
require.Equal(t, scopeConfig.Id, scope.ScopeConfigId)
client.DeleteScopeConfig(PLUGIN_NAME, connection.ID, scopeConfig.Id)
scope = helper.Cast[*FakeProject](client.GetScope(PLUGIN_NAME, connection.ID, scope.Id, false))
require.Equal(t, uint64(0), scope.ScopeConfigId)
}