eintopf.info@v0.13.16/service/place/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/place"
    24  )
    25  
    26  type newStore func() (place.Storer, func(), error)
    27  
    28  // TestStore tests if a given place.Service acts as a place 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  		place, err := store.FindByID(ctx, "test")
    40  		if err != nil {
    41  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
    42  		}
    43  		if place != nil {
    44  			tt.Fatalf("expected to place to be nil. got %v", place)
    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  		place1, _ := store.Create(ctx, &place.NewPlace{Name: "place1"})
    56  		place, err := store.FindByID(ctx, place1.ID)
    57  		if err != nil {
    58  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
    59  		}
    60  		if place.ID != place1.ID || place.Name != place1.Name {
    61  			tt.Fatalf("expected to find place1. got %v. want %v", place, place1)
    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  		_, err = store.Create(ctx, &place.NewPlace{Name: "place1"})
    73  		if err != nil {
    74  			tt.Fatalf("store.Create: %s", err)
    75  		}
    76  		_, err = store.Create(ctx, &place.NewPlace{Name: "place2"})
    77  		if err != nil {
    78  			tt.Fatalf("store.Create: %s", err)
    79  		}
    80  		places, totalPlaces, err := store.Find(ctx, nil)
    81  		if err != nil {
    82  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
    83  		}
    84  		if len(places) != 2 {
    85  			tt.Fatalf("expected to recieve two places. got %d", len(places))
    86  		}
    87  		if totalPlaces != 2 {
    88  			tt.Fatalf("expected to recieve a total of two places. got %d", totalPlaces)
    89  		}
    90  	})
    91  
    92  	t.Run("CreateFindFilter", func(tt *testing.T) {
    93  		store, cleanup, err := newStore()
    94  		if err != nil {
    95  			tt.Fatalf("Failed to create a new store: %s", err)
    96  		}
    97  		defer cleanup()
    98  
    99  		place1, _ := store.Create(ctx, &place.NewPlace{Name: "place1"})
   100  		store.Create(ctx, &place.NewPlace{Name: "place2"})
   101  		places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{
   102  			Filters: &place.FindFilters{Name: &place1.Name},
   103  		})
   104  		if err != nil {
   105  			tt.Fatalf("expected store.FindAll to succeed. got %s", err.Error())
   106  		}
   107  		if len(places) != 1 {
   108  			tt.Fatalf("expected to recieve one place. got %d", len(places))
   109  		}
   110  		if totalPlaces != 1 {
   111  			tt.Fatalf("expected to recieve a total of one place. got %d", totalPlaces)
   112  		}
   113  		if places[0].ID != place1.ID {
   114  			tt.Fatalf("expected to find place1. got %v. want %v", places[0], place1)
   115  		}
   116  	})
   117  
   118  	t.Run("CreateFindSortedASC", func(tt *testing.T) {
   119  		store, cleanup, err := newStore()
   120  		if err != nil {
   121  			tt.Fatalf("Failed to create a new store: %s", err)
   122  		}
   123  		defer cleanup()
   124  
   125  		place1, _ := store.Create(ctx, &place.NewPlace{Name: "c place1"})
   126  		place2, _ := store.Create(ctx, &place.NewPlace{Name: "a place2"})
   127  		place3, _ := store.Create(ctx, &place.NewPlace{Name: "b place3"})
   128  		places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{
   129  			Sort:  "name",
   130  			Order: crud.OrderAsc,
   131  		})
   132  		if err != nil {
   133  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   134  		}
   135  		if len(places) != 3 {
   136  			tt.Fatalf("expected to find three place. got %d", len(places))
   137  		}
   138  		if totalPlaces != 3 {
   139  			tt.Fatalf("expected to recieve a total of three places. got %d", totalPlaces)
   140  		}
   141  		if places[0].ID != place2.ID {
   142  			tt.Fatalf("expected to place[0] to be place2 . got %v", places[0])
   143  		}
   144  		if places[1].ID != place3.ID {
   145  			tt.Fatalf("expected to place[1] to be place3 . got %v", places[1])
   146  		}
   147  		if places[2].ID != place1.ID {
   148  			tt.Fatalf("expected to place[2] to be place1 . got %v", places[2])
   149  		}
   150  	})
   151  
   152  	t.Run("CreateFindSortedDESC", func(tt *testing.T) {
   153  		store, cleanup, err := newStore()
   154  		if err != nil {
   155  			tt.Fatalf("Failed to create a new store: %s", err)
   156  		}
   157  		defer cleanup()
   158  
   159  		place1, _ := store.Create(ctx, &place.NewPlace{Name: "c place1"})
   160  		place2, _ := store.Create(ctx, &place.NewPlace{Name: "a place2"})
   161  		place3, _ := store.Create(ctx, &place.NewPlace{Name: "b place3"})
   162  		places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{
   163  			Sort:  "name",
   164  			Order: crud.OrderDesc,
   165  		})
   166  		if err != nil {
   167  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   168  		}
   169  		if len(places) != 3 {
   170  			tt.Fatalf("expected to find three place. got %d", len(places))
   171  		}
   172  		if totalPlaces != 3 {
   173  			tt.Fatalf("expected to recieve a total of three places. got %d", totalPlaces)
   174  		}
   175  		if places[0].ID != place1.ID {
   176  			tt.Fatalf("expected to place[0] to be place1 . got %v", places[0])
   177  		}
   178  		if places[1].ID != place3.ID {
   179  			tt.Fatalf("expected to place[1] to be place3 . got %v", places[1])
   180  		}
   181  		if places[2].ID != place2.ID {
   182  			tt.Fatalf("expected to place[2] to be place2 . got %v", places[2])
   183  		}
   184  	})
   185  
   186  	t.Run("CreateFindPaginated", func(tt *testing.T) {
   187  		store, cleanup, err := newStore()
   188  		if err != nil {
   189  			tt.Fatalf("Failed to create a new store: %s", err)
   190  		}
   191  		defer cleanup()
   192  
   193  		store.Create(ctx, &place.NewPlace{Name: "place1"})
   194  		place2, _ := store.Create(ctx, &place.NewPlace{Name: "place2"})
   195  		store.Create(ctx, &place.NewPlace{Name: "place3"})
   196  		places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{
   197  			Limit:  1,
   198  			Offset: 1,
   199  		})
   200  		if err != nil {
   201  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   202  		}
   203  		if len(places) != 1 {
   204  			tt.Fatalf("expected to find one place. got %d", len(places))
   205  		}
   206  		if totalPlaces != 3 {
   207  			tt.Fatalf("expected to recieve a total of three places. got %d", totalPlaces)
   208  		}
   209  		if places[0].ID != place2.ID || places[0].Name != place2.Name {
   210  			tt.Fatalf("expected to find place2. got %v. want %v", places[0], place2)
   211  		}
   212  	})
   213  
   214  	t.Run("CreateFindPaginatedAndSorted", func(tt *testing.T) {
   215  		store, cleanup, err := newStore()
   216  		if err != nil {
   217  			tt.Fatalf("Failed to create a new store: %s", err)
   218  		}
   219  		defer cleanup()
   220  
   221  		place1, _ := store.Create(ctx, &place.NewPlace{Name: "c place1"})
   222  		store.Create(ctx, &place.NewPlace{Name: "a place2"})
   223  		store.Create(ctx, &place.NewPlace{Name: "b place3"})
   224  		places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{
   225  			Limit:  1,
   226  			Offset: 2,
   227  			Sort:   "name",
   228  			Order:  crud.OrderAsc,
   229  		})
   230  		if err != nil {
   231  			tt.Fatalf("expected store.Find to succeed. got %s", err.Error())
   232  		}
   233  		if len(places) != 1 {
   234  			tt.Fatalf("expected to find one place. got %d", len(places))
   235  		}
   236  		if totalPlaces != 3 {
   237  			tt.Fatalf("expected to recieve a total of three places. got %d", totalPlaces)
   238  		}
   239  		if places[0].ID != place1.ID {
   240  			tt.Fatalf("expected to place[0] to be place1 . got %v", places[0])
   241  		}
   242  	})
   243  
   244  	t.Run("CreateUpdate", func(tt *testing.T) {
   245  		store, cleanup, err := newStore()
   246  		if err != nil {
   247  			tt.Fatalf("Failed to create a new store: %s", err)
   248  		}
   249  		defer cleanup()
   250  
   251  		place1, _ := store.Create(ctx, &place.NewPlace{Name: "place3"})
   252  		place1.Name = "place3.1"
   253  
   254  		_, err = store.Update(ctx, place1)
   255  		if err != nil {
   256  			tt.Fatalf("expected store.Update to succeed. got %s", err.Error())
   257  		}
   258  
   259  		place, err := store.FindByID(ctx, place1.ID)
   260  		if place.Name != "place3.1" {
   261  			tt.Fatalf("expected place.Name to be 'place3.1. got %s", place.Name)
   262  		}
   263  	})
   264  
   265  	t.Run("CreateDelete", func(tt *testing.T) {
   266  		store, cleanup, err := newStore()
   267  		if err != nil {
   268  			tt.Fatalf("Failed to create a new store: %s", err)
   269  		}
   270  		defer cleanup()
   271  
   272  		place1, _ := store.Create(ctx, &place.NewPlace{Name: "place1"})
   273  		err = store.Delete(ctx, place1.ID)
   274  		if err != nil {
   275  			tt.Fatalf("expected store.Delete to succeed. got %s", err.Error())
   276  		}
   277  		place, err := store.FindByID(ctx, place1.ID)
   278  		if place != nil {
   279  			tt.Fatal("expected place1 to be deleted")
   280  		}
   281  	})
   282  }