dep_graph_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package dep
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "os"
  8. "testing"
  9. aurc "github.com/Jguer/aur"
  10. "github.com/stretchr/testify/require"
  11. "github.com/Jguer/yay/v11/pkg/db"
  12. "github.com/Jguer/yay/v11/pkg/db/mock"
  13. mockaur "github.com/Jguer/yay/v11/pkg/dep/mock"
  14. aur "github.com/Jguer/yay/v11/pkg/query"
  15. "github.com/Jguer/yay/v11/pkg/text"
  16. )
  17. func ptrString(s string) *string {
  18. return &s
  19. }
  20. func getFromFile(t *testing.T, filePath string) mockaur.GetFunc {
  21. f, err := os.Open(filePath)
  22. require.NoError(t, err)
  23. fBytes, err := io.ReadAll(f)
  24. require.NoError(t, err)
  25. pkgs := []aur.Pkg{}
  26. err = json.Unmarshal(fBytes, &pkgs)
  27. require.NoError(t, err)
  28. return func(ctx context.Context, query *aurc.Query) ([]aur.Pkg, error) {
  29. return pkgs, nil
  30. }
  31. }
  32. func TestGrapher_GraphFromTargets_jellyfin(t *testing.T) {
  33. mockDB := &mock.DBExecutor{
  34. SyncPackageFn: func(string) mock.IPackage { return nil },
  35. SyncSatisfierFn: func(s string) mock.IPackage {
  36. switch s {
  37. case "jellyfin":
  38. return nil
  39. case "dotnet-runtime-6.0":
  40. return &mock.Package{
  41. PName: "dotnet-runtime-6.0",
  42. PBase: "dotnet-runtime-6.0",
  43. PVersion: "6.0.100-1",
  44. PDB: mock.NewDB("community"),
  45. }
  46. case "dotnet-sdk-6.0":
  47. return &mock.Package{
  48. PName: "dotnet-sdk-6.0",
  49. PBase: "dotnet-sdk-6.0",
  50. PVersion: "6.0.100-1",
  51. PDB: mock.NewDB("community"),
  52. }
  53. }
  54. return nil
  55. },
  56. PackagesFromGroupFn: func(string) []mock.IPackage { return nil },
  57. LocalSatisfierExistsFn: func(s string) bool {
  58. switch s {
  59. case "dotnet-sdk-6.0", "dotnet-runtime-6.0", "jellyfin-server=10.8.8", "jellyfin-web=10.8.8":
  60. return false
  61. }
  62. return true
  63. },
  64. }
  65. mockAUR := &mockaur.MockAUR{GetFn: func(ctx context.Context, query *aurc.Query) ([]aur.Pkg, error) {
  66. if query.Needles[0] == "jellyfin" {
  67. jfinFn := getFromFile(t, "testdata/jellyfin.json")
  68. return jfinFn(ctx, query)
  69. }
  70. if query.Needles[0] == "jellyfin-web" {
  71. jfinWebFn := getFromFile(t, "testdata/jellyfin-web.json")
  72. return jfinWebFn(ctx, query)
  73. }
  74. if query.Needles[0] == "jellyfin-server" {
  75. jfinServerFn := getFromFile(t, "testdata/jellyfin-server.json")
  76. return jfinServerFn(ctx, query)
  77. }
  78. panic(fmt.Sprintf("implement me %v", query.Needles))
  79. }}
  80. type fields struct {
  81. dbExecutor db.Executor
  82. aurCache aurc.QueryClient
  83. noDeps bool
  84. noCheckDeps bool
  85. }
  86. type args struct {
  87. targets []string
  88. }
  89. tests := []struct {
  90. name string
  91. fields fields
  92. args args
  93. want []map[string]*InstallInfo
  94. wantErr bool
  95. }{
  96. {
  97. name: "noDeps",
  98. fields: fields{
  99. dbExecutor: mockDB,
  100. aurCache: mockAUR,
  101. noDeps: true,
  102. noCheckDeps: false,
  103. },
  104. args: args{
  105. targets: []string{"jellyfin"},
  106. },
  107. want: []map[string]*InstallInfo{
  108. {
  109. "jellyfin": {
  110. Source: AUR,
  111. Reason: Explicit,
  112. Version: "10.8.8-1",
  113. AURBase: ptrString("jellyfin"),
  114. },
  115. },
  116. {
  117. "dotnet-sdk-6.0": {
  118. Source: Sync,
  119. Reason: MakeDep,
  120. Version: "6.0.100-1",
  121. SyncDBName: ptrString("community"),
  122. },
  123. },
  124. },
  125. wantErr: false,
  126. },
  127. {
  128. name: "deps",
  129. fields: fields{
  130. dbExecutor: mockDB,
  131. aurCache: mockAUR,
  132. noDeps: false,
  133. noCheckDeps: false,
  134. },
  135. args: args{
  136. targets: []string{"jellyfin"},
  137. },
  138. want: []map[string]*InstallInfo{
  139. {
  140. "jellyfin": {
  141. Source: AUR,
  142. Reason: Explicit,
  143. Version: "10.8.8-1",
  144. AURBase: ptrString("jellyfin"),
  145. },
  146. },
  147. {
  148. "jellyfin-web": {
  149. Source: AUR,
  150. Reason: Dep,
  151. Version: "10.8.8-1",
  152. AURBase: ptrString("jellyfin"),
  153. },
  154. "jellyfin-server": {
  155. Source: AUR,
  156. Reason: Dep,
  157. Version: "10.8.8-1",
  158. AURBase: ptrString("jellyfin"),
  159. },
  160. },
  161. {
  162. "dotnet-sdk-6.0": {
  163. Source: Sync,
  164. Reason: MakeDep,
  165. Version: "6.0.100-1",
  166. SyncDBName: ptrString("community"),
  167. },
  168. "dotnet-runtime-6.0": {
  169. Source: Sync,
  170. Reason: Dep,
  171. Version: "6.0.100-1",
  172. SyncDBName: ptrString("community"),
  173. },
  174. },
  175. },
  176. wantErr: false,
  177. },
  178. }
  179. for _, tt := range tests {
  180. t.Run(tt.name, func(t *testing.T) {
  181. g := NewGrapher(tt.fields.dbExecutor,
  182. tt.fields.aurCache, false, true,
  183. tt.fields.noDeps, tt.fields.noCheckDeps, false,
  184. text.NewLogger(io.Discard, &os.File{}, true, "test"))
  185. got, err := g.GraphFromTargets(context.Background(), nil, tt.args.targets)
  186. require.NoError(t, err)
  187. layers := got.TopoSortedLayerMap(nil)
  188. require.EqualValues(t, tt.want, layers, layers)
  189. })
  190. }
  191. }