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