eintopf.info@v0.13.16/service/group/testutil/store.go (about)

     1  // Copyright (C) 2022 The Eintopf authors
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <https://www.gnu.org/licenses/>.
    15  
    16  package testutil
    17  
    18  import (
    19  	"context"
    20  	"testing"
    21  
    22  	"eintopf.info/internal/crud"
    23  	"eintopf.info/service/group"
    24  )
    25  
    26  type newStore func() (group.Storer, func(), error)
    27  
    28  // TestStore tests if a given group.Service acts as a group store.
    29  func TestStore(t *testing.T, newStore newStore) {
    30  	ctx := context.Background()
    31  	t.Helper()
    32  	t.Run("FindNoMatch", func(tt *testing.T) {
    33  		store, cleanup, err := newStore()
    34  		if err != nil {
    35  			tt.Fatalf("Failed to create a new store: %s", err)
    36  		}
    37  		defer cleanup()
    38  
    39  		group, err := store.FindByID(ctx, "test")
    40  		if err != nil {
    41  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
    42  		}
    43  		if group != nil {
    44  			tt.Fatalf("expected to group to be nil. got %v", group)
    45  		}
    46  	})
    47  
    48  	t.Run("CreateFindByID", func(tt *testing.T) {
    49  		store, cleanup, err := newStore()
    50  		if err != nil {
    51  			tt.Fatalf("Failed to create a new store: %s", err)
    52  		}
    53  		defer cleanup()
    54  
    55  		group1, _ := store.Create(ctx, &group.NewGroup{Name: "group1"})
    56  		group, err := store.FindByID(ctx, group1.ID)
    57  		if err != nil {
    58  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
    59  		}
    60  		if group.ID != group1.ID || group.Name != group1.Name {
    61  			tt.Fatalf("expected to find group1. got %v. want %v", group, group1)
    62  		}
    63  	})
    64  
    65  	t.Run("CreateFind", func(tt *testing.T) {
    66  		store, cleanup, err := newStore()
    67  		if err != nil {
    68  			tt.Fatalf("Failed to create a new store: %s", err)
    69  		}
    70  		defer cleanup()
    71  
    72  		store.Create(ctx, &group.NewGroup{Name: "group1"})
    73  		store.Create(ctx, &group.NewGroup{Name: "group2"})
    74  		groups, totalGroups, err := store.Find(ctx, nil)
    75  		if err != nil {
    76  			tt.Fatalf("expected store.FindAll to succeed. got %s", err.Error())
    77  		}
    78  		if len(groups) != 2 {
    79  			tt.Fatalf("expected to recieve two groups. got %d", len(groups))
    80  		}
    81  		if totalGroups != 2 {
    82  			tt.Fatalf("expected to recieve a total of two groups. got %d", totalGroups)
    83  		}
    84  	})
    85  
    86  	t.Run("CreateFindFilter", func(tt *testing.T) {
    87  		store, cleanup, err := newStore()
    88  		if err != nil {
    89  			tt.Fatalf("Failed to create a new store: %s", err)
    90  		}
    91  		defer cleanup()
    92  
    93  		group1, _ := store.Create(ctx, &group.NewGroup{Name: "group1"})
    94  		group2, _ := store.Create(ctx, &group.NewGroup{Name: "group2"})
    95  		groups, totalGroups, err := store.Find(ctx, &crud.FindParams[group.FindFilters]{
    96  			Filters: &group.FindFilters{Name: &group1.Name},
    97  		})
    98  		if err != nil {
    99  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   100  		}
   101  		if len(groups) != 1 {
   102  			tt.Fatalf("expected to recieve one group. got %d", len(groups))
   103  		}
   104  		if totalGroups != 1 {
   105  			tt.Fatalf("expected to recieve a total of one group. got %d", totalGroups)
   106  		}
   107  		if groups[0].ID != group1.ID {
   108  			tt.Fatalf("expected to find group1. got %v. want %v", groups[0], group1)
   109  		}
   110  
   111  		groups, totalGroups, err = store.Find(ctx, &crud.FindParams[group.FindFilters]{
   112  			Filters: &group.FindFilters{NotID: &group1.ID},
   113  		})
   114  		if err != nil {
   115  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   116  		}
   117  		if len(groups) != 1 {
   118  			tt.Fatalf("expected to recieve one group. got %d", len(groups))
   119  		}
   120  		if totalGroups != 1 {
   121  			tt.Fatalf("expected to recieve a total of one group. got %d", totalGroups)
   122  		}
   123  		if groups[0].ID != group2.ID {
   124  			tt.Fatalf("expected to find group1. got %v. want %v", groups[0], group2)
   125  		}
   126  	})
   127  
   128  	t.Run("CreateFindSortedASC", func(tt *testing.T) {
   129  		store, cleanup, err := newStore()
   130  		if err != nil {
   131  			tt.Fatalf("Failed to create a new store: %s", err)
   132  		}
   133  		defer cleanup()
   134  
   135  		group1, _ := store.Create(ctx, &group.NewGroup{Name: "c group1"})
   136  		group2, _ := store.Create(ctx, &group.NewGroup{Name: "a group2"})
   137  		group3, _ := store.Create(ctx, &group.NewGroup{Name: "b group3"})
   138  		groups, totalGroups, err := store.Find(ctx, &crud.FindParams[group.FindFilters]{
   139  			Sort:  "name",
   140  			Order: crud.OrderAsc,
   141  		})
   142  		if err != nil {
   143  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   144  		}
   145  		if len(groups) != 3 {
   146  			tt.Fatalf("expected to find three group. got %d", len(groups))
   147  		}
   148  		if totalGroups != 3 {
   149  			tt.Fatalf("expected to recieve a total of three groups. got %d", totalGroups)
   150  		}
   151  		if groups[0].ID != group2.ID {
   152  			tt.Fatalf("expected to group[0] to be group2 . got %v", groups[0])
   153  		}
   154  		if groups[1].ID != group3.ID {
   155  			tt.Fatalf("expected to group[1] to be group3 . got %v", groups[1])
   156  		}
   157  		if groups[2].ID != group1.ID {
   158  			tt.Fatalf("expected to group[2] to be group1 . got %v", groups[2])
   159  		}
   160  	})
   161  
   162  	t.Run("CreateFindSortedDESC", func(tt *testing.T) {
   163  		store, cleanup, err := newStore()
   164  		if err != nil {
   165  			tt.Fatalf("Failed to create a new store: %s", err)
   166  		}
   167  		defer cleanup()
   168  
   169  		group1, _ := store.Create(ctx, &group.NewGroup{Name: "c group1"})
   170  		group2, _ := store.Create(ctx, &group.NewGroup{Name: "a group2"})
   171  		group3, _ := store.Create(ctx, &group.NewGroup{Name: "b group3"})
   172  		groups, totalGroups, err := store.Find(ctx, &crud.FindParams[group.FindFilters]{
   173  			Sort:  "name",
   174  			Order: crud.OrderDesc,
   175  		})
   176  		if err != nil {
   177  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   178  		}
   179  		if len(groups) != 3 {
   180  			tt.Fatalf("expected to find three group. got %d", len(groups))
   181  		}
   182  		if totalGroups != 3 {
   183  			tt.Fatalf("expected to recieve a total of three groups. got %d", totalGroups)
   184  		}
   185  		if groups[0].ID != group1.ID {
   186  			tt.Fatalf("expected to group[0] to be group1 . got %v", groups[0])
   187  		}
   188  		if groups[1].ID != group3.ID {
   189  			tt.Fatalf("expected to group[1] to be group3 . got %v", groups[1])
   190  		}
   191  		if groups[2].ID != group2.ID {
   192  			tt.Fatalf("expected to group[2] to be group2 . got %v", groups[2])
   193  		}
   194  	})
   195  
   196  	t.Run("CreateFindPaginated", func(tt *testing.T) {
   197  		store, cleanup, err := newStore()
   198  		if err != nil {
   199  			tt.Fatalf("Failed to create a new store: %s", err)
   200  		}
   201  		defer cleanup()
   202  
   203  		store.Create(ctx, &group.NewGroup{Name: "group1"})
   204  		group2, _ := store.Create(ctx, &group.NewGroup{Name: "group2"})
   205  		store.Create(ctx, &group.NewGroup{Name: "group3"})
   206  		groups, totalGroups, err := store.Find(ctx, &crud.FindParams[group.FindFilters]{
   207  			Limit:  1,
   208  			Offset: 1,
   209  		})
   210  		if err != nil {
   211  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   212  		}
   213  		if len(groups) != 1 {
   214  			tt.Fatalf("expected to find one group. got %d", len(groups))
   215  		}
   216  		if totalGroups != 3 {
   217  			tt.Fatalf("expected to recieve a total of three groups. got %d", totalGroups)
   218  		}
   219  		if groups[0].ID != group2.ID || groups[0].Name != group2.Name {
   220  			tt.Fatalf("expected to find group2. got %v. want %v", groups[0], group2)
   221  		}
   222  	})
   223  
   224  	t.Run("CreateFindPaginatedAndSorted", func(tt *testing.T) {
   225  		store, cleanup, err := newStore()
   226  		if err != nil {
   227  			tt.Fatalf("Failed to create a new store: %s", err)
   228  		}
   229  		defer cleanup()
   230  
   231  		group1, _ := store.Create(ctx, &group.NewGroup{Name: "c group1"})
   232  		store.Create(ctx, &group.NewGroup{Name: "a group2"})
   233  		store.Create(ctx, &group.NewGroup{Name: "b group3"})
   234  		groups, totalGroups, err := store.Find(ctx, &crud.FindParams[group.FindFilters]{
   235  			Limit:  1,
   236  			Offset: 2,
   237  			Sort:   "name",
   238  			Order:  crud.OrderAsc,
   239  		})
   240  		if err != nil {
   241  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   242  		}
   243  		if len(groups) != 1 {
   244  			tt.Fatalf("expected to find one group. got %d", len(groups))
   245  		}
   246  		if totalGroups != 3 {
   247  			tt.Fatalf("expected to recieve a total of three groups. got %d", totalGroups)
   248  		}
   249  		if groups[0].ID != group1.ID {
   250  			tt.Fatalf("expected to group[0] to be group1 . got %v", groups[0])
   251  		}
   252  	})
   253  
   254  	t.Run("CreateUpdate", func(tt *testing.T) {
   255  		store, cleanup, err := newStore()
   256  		if err != nil {
   257  			tt.Fatalf("Failed to create a new store: %s", err)
   258  		}
   259  		defer cleanup()
   260  
   261  		group1, _ := store.Create(ctx, &group.NewGroup{Name: "group3"})
   262  		group1.Name = "group3.1"
   263  
   264  		_, err = store.Update(ctx, group1)
   265  		if err != nil {
   266  			tt.Fatalf("expected store.Update to succeed. got %s", err.Error())
   267  		}
   268  
   269  		group, err := store.FindByID(ctx, group1.ID)
   270  		if group.Name != "group3.1" {
   271  			tt.Fatalf("expected group.Name to be 'group3.1. got %s", group.Name)
   272  		}
   273  	})
   274  
   275  	t.Run("CreateDelete", func(tt *testing.T) {
   276  		store, cleanup, err := newStore()
   277  		if err != nil {
   278  			tt.Fatalf("Failed to create a new store: %s", err)
   279  		}
   280  		defer cleanup()
   281  
   282  		group1, _ := store.Create(ctx, &group.NewGroup{Name: "group1"})
   283  		err = store.Delete(ctx, group1.ID)
   284  		if err != nil {
   285  			tt.Fatalf("expected store.Delete to succeed. got %s", err.Error())
   286  		}
   287  		group, err := store.FindByID(ctx, group1.ID)
   288  		if group != nil {
   289  			tt.Fatal("expected group1 to be deleted")
   290  		}
   291  	})
   292  }