From df4615c1b745086d9977a96a51ae56fe16ef5ee1 Mon Sep 17 00:00:00 2001 From: miaoheng <2020745908@qq.com> Date: Fri, 28 Aug 2026 18:40:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Windows=20?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=8C=85=E5=AE=89=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/service/plugin_package.go | 10 +++++++++- backend/internal/service/plugin_package_test.go | 6 +++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/internal/service/plugin_package.go b/backend/internal/service/plugin_package.go index 2ef9130b0c21..c183f1b12e68 100644 --- a/backend/internal/service/plugin_package.go +++ b/backend/internal/service/plugin_package.go @@ -107,7 +107,11 @@ func (i *PluginPackageInstaller) Install(ctx context.Context, reader io.Reader, if err != nil { return nil, fmt.Errorf("插件包不是有效的 ZIP: %w", err) } - defer func() { _ = archive.Close() }() + defer func() { + if archive != nil { + _ = archive.Close() + } + }() manifest, _, signatureStatus, err := i.inspectArchive(&archive.Reader) if err != nil { return nil, err @@ -137,6 +141,10 @@ func (i *PluginPackageInstaller) Install(ctx context.Context, reader io.Reader, if err := i.extractArchive(ctx, &archive.Reader, manifest, extractPath); err != nil { return nil, err } + if err := archive.Close(); err != nil { + return nil, fmt.Errorf("关闭插件归档: %w", err) + } + archive = nil if err := os.Rename(extractPath, installPath); err != nil { return nil, fmt.Errorf("提交插件安装目录: %w", err) } diff --git a/backend/internal/service/plugin_package_test.go b/backend/internal/service/plugin_package_test.go index cd0e42de1a22..a279ccd6c559 100644 --- a/backend/internal/service/plugin_package_test.go +++ b/backend/internal/service/plugin_package_test.go @@ -12,6 +12,7 @@ import ( "encoding/json" "os" "path/filepath" + "runtime" "testing" "github.com/Wei-Shaw/sub2api/internal/config" @@ -33,7 +34,10 @@ func TestPluginPackageInstallerInstallUnsignedDevelopmentPackage(t *testing.T) { assert.FileExists(t, installation.ArtifactPath) info, statErr := os.Stat(installation.BinaryPath) require.NoError(t, statErr) - assert.NotZero(t, info.Mode()&0o100) + assert.True(t, info.Mode().IsRegular()) + if runtime.GOOS != "windows" { + assert.NotZero(t, info.Mode()&0o100) + } assert.Contains(t, installation.InstallPath, filepath.Join("installed", "com.example.openai-transport")) } From 37fb22e29b3d56210e2221cee65aee9138b86bd3 Mon Sep 17 00:00:00 2001 From: miaoheng <2020745908@qq.com> Date: Fri, 28 Aug 2026 18:40:40 +0800 Subject: [PATCH 2/2] =?UTF-8?q?test:=20=E7=A8=B3=E5=AE=9A=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E5=AE=A1=E8=AE=A1=E5=BF=AB=E7=85=A7=E5=88=B7=E6=96=B0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/content_moderation_runtime_cache_test.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/internal/service/content_moderation_runtime_cache_test.go b/backend/internal/service/content_moderation_runtime_cache_test.go index 2b34d1fa578d..329e89544d29 100644 --- a/backend/internal/service/content_moderation_runtime_cache_test.go +++ b/backend/internal/service/content_moderation_runtime_cache_test.go @@ -265,13 +265,19 @@ func TestContentModerationRuntimeSnapshotRefreshFailureKeepsStaleConfig(t *testi SettingKeyRiskControlEnabled: "true", SettingKeyContentModerationConfig: runtimeCacheTestConfig(t, "blocked"), }} - svc := runtimeCacheTestService(repo, time.Nanosecond) + svc := runtimeCacheTestService(repo, time.Minute) input := runtimeCacheTestInput("blocked") decision, err := svc.Check(context.Background(), input) require.NoError(t, err) require.True(t, decision.Blocked) + current := svc.runtimeSnapshot.Load() + require.NotNil(t, current) + expired := *current + expired.loadedAt = time.Now().Add(-2 * time.Minute) + svc.runtimeSnapshot.Store(&expired) + repo.failMultiple(errors.New("database unavailable")) decision, err = svc.Check(context.Background(), input) require.NoError(t, err)