// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package integration import ( "archive/zip" "bytes" "fmt" "io" "strings" "testing" "code.gitea.io/gitea/models/db" packages_model "code.gitea.io/gitea/models/packages" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/log" packages_module "code.gitea.io/gitea/modules/packages" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/test" doctor "code.gitea.io/gitea/services/doctor" packages_service "code.gitea.io/gitea/services/packages" "code.gitea.io/gitea/tests" "github.com/stretchr/testify/assert" ) func TestDoctorPackagesNuget(t *testing.T) { defer tests.PrepareTestEnv(t, 1)() // use local storage for tests because minio is too flaky defer test.MockVariableValue(&setting.Packages.Storage.Type, setting.LocalStorageType)() logger := log.GetLogger("doctor") ctx := db.DefaultContext packageName := "test.package" packageVersion := "1.0.3" packageAuthors := "KN4CK3R" packageDescription := "Gitea Test Package" createPackage := func(id, version string) io.Reader { var buf bytes.Buffer archive := zip.NewWriter(&buf) w, _ := archive.Create("package.nuspec") w.Write([]byte(` ` + id + ` ` + version + ` ` + packageAuthors + ` ` + packageDescription + ` `)) archive.Close() return &buf } pkg := createPackage(packageName, packageVersion) pkgBuf, err := packages_module.CreateHashedBufferFromReader(pkg) assert.NoError(t, err, "Error creating hashed buffer from nupkg") defer pkgBuf.Close() doer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) assert.NoError(t, err, "Error getting user by ID 2") t.Run("PackagesNugetNuspecCheck", func(t *testing.T) { defer tests.PrintCurrentTest(t)() pi := &packages_service.PackageInfo{ Owner: doer, PackageType: packages_model.TypeNuGet, Name: packageName, Version: packageVersion, } _, _, err := packages_service.CreatePackageAndAddFile( ctx, &packages_service.PackageCreationInfo{ PackageInfo: *pi, SemverCompatible: true, Creator: doer, Metadata: nil, }, &packages_service.PackageFileCreationInfo{ PackageFileInfo: packages_service.PackageFileInfo{ Filename: strings.ToLower(fmt.Sprintf("%s.%s.nupkg", packageName, packageVersion)), }, Creator: doer, Data: pkgBuf, IsLead: true, }, ) assert.NoError(t, err, "Error creating package and adding file") assert.NoError(t, doctor.PackagesNugetNuspecCheck(ctx, logger, true), "Doctor check failed") s, _, pf, err := packages_service.GetFileStreamByPackageNameAndVersion( ctx, &packages_service.PackageInfo{ Owner: doer, PackageType: packages_model.TypeNuGet, Name: packageName, Version: packageVersion, }, &packages_service.PackageFileInfo{ Filename: strings.ToLower(fmt.Sprintf("%s.nuspec", packageName)), }, ) assert.NoError(t, err, "Error getting nuspec file stream by package name and version") defer s.Close() assert.Equal(t, fmt.Sprintf("%s.nuspec", packageName), pf.Name, "Not a nuspec") }) }