Skip to content

Commit eb85681

Browse files
earl-warrenEarl Warren
authored andcommitted
fix: package_blob.has_blake2b may be null (go-gitea#7520)
- When looking for an existing blob, has_blake2b will be null when it was created prior to v26 migration in v11, when the field was introduced. - Add unit test and minimal refactoring to load fixtures. The AddFixture function should not be where it currently is because it cannot be used by some packages (circular import). But that's a refactor that needs to be elsewhere for backporting purposes. Fixes https://codeberg.org/forgejo/forgejo/issues/7519 Co-authored-by: Earl Warren <[email protected]> Co-committed-by: Earl Warren <[email protected]>
1 parent eb3feaa commit eb85681

File tree

5 files changed

+126
-17
lines changed

5 files changed

+126
-17
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-
2+
id: 1
3+
size: 10
4+
hash_md5: HASHMD5_1
5+
hash_sha1: HASHSHA1_1
6+
hash_sha256: HASHSHA256_1
7+
hash_sha512: HASHSHA512_1
8+
hash_blake2b: HASHBLAKE2B_1
9+
created_unix: 946687980
10+
-
11+
id: 2
12+
size: 20
13+
hash_md5: HASHMD5_2
14+
hash_sha1: HASHSHA1_2
15+
hash_sha256: HASHSHA256_2
16+
hash_sha512: HASHSHA512_2
17+
created_unix: 946687980

models/packages/main_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright 2020 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package packages
5+
6+
import (
7+
"path/filepath"
8+
"testing"
9+
10+
"forgejo.org/models/unittest"
11+
"forgejo.org/modules/setting"
12+
13+
_ "forgejo.org/models"
14+
_ "forgejo.org/models/actions"
15+
_ "forgejo.org/models/activities"
16+
_ "forgejo.org/models/forgefed"
17+
)
18+
19+
func AddFixtures(dirs ...string) func() {
20+
return unittest.OverrideFixtures(
21+
unittest.FixturesOptions{
22+
Dir: filepath.Join(setting.AppWorkPath, "models/fixtures/"),
23+
Base: setting.AppWorkPath,
24+
Dirs: dirs,
25+
},
26+
)
27+
}
28+
29+
func TestMain(m *testing.M) {
30+
unittest.MainTest(m)
31+
}

models/packages/package_blob.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,19 @@ func GetOrInsertBlob(ctx context.Context, pb *PackageBlob) (*PackageBlob, bool,
4444

4545
existing := &PackageBlob{}
4646

47-
has, err := e.Where(builder.Eq{
48-
"size": pb.Size,
49-
"hash_md5": pb.HashMD5,
50-
"hash_sha1": pb.HashSHA1,
51-
"hash_sha256": pb.HashSHA256,
52-
"hash_sha512": pb.HashSHA512,
53-
"hash_blake2b": pb.HashBlake2b,
54-
}).Get(existing)
47+
has, err := e.Where(builder.And(
48+
builder.Eq{
49+
"size": pb.Size,
50+
"hash_md5": pb.HashMD5,
51+
"hash_sha1": pb.HashSHA1,
52+
"hash_sha256": pb.HashSHA256,
53+
"hash_sha512": pb.HashSHA512,
54+
},
55+
builder.Or(
56+
builder.Eq{"hash_blake2b": pb.HashBlake2b},
57+
builder.IsNull{"hash_blake2b"},
58+
),
59+
)).Get(existing)
5560
if err != nil {
5661
return nil, false, err
5762
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright 2025 The Forgejo Authors.
2+
// SPDX-License-Identifier: GPL-3.0-or-later
3+
4+
package packages
5+
6+
import (
7+
"testing"
8+
9+
"forgejo.org/models/unittest"
10+
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
13+
)
14+
15+
func TestPackagesGetOrInsertBlob(t *testing.T) {
16+
defer AddFixtures("models/fixtures/TestPackagesGetOrInsertBlob/")()
17+
require.NoError(t, unittest.PrepareTestDatabase())
18+
19+
blake2bIsSet := unittest.AssertExistsAndLoadBean(t, &PackageBlob{ID: 1})
20+
blake2bNotSet := unittest.AssertExistsAndLoadBean(t, &PackageBlob{ID: 2})
21+
22+
var blake2bSetToRandom PackageBlob
23+
blake2bSetToRandom = *blake2bNotSet
24+
blake2bSetToRandom.HashBlake2b = "SOMETHING RANDOM"
25+
26+
for _, testCase := range []struct {
27+
name string
28+
exists bool
29+
packageBlob *PackageBlob
30+
}{
31+
{
32+
name: "exists and blake2b is not null in the database",
33+
exists: true,
34+
packageBlob: blake2bIsSet,
35+
},
36+
{
37+
name: "exists and blake2b is null in the database",
38+
exists: true,
39+
packageBlob: &blake2bSetToRandom,
40+
},
41+
{
42+
name: "does not exists",
43+
exists: false,
44+
packageBlob: &PackageBlob{
45+
Size: 30,
46+
HashMD5: "HASHMD5_3",
47+
HashSHA1: "HASHSHA1_3",
48+
HashSHA256: "HASHSHA256_3",
49+
HashSHA512: "HASHSHA512_3",
50+
HashBlake2b: "HASHBLAKE2B_3",
51+
},
52+
},
53+
} {
54+
t.Run(testCase.name, func(t *testing.T) {
55+
found, has, _ := GetOrInsertBlob(t.Context(), testCase.packageBlob)
56+
assert.Equal(t, testCase.exists, has)
57+
require.NotNil(t, found)
58+
if testCase.exists {
59+
assert.Equal(t, found.ID, testCase.packageBlob.ID)
60+
} else {
61+
unittest.BeanExists(t, &PackageBlob{ID: found.ID})
62+
}
63+
})
64+
}
65+
}

models/packages/package_test.go

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,9 @@ import (
1313
"forgejo.org/models/unittest"
1414
user_model "forgejo.org/models/user"
1515

16-
_ "forgejo.org/models"
17-
_ "forgejo.org/models/actions"
18-
_ "forgejo.org/models/activities"
19-
_ "forgejo.org/models/forgefed"
20-
2116
"github.com/stretchr/testify/require"
2217
)
2318

24-
func TestMain(m *testing.M) {
25-
unittest.MainTest(m)
26-
}
27-
2819
func prepareExamplePackage(t *testing.T) *packages_model.Package {
2920
require.NoError(t, unittest.PrepareTestDatabase())
3021

0 commit comments

Comments
 (0)