Files
woodpecker/server/pipeline/items_test.go

167 lines
4.6 KiB
Go

// Copyright 2023 Woodpecker Authors
//
// 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.
package pipeline
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
backend_types "go.woodpecker-ci.org/woodpecker/v3/pipeline/backend/types"
"go.woodpecker-ci.org/woodpecker/v3/server"
forge_mocks "go.woodpecker-ci.org/woodpecker/v3/server/forge/mocks"
forge_types "go.woodpecker-ci.org/woodpecker/v3/server/forge/types"
"go.woodpecker-ci.org/woodpecker/v3/server/model"
"go.woodpecker-ci.org/woodpecker/v3/server/pipeline/step_builder"
manager_mocks "go.woodpecker-ci.org/woodpecker/v3/server/services/mocks"
registry_service_mocks "go.woodpecker-ci.org/woodpecker/v3/server/services/registry/mocks"
secret_service_mocks "go.woodpecker-ci.org/woodpecker/v3/server/services/secret/mocks"
store_mocks "go.woodpecker-ci.org/woodpecker/v3/server/store/mocks"
)
func TestSetPipelineStepsOnPipeline(t *testing.T) {
t.Parallel()
pipeline := &model.Pipeline{
ID: 1,
Event: model.EventPush,
}
pipelineItems := []*step_builder.Item{{
Workflow: &model.Workflow{
PID: 1,
},
Config: &backend_types.Config{
Stages: []*backend_types.Stage{
{
Steps: []*backend_types.Step{
{
Name: "clone",
},
},
},
{
Steps: []*backend_types.Step{
{
Name: "step",
},
},
},
},
},
}}
pipeline = setPipelineStepsOnPipeline(pipeline, pipelineItems)
if len(pipeline.Workflows) != 1 {
t.Fatal("Should generate three in total")
}
if pipeline.Workflows[0].PipelineID != 1 {
t.Fatal("Should set workflow's pipeline ID")
}
if pipeline.Workflows[0].Children[0].PPID != 1 {
t.Fatal("Should set step PPID")
}
}
func TestParsePipeline(t *testing.T) {
t.Parallel()
pipeline := &model.Pipeline{
ID: 1,
Event: model.EventPush,
AdditionalVariables: map[string]string{
"ADDITIONAL": "value",
},
}
user := &model.User{
ID: 1,
}
repo := &model.Repo{
ID: 1,
}
yamls := []*forge_types.FileMeta{
{
Name: "woodpecker.yml",
Data: []byte(`
when:
- event: push
steps:
- name: test
image: alpine
environment:
HELLO:
from_secret: hello
commands:
- echo "hello world"
`),
},
}
envs := map[string]string{
"FOO": "bar",
}
forge := forge_mocks.NewMockForge(t)
forge.On("Netrc", mock.Anything, mock.Anything).Return(&model.Netrc{
Login: "user",
Password: "password",
}, nil)
forge.On("Name").Return("github")
forge.On("URL").Return("https://github.com")
store := store_mocks.NewMockStore(t)
store.On("GetPipelineLastBefore", mock.Anything, mock.Anything, pipeline.ID).Return(&model.Pipeline{}, nil)
mockManager := manager_mocks.NewMockManager(t)
server.Config.Services.Manager = mockManager
secretService := secret_service_mocks.NewMockService(t)
secretService.On("SecretListPipeline", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*model.Secret{
{
Name: "hello",
Value: "secret world",
},
}, nil)
mockManager.On("SecretServiceFromRepo", mock.Anything).Return(secretService, nil)
registryService := registry_service_mocks.NewMockService(t)
registryService.On("RegistryListPipeline", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*model.Registry{
{
Address: "docker.io",
Username: "user",
Password: "password",
},
}, nil)
mockManager.On("RegistryServiceFromRepo", mock.Anything).Return(registryService, nil)
mockManager.On("EnvironmentService").Return(nil, nil)
pipelineItems, err := parsePipeline(t.Context(), forge, store, pipeline, user, repo, yamls, envs)
assert.NoError(t, err)
assert.Len(t, pipelineItems, 1)
assert.Equal(t, "test", pipelineItems[0].Config.Stages[0].Steps[0].Name)
assert.Equal(t, "alpine", pipelineItems[0].Config.Stages[0].Steps[0].Image)
step := pipelineItems[0].Config.Stages[0].Steps[0]
assert.Equal(t, []string{`echo "hello world"`}, step.Commands)
assert.Equal(t, "value", step.Environment["ADDITIONAL"])
assert.Equal(t, "bar", step.Environment["FOO"])
assert.Equal(t, "secret world", step.Environment["HELLO"])
}