Skip to content

Commit bf13cb4

Browse files
Merge pull request #483 from benluddy/listbundles-channel-entry-replacement
Bug 1889388: Set replaces in ListBundles query result using channel entries.
2 parents bd802a0 + 33f6275 commit bf13cb4

File tree

2 files changed

+104
-12
lines changed

2 files changed

+104
-12
lines changed

pkg/sqlite/query.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -924,19 +924,20 @@ func (s *SQLQuerier) GetCurrentCSVNameForChannel(ctx context.Context, pkgName, c
924924
return "", nil
925925
}
926926

927-
func (s *SQLQuerier) ListBundles(ctx context.Context) ([]*api.Bundle, error) {
928-
query := `SELECT DISTINCT channel_entry.entry_id, operatorbundle.bundle, operatorbundle.bundlepath,
929-
channel_entry.operatorbundle_name, channel_entry.package_name, channel_entry.channel_name, operatorbundle.replaces, operatorbundle.skips,
930-
operatorbundle.version, operatorbundle.skiprange,
931-
dependencies.type, dependencies.value,
932-
properties.type, properties.value
933-
FROM channel_entry
934-
INNER JOIN operatorbundle ON operatorbundle.name = channel_entry.operatorbundle_name
935-
LEFT OUTER JOIN dependencies ON dependencies.operatorbundle_name = channel_entry.operatorbundle_name
936-
LEFT OUTER JOIN properties ON properties.operatorbundle_name = channel_entry.operatorbundle_name
937-
INNER JOIN package ON package.name = channel_entry.package_name`
927+
const listBundlesQuery = `SELECT DISTINCT channel_entry.entry_id, operatorbundle.bundle, operatorbundle.bundlepath,
928+
channel_entry.operatorbundle_name, channel_entry.package_name, channel_entry.channel_name, replaced_entry.operatorbundle_name, operatorbundle.skips,
929+
operatorbundle.version, operatorbundle.skiprange,
930+
dependencies.type, dependencies.value,
931+
properties.type, properties.value
932+
FROM channel_entry
933+
LEFT OUTER JOIN channel_entry AS replaced_entry ON channel_entry.replaces = replaced_entry.entry_id
934+
INNER JOIN operatorbundle ON operatorbundle.name = channel_entry.operatorbundle_name
935+
LEFT OUTER JOIN dependencies ON dependencies.operatorbundle_name = channel_entry.operatorbundle_name
936+
LEFT OUTER JOIN properties ON properties.operatorbundle_name = channel_entry.operatorbundle_name
937+
INNER JOIN package ON package.name = channel_entry.package_name`
938938

939-
rows, err := s.db.QueryContext(ctx, query)
939+
func (s *SQLQuerier) ListBundles(ctx context.Context) ([]*api.Bundle, error) {
940+
rows, err := s.db.QueryContext(ctx, listBundlesQuery)
940941
if err != nil {
941942
return nil, err
942943
}

pkg/sqlite/query_sql_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package sqlite
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"testing"
7+
8+
_ "github.com/mattn/go-sqlite3"
9+
)
10+
11+
func TestListBundlesQuery(t *testing.T) {
12+
for _, tt := range []struct {
13+
Name string
14+
Setup func(t *testing.T, db *sql.DB)
15+
Expect func(t *testing.T, rows *sql.Rows)
16+
}{
17+
{
18+
Name: "replacement comes from channel entry",
19+
Setup: func(t *testing.T, db *sql.DB) {
20+
for _, stmt := range []string{
21+
`insert into package (name, default_channel) values ("package", "channel")`,
22+
`insert into channel (name, package_name, head_operatorbundle_name) values ("channel", "package", "bundle")`,
23+
`insert into operatorbundle (name) values ("bundle-a"), ("bundle-b")`,
24+
`insert into channel_entry (package_name, channel_name, operatorbundle_name, entry_id, replaces) values ("package", "channel", "bundle-a", 1, 2)`,
25+
`insert into channel_entry (package_name, channel_name, operatorbundle_name, entry_id) values ("package", "channel", "bundle-b", 2)`,
26+
} {
27+
if _, err := db.Exec(stmt); err != nil {
28+
t.Fatalf("unexpected error executing setup statements: %v", err)
29+
}
30+
}
31+
32+
},
33+
Expect: func(t *testing.T, rows *sql.Rows) {
34+
replacements := map[sql.NullString]sql.NullString{
35+
sql.NullString{String: "bundle-a", Valid: true}: sql.NullString{String: "bundle-b", Valid: true},
36+
sql.NullString{String: "bundle-b", Valid: true}: sql.NullString{Valid: false},
37+
}
38+
for rows.Next() {
39+
var (
40+
c interface{}
41+
name, actual sql.NullString
42+
)
43+
if err := rows.Scan(&c, &c, &c, &name, &c, &c, &actual, &c, &c, &c, &c, &c, &c, &c); err != nil {
44+
t.Fatalf("unexpected error during row scan: %v", err)
45+
}
46+
expected, ok := replacements[name]
47+
if !ok {
48+
t.Errorf("unexpected name: %v", name)
49+
continue
50+
}
51+
delete(replacements, name)
52+
if actual != expected {
53+
t.Errorf("got replacement %v for %v, expected %v", actual, name, expected)
54+
continue
55+
}
56+
}
57+
for replacer, replacee := range replacements {
58+
t.Errorf("missing expected result row: %v replaces %v", replacer, replacee)
59+
}
60+
},
61+
},
62+
} {
63+
t.Run(tt.Name, func(t *testing.T) {
64+
ctx := context.Background()
65+
66+
db, err := sql.Open("sqlite3", ":memory:")
67+
if err != nil {
68+
t.Fatalf("unable to open in-memory sqlite database: %v", err)
69+
}
70+
71+
m, err := NewSQLLiteMigrator(db)
72+
if err != nil {
73+
t.Fatalf("unable to create database migrator: %v", err)
74+
}
75+
76+
if err := m.Migrate(ctx); err != nil {
77+
t.Fatalf("failed to perform initial schema migration: %v", err)
78+
}
79+
80+
tt.Setup(t, db)
81+
82+
rows, err := db.QueryContext(ctx, listBundlesQuery)
83+
if err != nil {
84+
t.Fatalf("unexpected error executing list bundles query: %v", err)
85+
}
86+
defer rows.Close()
87+
88+
tt.Expect(t, rows)
89+
})
90+
}
91+
}

0 commit comments

Comments
 (0)