forked from Plemya-x/ALR
fix: removeAlreadyInstalled before FindPkgs
This commit is contained in:
225
pkg/build/build_internal_test.go
Normal file
225
pkg/build/build_internal_test.go
Normal file
@ -0,0 +1,225 @@
|
||||
// ALR - Any Linux Repository
|
||||
// Copyright (C) 2025 Евгений Храмов
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
package build
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"plemya-x.ru/alr/internal/db"
|
||||
"plemya-x.ru/alr/internal/types"
|
||||
"plemya-x.ru/alr/pkg/manager"
|
||||
)
|
||||
|
||||
type TestPackageFinder struct {
|
||||
FindPkgsFunc func(ctx context.Context, pkgs []string) (map[string][]db.Package, []string, error)
|
||||
}
|
||||
|
||||
func (pf *TestPackageFinder) FindPkgs(ctx context.Context, pkgs []string) (map[string][]db.Package, []string, error) {
|
||||
if pf.FindPkgsFunc != nil {
|
||||
return pf.FindPkgsFunc(ctx, pkgs)
|
||||
}
|
||||
return map[string][]db.Package{}, []string{}, nil
|
||||
}
|
||||
|
||||
type TestManager struct {
|
||||
NameFunc func() string
|
||||
FormatFunc func() string
|
||||
ExistsFunc func() bool
|
||||
SetRootCmdFunc func(cmd string)
|
||||
SyncFunc func(opts *manager.Opts) error
|
||||
InstallFunc func(opts *manager.Opts, pkgs ...string) error
|
||||
RemoveFunc func(opts *manager.Opts, pkgs ...string) error
|
||||
UpgradeFunc func(opts *manager.Opts, pkgs ...string) error
|
||||
InstallLocalFunc func(opts *manager.Opts, files ...string) error
|
||||
UpgradeAllFunc func(opts *manager.Opts) error
|
||||
ListInstalledFunc func(opts *manager.Opts) (map[string]string, error)
|
||||
IsInstalledFunc func(pkg string) (bool, error)
|
||||
}
|
||||
|
||||
func (m *TestManager) Name() string {
|
||||
if m.NameFunc != nil {
|
||||
return m.NameFunc()
|
||||
}
|
||||
return "TestManager"
|
||||
}
|
||||
|
||||
func (m *TestManager) Format() string {
|
||||
if m.FormatFunc != nil {
|
||||
return m.FormatFunc()
|
||||
}
|
||||
return "testpkg"
|
||||
}
|
||||
|
||||
func (m *TestManager) Exists() bool {
|
||||
if m.ExistsFunc != nil {
|
||||
return m.ExistsFunc()
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (m *TestManager) SetRootCmd(cmd string) {
|
||||
if m.SetRootCmdFunc != nil {
|
||||
m.SetRootCmdFunc(cmd)
|
||||
}
|
||||
}
|
||||
|
||||
func (m *TestManager) Sync(opts *manager.Opts) error {
|
||||
if m.SyncFunc != nil {
|
||||
return m.SyncFunc(opts)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *TestManager) Install(opts *manager.Opts, pkgs ...string) error {
|
||||
if m.InstallFunc != nil {
|
||||
return m.InstallFunc(opts, pkgs...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *TestManager) Remove(opts *manager.Opts, pkgs ...string) error {
|
||||
if m.RemoveFunc != nil {
|
||||
return m.RemoveFunc(opts, pkgs...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *TestManager) Upgrade(opts *manager.Opts, pkgs ...string) error {
|
||||
if m.UpgradeFunc != nil {
|
||||
return m.UpgradeFunc(opts, pkgs...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *TestManager) InstallLocal(opts *manager.Opts, files ...string) error {
|
||||
if m.InstallLocalFunc != nil {
|
||||
return m.InstallLocalFunc(opts, files...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *TestManager) UpgradeAll(opts *manager.Opts) error {
|
||||
if m.UpgradeAllFunc != nil {
|
||||
return m.UpgradeAllFunc(opts)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *TestManager) ListInstalled(opts *manager.Opts) (map[string]string, error) {
|
||||
if m.ListInstalledFunc != nil {
|
||||
return m.ListInstalledFunc(opts)
|
||||
}
|
||||
return map[string]string{}, nil
|
||||
}
|
||||
|
||||
func (m *TestManager) IsInstalled(pkg string) (bool, error) {
|
||||
if m.IsInstalledFunc != nil {
|
||||
return m.IsInstalledFunc(pkg)
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func TestInstallBuildDeps(t *testing.T) {
|
||||
type testEnv struct {
|
||||
pf PackageFinder
|
||||
vars *types.BuildVars
|
||||
opts types.BuildOpts
|
||||
|
||||
// Contains pkgs captured by FindPkgsFunc
|
||||
capturedPkgs []string
|
||||
}
|
||||
|
||||
type testCase struct {
|
||||
Name string
|
||||
Prepare func() *testEnv
|
||||
Expected func(t *testing.T, e *testEnv, res []string, err error)
|
||||
}
|
||||
|
||||
for _, tc := range []testCase{
|
||||
{
|
||||
Name: "install only needed deps",
|
||||
Prepare: func() *testEnv {
|
||||
pf := TestPackageFinder{}
|
||||
vars := types.BuildVars{}
|
||||
m := TestManager{}
|
||||
opts := types.BuildOpts{
|
||||
Manager: &m,
|
||||
Interactive: false,
|
||||
}
|
||||
|
||||
env := &testEnv{
|
||||
pf: &pf,
|
||||
vars: &vars,
|
||||
opts: opts,
|
||||
capturedPkgs: []string{},
|
||||
}
|
||||
|
||||
pf.FindPkgsFunc = func(ctx context.Context, pkgs []string) (map[string][]db.Package, []string, error) {
|
||||
env.capturedPkgs = append(env.capturedPkgs, pkgs...)
|
||||
result := make(map[string][]db.Package)
|
||||
result["bar"] = []db.Package{{
|
||||
Name: "bar-pkg",
|
||||
}}
|
||||
result["buz"] = []db.Package{{
|
||||
Name: "buz-pkg",
|
||||
}}
|
||||
|
||||
return result, []string{}, nil
|
||||
}
|
||||
|
||||
vars.BuildDepends = []string{
|
||||
"foo",
|
||||
"bar",
|
||||
"buz",
|
||||
}
|
||||
m.IsInstalledFunc = func(pkg string) (bool, error) {
|
||||
if pkg == "foo" {
|
||||
return true, nil
|
||||
} else {
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
|
||||
return env
|
||||
},
|
||||
Expected: func(t *testing.T, e *testEnv, res []string, err error) {
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, res, 2)
|
||||
assert.ElementsMatch(t, res, []string{"bar-pkg", "buz-pkg"})
|
||||
|
||||
assert.ElementsMatch(t, e.capturedPkgs, []string{"bar", "buz"})
|
||||
},
|
||||
},
|
||||
} {
|
||||
t.Run(tc.Name, func(tt *testing.T) {
|
||||
ctx := context.Background()
|
||||
env := tc.Prepare()
|
||||
|
||||
result, err := installBuildDeps(
|
||||
ctx,
|
||||
env.pf,
|
||||
env.vars,
|
||||
env.opts,
|
||||
)
|
||||
|
||||
tc.Expected(tt, env, result, err)
|
||||
})
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user