You've already forked pocketbase
							
							
				mirror of
				https://github.com/pocketbase/pocketbase.git
				synced 2025-10-31 08:37:38 +02:00 
			
		
		
		
	[#396] updated tests helpers
This commit is contained in:
		| @@ -119,7 +119,7 @@ func TestAdminRequestPasswordReset(t *testing.T) { | ||||
| 			Body:           strings.NewReader(`{"email":"test@example.com"}`), | ||||
| 			Delay:          100 * time.Millisecond, | ||||
| 			ExpectedStatus: 204, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				// simulate recent password request | ||||
| 				admin, err := app.Dao().FindAdminByEmail("test@example.com") | ||||
| 				if err != nil { | ||||
| @@ -446,7 +446,7 @@ func TestAdminDelete(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				// delete all admins except the authorized one | ||||
| 				adminModel := &models.Admin{} | ||||
| 				_, err := app.Dao().DB().Delete(adminModel.TableName(), dbx.Not(dbx.HashExp{ | ||||
| @@ -483,7 +483,7 @@ func TestAdminCreate(t *testing.T) { | ||||
| 			Method: http.MethodPost, | ||||
| 			Url:    "/api/admins", | ||||
| 			Body:   strings.NewReader(`{"email":"testnew@example.com","password":"1234567890","passwordConfirm":"1234567890","avatar":3}`), | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				// delete all admins | ||||
| 				_, err := app.Dao().DB().NewQuery("DELETE FROM {{_admins}}").Execute() | ||||
| 				if err != nil { | ||||
|   | ||||
| @@ -54,7 +54,7 @@ func TestCustomRoutesAndErrorsHandling(t *testing.T) { | ||||
| 			Name:   "custom route", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/custom", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/custom", | ||||
| @@ -70,7 +70,7 @@ func TestCustomRoutesAndErrorsHandling(t *testing.T) { | ||||
| 			Name:   "route with HTTPError", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/http-error", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/http-error", | ||||
| @@ -86,7 +86,7 @@ func TestCustomRoutesAndErrorsHandling(t *testing.T) { | ||||
| 			Name:   "route with api error", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/api-error", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/api-error", | ||||
| @@ -102,7 +102,7 @@ func TestCustomRoutesAndErrorsHandling(t *testing.T) { | ||||
| 			Name:   "route with plain error", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/plain-error", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/plain-error", | ||||
|   | ||||
| @@ -475,7 +475,7 @@ func TestCollectionImport(t *testing.T) { | ||||
| 				`"data":{`, | ||||
| 				`"collections":{"code":"validation_required"`, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				collections := []*models.Collection{} | ||||
| 				if err := app.Dao().CollectionQuery().All(&collections); err != nil { | ||||
| 					t.Fatal(err) | ||||
| @@ -501,7 +501,7 @@ func TestCollectionImport(t *testing.T) { | ||||
| 			ExpectedEvents: map[string]int{ | ||||
| 				"OnCollectionsBeforeImportRequest": 1, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				collections := []*models.Collection{} | ||||
| 				if err := app.Dao().CollectionQuery().All(&collections); err != nil { | ||||
| 					t.Fatal(err) | ||||
| @@ -542,7 +542,7 @@ func TestCollectionImport(t *testing.T) { | ||||
| 				"OnCollectionsBeforeImportRequest": 1, | ||||
| 				"OnModelBeforeCreate":              2, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				collections := []*models.Collection{} | ||||
| 				if err := app.Dao().CollectionQuery().All(&collections); err != nil { | ||||
| 					t.Fatal(err) | ||||
| @@ -590,7 +590,7 @@ func TestCollectionImport(t *testing.T) { | ||||
| 				"OnModelBeforeCreate":              2, | ||||
| 				"OnModelAfterCreate":               2, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				collections := []*models.Collection{} | ||||
| 				if err := app.Dao().CollectionQuery().All(&collections); err != nil { | ||||
| 					t.Fatal(err) | ||||
| @@ -689,7 +689,7 @@ func TestCollectionImport(t *testing.T) { | ||||
| 				"OnModelBeforeCreate":              1, | ||||
| 				"OnModelAfterCreate":               1, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				collections := []*models.Collection{} | ||||
| 				if err := app.Dao().CollectionQuery().All(&collections); err != nil { | ||||
| 					t.Fatal(err) | ||||
|   | ||||
| @@ -34,7 +34,7 @@ func TestRequestsList(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if err := tests.MockRequestLogsData(app); err != nil { | ||||
| 					t.Fatal(err) | ||||
| 				} | ||||
| @@ -56,7 +56,7 @@ func TestRequestsList(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if err := tests.MockRequestLogsData(app); err != nil { | ||||
| 					t.Fatal(err) | ||||
| 				} | ||||
| @@ -103,7 +103,7 @@ func TestRequestView(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if err := tests.MockRequestLogsData(app); err != nil { | ||||
| 					t.Fatal(err) | ||||
| 				} | ||||
| @@ -118,7 +118,7 @@ func TestRequestView(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if err := tests.MockRequestLogsData(app); err != nil { | ||||
| 					t.Fatal(err) | ||||
| 				} | ||||
| @@ -161,7 +161,7 @@ func TestRequestsStats(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if err := tests.MockRequestLogsData(app); err != nil { | ||||
| 					t.Fatal(err) | ||||
| 				} | ||||
| @@ -178,7 +178,7 @@ func TestRequestsStats(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if err := tests.MockRequestLogsData(app); err != nil { | ||||
| 					t.Fatal(err) | ||||
| 				} | ||||
|   | ||||
| @@ -18,7 +18,7 @@ func TestRequireGuestOnly(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRkMDE5N2NjLTJiNGEtM2Y4My1hMjZiLWQ3N2JjODQyM2QzYyIsInR5cGUiOiJ1c2VyIiwiZXhwIjoxODkzNDc0MDAwfQ.Wq5ac1q1f5WntIzEngXk22ydMj-eFgvfSRg7dhmPKic", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -40,7 +40,7 @@ func TestRequireGuestOnly(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -62,7 +62,7 @@ func TestRequireGuestOnly(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRkMDE5N2NjLTJiNGEtM2Y4My1hMjZiLWQ3N2JjODQyM2QzYyIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsInR5cGUiOiJ1c2VyIiwiZXhwIjoxNjQwOTkxNjYxfQ.HkAldxpbn0EybkMfFGQKEJUIYKE5UJA0AjcsrV7Q6Io", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -81,7 +81,7 @@ func TestRequireGuestOnly(t *testing.T) { | ||||
| 			Name:   "guest", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/my/test", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -109,7 +109,7 @@ func TestRequireUserAuth(t *testing.T) { | ||||
| 			Name:   "guest", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/my/test", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -131,7 +131,7 @@ func TestRequireUserAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRkMDE5N2NjLTJiNGEtM2Y4My1hMjZiLWQ3N2JjODQyM2QzYyIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsInR5cGUiOiJ1c2VyIiwiZXhwIjoxNjQwOTkxNjYxfQ.HkAldxpbn0EybkMfFGQKEJUIYKE5UJA0AjcsrV7Q6Io", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -153,7 +153,7 @@ func TestRequireUserAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -175,7 +175,7 @@ func TestRequireUserAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRkMDE5N2NjLTJiNGEtM2Y4My1hMjZiLWQ3N2JjODQyM2QzYyIsInR5cGUiOiJ1c2VyIiwiZXhwIjoxODkzNDc0MDAwfQ.Wq5ac1q1f5WntIzEngXk22ydMj-eFgvfSRg7dhmPKic", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -203,7 +203,7 @@ func TestRequireAdminAuth(t *testing.T) { | ||||
| 			Name:   "guest", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/my/test", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -225,7 +225,7 @@ func TestRequireAdminAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTY0MTAxMzIwMH0.Gp_1b5WVhqjj2o3nJhNUlJmpdiwFLXN72LbMP-26gjA", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -247,7 +247,7 @@ func TestRequireAdminAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRkMDE5N2NjLTJiNGEtM2Y4My1hMjZiLWQ3N2JjODQyM2QzYyIsInR5cGUiOiJ1c2VyIiwiZXhwIjoxODkzNDc0MDAwfQ.Wq5ac1q1f5WntIzEngXk22ydMj-eFgvfSRg7dhmPKic", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -269,7 +269,7 @@ func TestRequireAdminAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -297,7 +297,7 @@ func TestRequireAdminAuthOnlyIfAny(t *testing.T) { | ||||
| 			Name:   "guest (while having at least 1 existing admin)", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/my/test", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -316,7 +316,7 @@ func TestRequireAdminAuthOnlyIfAny(t *testing.T) { | ||||
| 			Name:   "guest (while having 0 existing admins)", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/my/test", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				// delete all admins | ||||
| 				_, err := app.Dao().DB().NewQuery("DELETE FROM {{_admins}}").Execute() | ||||
| 				if err != nil { | ||||
| @@ -344,7 +344,7 @@ func TestRequireAdminAuthOnlyIfAny(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTY0MTAxMzIwMH0.Gp_1b5WVhqjj2o3nJhNUlJmpdiwFLXN72LbMP-26gjA", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -366,7 +366,7 @@ func TestRequireAdminAuthOnlyIfAny(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRkMDE5N2NjLTJiNGEtM2Y4My1hMjZiLWQ3N2JjODQyM2QzYyIsInR5cGUiOiJ1c2VyIiwiZXhwIjoxODkzNDc0MDAwfQ.Wq5ac1q1f5WntIzEngXk22ydMj-eFgvfSRg7dhmPKic", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -388,7 +388,7 @@ func TestRequireAdminAuthOnlyIfAny(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -416,7 +416,7 @@ func TestRequireAdminOrUserAuth(t *testing.T) { | ||||
| 			Name:   "guest", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/my/test", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -438,7 +438,7 @@ func TestRequireAdminOrUserAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTY0MTAxMzIwMH0.Gp_1b5WVhqjj2o3nJhNUlJmpdiwFLXN72LbMP-26gjA", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -460,7 +460,7 @@ func TestRequireAdminOrUserAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRkMDE5N2NjLTJiNGEtM2Y4My1hMjZiLWQ3N2JjODQyM2QzYyIsInR5cGUiOiJ1c2VyIiwiZXhwIjoxODkzNDc0MDAwfQ.Wq5ac1q1f5WntIzEngXk22ydMj-eFgvfSRg7dhmPKic", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -482,7 +482,7 @@ func TestRequireAdminOrUserAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test", | ||||
| @@ -510,7 +510,7 @@ func TestRequireAdminOrOwnerAuth(t *testing.T) { | ||||
| 			Name:   "guest", | ||||
| 			Method: http.MethodGet, | ||||
| 			Url:    "/my/test/4d0197cc-2b4a-3f83-a26b-d77bc8423d3c", | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test/:id", | ||||
| @@ -532,7 +532,7 @@ func TestRequireAdminOrOwnerAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRkMDE5N2NjLTJiNGEtM2Y4My1hMjZiLWQ3N2JjODQyM2QzYyIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsInR5cGUiOiJ1c2VyIiwiZXhwIjoxNjQwOTkxNjYxfQ.HkAldxpbn0EybkMfFGQKEJUIYKE5UJA0AjcsrV7Q6Io", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test/:id", | ||||
| @@ -555,7 +555,7 @@ func TestRequireAdminOrOwnerAuth(t *testing.T) { | ||||
| 				// test3@example.com | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoidXNlciIsImVtYWlsIjoidGVzdDNAZXhhbXBsZS5jb20iLCJpZCI6Ijk3Y2MzZDNkLTZiYTItMzgzZi1iNDJhLTdiYzg0ZDI3NDEwYyIsImV4cCI6MTg5MzUxNTU3Nn0.Q965uvlTxxOsZbACXSgJQNXykYK0TKZ87nyPzemvN4E", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test/:id", | ||||
| @@ -577,7 +577,7 @@ func TestRequireAdminOrOwnerAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "User eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjRkMDE5N2NjLTJiNGEtM2Y4My1hMjZiLWQ3N2JjODQyM2QzYyIsInR5cGUiOiJ1c2VyIiwiZXhwIjoxODkzNDc0MDAwfQ.Wq5ac1q1f5WntIzEngXk22ydMj-eFgvfSRg7dhmPKic", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test/:id", | ||||
| @@ -599,7 +599,7 @@ func TestRequireAdminOrOwnerAuth(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				e.AddRoute(echo.Route{ | ||||
| 					Method: http.MethodGet, | ||||
| 					Path:   "/my/test/:custom", | ||||
|   | ||||
| @@ -27,7 +27,7 @@ func TestRealtimeConnect(t *testing.T) { | ||||
| 			ExpectedEvents: map[string]int{ | ||||
| 				"OnRealtimeConnectRequest": 1, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if len(app.SubscriptionsBroker().Clients()) != 0 { | ||||
| 					t.Errorf("Expected the subscribers to be removed after connection close, found %d", len(app.SubscriptionsBroker().Clients())) | ||||
| 				} | ||||
| @@ -68,11 +68,11 @@ func TestRealtimeSubscribe(t *testing.T) { | ||||
| 				"OnRealtimeBeforeSubscribeRequest": 1, | ||||
| 				"OnRealtimeAfterSubscribeRequest":  1, | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				client.Subscribe("test0") | ||||
| 				app.SubscriptionsBroker().Register(client) | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if len(client.Subscriptions()) != 0 { | ||||
| 					t.Errorf("Expected no subscriptions, got %v", client.Subscriptions()) | ||||
| 				} | ||||
| @@ -89,11 +89,11 @@ func TestRealtimeSubscribe(t *testing.T) { | ||||
| 				"OnRealtimeBeforeSubscribeRequest": 1, | ||||
| 				"OnRealtimeAfterSubscribeRequest":  1, | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				client.Subscribe("test0") | ||||
| 				app.SubscriptionsBroker().Register(client) | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				expectedSubs := []string{"test1", "test2"} | ||||
| 				if len(expectedSubs) != len(client.Subscriptions()) { | ||||
| 					t.Errorf("Expected subscriptions %v, got %v", expectedSubs, client.Subscriptions()) | ||||
| @@ -120,10 +120,10 @@ func TestRealtimeSubscribe(t *testing.T) { | ||||
| 				"OnRealtimeBeforeSubscribeRequest": 1, | ||||
| 				"OnRealtimeAfterSubscribeRequest":  1, | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				app.SubscriptionsBroker().Register(client) | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				admin, _ := client.Get(apis.ContextAdminKey).(*models.Admin) | ||||
| 				if admin == nil { | ||||
| 					t.Errorf("Expected admin auth model, got nil") | ||||
| @@ -144,10 +144,10 @@ func TestRealtimeSubscribe(t *testing.T) { | ||||
| 				"OnRealtimeBeforeSubscribeRequest": 1, | ||||
| 				"OnRealtimeAfterSubscribeRequest":  1, | ||||
| 			}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				app.SubscriptionsBroker().Register(client) | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				user, _ := client.Get(apis.ContextUserKey).(*models.User) | ||||
| 				if user == nil { | ||||
| 					t.Errorf("Expected user auth model, got nil") | ||||
| @@ -165,14 +165,14 @@ func TestRealtimeSubscribe(t *testing.T) { | ||||
| 			}, | ||||
| 			ExpectedStatus:  403, | ||||
| 			ExpectedContent: []string{`"data":{}`}, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				initialAuth := &models.User{} | ||||
| 				initialAuth.RefreshId() | ||||
| 				client.Set(apis.ContextUserKey, initialAuth) | ||||
|  | ||||
| 				app.SubscriptionsBroker().Register(client) | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				user, _ := client.Get(apis.ContextUserKey).(*models.User) | ||||
| 				if user == nil { | ||||
| 					t.Errorf("Expected user auth model, got nil") | ||||
|   | ||||
| @@ -459,7 +459,7 @@ func TestRecordDelete(t *testing.T) { | ||||
| 				"OnModelBeforeDelete":         3, // +2 cascade delete related records | ||||
| 				"OnModelAfterDelete":          3, // +2 cascade delete related records | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				ensureDeletedFiles(app, "3f2888f8-075d-49fe-9d09-ea7e951000dc", "577bd676-aacb-4072-b7da-99d00ee210a4") | ||||
| 				ensureDeletedFiles(app, "2c1010aa-b8fe-41d9-a980-99534ca8a167", "94568ca2-0bee-49d7-b749-06cb97956fd9") | ||||
| 				ensureDeletedFiles(app, "2c1010aa-b8fe-41d9-a980-99534ca8a167", "63c2ab80-84ab-4057-a592-4604a731f78f") | ||||
| @@ -481,7 +481,7 @@ func TestRecordDelete(t *testing.T) { | ||||
| 				"OnModelBeforeDelete":         3, // +2 cascade delete related records | ||||
| 				"OnModelAfterDelete":          3, // +2 cascade delete related records | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				ensureDeletedFiles(app, "3f2888f8-075d-49fe-9d09-ea7e951000dc", "577bd676-aacb-4072-b7da-99d00ee210a4") | ||||
| 				ensureDeletedFiles(app, "2c1010aa-b8fe-41d9-a980-99534ca8a167", "94568ca2-0bee-49d7-b749-06cb97956fd9") | ||||
| 				ensureDeletedFiles(app, "2c1010aa-b8fe-41d9-a980-99534ca8a167", "63c2ab80-84ab-4057-a592-4604a731f78f") | ||||
| @@ -501,7 +501,7 @@ func TestRecordDelete(t *testing.T) { | ||||
| 				"OnModelBeforeDelete":         1, | ||||
| 				"OnModelAfterDelete":          1, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				ensureDeletedFiles(app, "2c1010aa-b8fe-41d9-a980-99534ca8a167", "94568ca2-0bee-49d7-b749-06cb97956fd9") | ||||
| 			}, | ||||
| 		}, | ||||
| @@ -529,7 +529,7 @@ func TestRecordDelete(t *testing.T) { | ||||
| 				"OnModelBeforeDelete":         1, | ||||
| 				"OnModelAfterDelete":          1, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				ensureDeletedFiles(app, "2c1010aa-b8fe-41d9-a980-99534ca8a167", "63c2ab80-84ab-4057-a592-4604a731f78f") | ||||
| 			}, | ||||
| 		}, | ||||
| @@ -562,7 +562,7 @@ func TestRecordDelete(t *testing.T) { | ||||
| 				"OnModelBeforeDelete":         3, | ||||
| 				"OnModelAfterDelete":          3, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				recId := "63c2ab80-84ab-4057-a592-4604a731f78f" | ||||
| 				col, _ := app.Dao().FindCollectionByNameOrId("demo2") | ||||
| 				rec, _ := app.Dao().FindRecordById(col, recId, nil) | ||||
|   | ||||
| @@ -288,7 +288,7 @@ func TestSettingsTestEmail(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if app.TestMailer.TotalSend != 1 { | ||||
| 					t.Fatalf("[verification] Expected 1 sent email, got %d", app.TestMailer.TotalSend) | ||||
| 				} | ||||
| @@ -319,7 +319,7 @@ func TestSettingsTestEmail(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if app.TestMailer.TotalSend != 1 { | ||||
| 					t.Fatalf("[password-reset] Expected 1 sent email, got %d", app.TestMailer.TotalSend) | ||||
| 				} | ||||
| @@ -350,7 +350,7 @@ func TestSettingsTestEmail(t *testing.T) { | ||||
| 			RequestHeaders: map[string]string{ | ||||
| 				"Authorization": "Admin eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjJiNGE5N2NjLTNmODMtNGQwMS1hMjZiLTNkNzdiYzg0MmQzYyIsInR5cGUiOiJhZG1pbiIsImV4cCI6MTg3MzQ2Mjc5Mn0.AtRtXR6FHBrCUGkj5OffhmxLbSZaQ4L_Qgw4gfoHyfo", | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				if app.TestMailer.TotalSend != 1 { | ||||
| 					t.Fatalf("[email-change] Expected 1 sent email, got %d", app.TestMailer.TotalSend) | ||||
| 				} | ||||
|   | ||||
| @@ -84,7 +84,7 @@ func TestUserEmailAuth(t *testing.T) { | ||||
| 			Method: http.MethodPost, | ||||
| 			Url:    "/api/users/auth-via-email", | ||||
| 			Body:   strings.NewReader(`{"email":"test@example.com","password":"123456"}`), | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				app.Settings().EmailAuth.Enabled = false | ||||
| 			}, | ||||
| 			ExpectedStatus:  400, | ||||
| @@ -159,7 +159,7 @@ func TestUserRequestPasswordReset(t *testing.T) { | ||||
| 			Body:           strings.NewReader(`{"email":"test@example.com"}`), | ||||
| 			Delay:          100 * time.Millisecond, | ||||
| 			ExpectedStatus: 204, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				// simulate recent password request | ||||
| 				user, err := app.Dao().FindUserByEmail("test@example.com") | ||||
| 				if err != nil { | ||||
| @@ -285,7 +285,7 @@ func TestUserRequestVerification(t *testing.T) { | ||||
| 			Body:           strings.NewReader(`{"email":"test2@example.com"}`), | ||||
| 			Delay:          100 * time.Millisecond, | ||||
| 			ExpectedStatus: 204, | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				// simulate recent verification sent | ||||
| 				user, err := app.Dao().FindUserByEmail("test2@example.com") | ||||
| 				if err != nil { | ||||
| @@ -807,7 +807,7 @@ func TestUserCreate(t *testing.T) { | ||||
| 			Method: http.MethodPost, | ||||
| 			Url:    "/api/users", | ||||
| 			Body:   strings.NewReader(`{"email":"newuser@example.com","password":"123456789","passwordConfirm":"123456789"}`), | ||||
| 			BeforeFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			BeforeTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				app.Settings().EmailAuth.Enabled = false | ||||
| 			}, | ||||
| 			ExpectedStatus:  400, | ||||
| @@ -1066,7 +1066,7 @@ func TestUserUnlinkExternalsAuth(t *testing.T) { | ||||
| 				"OnUserAfterUnlinkExternalAuthRequest":  1, | ||||
| 				"OnUserBeforeUnlinkExternalAuthRequest": 1, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				auth, _ := app.Dao().FindExternalAuthByUserIdAndProvider("cx9u0dh2udo8xol", "google") | ||||
| 				if auth != nil { | ||||
| 					t.Fatalf("Expected the google ExternalAuth to be deleted, got got \n%v", auth) | ||||
| @@ -1098,7 +1098,7 @@ func TestUserUnlinkExternalsAuth(t *testing.T) { | ||||
| 				"OnUserAfterUnlinkExternalAuthRequest":  1, | ||||
| 				"OnUserBeforeUnlinkExternalAuthRequest": 1, | ||||
| 			}, | ||||
| 			AfterFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 			AfterTestFunc: func(t *testing.T, app *tests.TestApp, e *echo.Echo) { | ||||
| 				auth, _ := app.Dao().FindExternalAuthByUserIdAndProvider("cx9u0dh2udo8xol", "google") | ||||
| 				if auth != nil { | ||||
| 					t.Fatalf("Expected the google ExternalAuth to be deleted, got got \n%v", auth) | ||||
|   | ||||
							
								
								
									
										23
									
								
								tests/api.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								tests/api.go
									
									
									
									
									
								
							| @@ -36,13 +36,22 @@ type ApiScenario struct { | ||||
|  | ||||
| 	// test hooks | ||||
| 	// --- | ||||
| 	BeforeFunc func(t *testing.T, app *TestApp, e *echo.Echo) | ||||
| 	AfterFunc  func(t *testing.T, app *TestApp, e *echo.Echo) | ||||
| 	TestAppFactory func() *TestApp | ||||
| 	BeforeTestFunc func(t *testing.T, app *TestApp, e *echo.Echo) | ||||
| 	AfterTestFunc  func(t *testing.T, app *TestApp, e *echo.Echo) | ||||
| } | ||||
|  | ||||
| // Test executes the test case/scenario. | ||||
| func (scenario *ApiScenario) Test(t *testing.T) { | ||||
| 	testApp, _ := NewTestApp() | ||||
| 	var testApp *TestApp | ||||
| 	if scenario.TestAppFactory != nil { | ||||
| 		testApp = scenario.TestAppFactory() | ||||
| 	} else { | ||||
| 		testApp, _ = NewTestApp() | ||||
| 	} | ||||
| 	if testApp == nil { | ||||
| 		t.Fatal("Failed to initialize the test app instance.") | ||||
| 	} | ||||
| 	defer testApp.Cleanup() | ||||
|  | ||||
| 	e, err := apis.InitApi(testApp) | ||||
| @@ -50,8 +59,8 @@ func (scenario *ApiScenario) Test(t *testing.T) { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	if scenario.BeforeFunc != nil { | ||||
| 		scenario.BeforeFunc(t, testApp, e) | ||||
| 	if scenario.BeforeTestFunc != nil { | ||||
| 		scenario.BeforeTestFunc(t, testApp, e) | ||||
| 	} | ||||
|  | ||||
| 	recorder := httptest.NewRecorder() | ||||
| @@ -135,7 +144,7 @@ func (scenario *ApiScenario) Test(t *testing.T) { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if scenario.AfterFunc != nil { | ||||
| 		scenario.AfterFunc(t, testApp, e) | ||||
| 	if scenario.AfterTestFunc != nil { | ||||
| 		scenario.AfterTestFunc(t, testApp, e) | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										29
									
								
								tests/app.go
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								tests/app.go
									
									
									
									
									
								
							| @@ -45,12 +45,21 @@ func (t *TestApp) ResetEventCalls() { | ||||
| 	t.EventCalls = make(map[string]int) | ||||
| } | ||||
|  | ||||
| // NewTestApp creates and initializes a full application instance for testing. | ||||
| // NewTestApp creates and initializes a test application instance. | ||||
| // | ||||
| // It is the caller's responsibility to call `app.Cleanup()` | ||||
| // when the app is no longer needed. | ||||
| func NewTestApp() (*TestApp, error) { | ||||
| 	tempDir, err := NewTempDataDir() | ||||
| func NewTestApp(optTestDataDir ...string) (*TestApp, error) { | ||||
| 	var testDataDir string | ||||
| 	if len(optTestDataDir) == 0 || optTestDataDir[0] == "" { | ||||
| 		// fallback to the default test data directory | ||||
| 		_, currentFile, _, _ := runtime.Caller(0) | ||||
| 		testDataDir = filepath.Join(path.Dir(currentFile), "data") | ||||
| 	} else { | ||||
| 		testDataDir = optTestDataDir[0] | ||||
| 	} | ||||
|  | ||||
| 	tempDir, err := CloneIntoTempDir(testDataDir) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| @@ -381,21 +390,19 @@ func NewTestApp() (*TestApp, error) { | ||||
| 	return t, nil | ||||
| } | ||||
|  | ||||
| // NewTempDataDir creates a new temporary directory copy of the test data. | ||||
| // CloneIntoTempDir creates a new temporary directory copy from the | ||||
| // provided directory path. | ||||
| // | ||||
| // It is the caller's responsibility to call `os.RemoveAll(dir)` | ||||
| // when the directory is no longer needed. | ||||
| func NewTempDataDir() (string, error) { | ||||
| // It is the caller's responsibility to call `os.RemoveAll(tempDir)` | ||||
| // when the directory is no longer needed! | ||||
| func CloneIntoTempDir(dirToClone string) (string, error) { | ||||
| 	tempDir, err := os.MkdirTemp("", "pb_test_*") | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	_, currentFile, _, _ := runtime.Caller(0) | ||||
| 	testDataDir := filepath.Join(path.Dir(currentFile), "data") | ||||
|  | ||||
| 	// copy everything from testDataDir to tempDir | ||||
| 	if err := copyDir(testDataDir, tempDir); err != nil { | ||||
| 	if err := copyDir(dirToClone, tempDir); err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
|   | ||||
							
								
								
									
										2
									
								
								ui/.env
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								ui/.env
									
									
									
									
									
								
							| @@ -4,4 +4,4 @@ PB_PROFILE_COLLECTION = "profiles" | ||||
| PB_INSTALLER_PARAM    = "installer" | ||||
| PB_RULES_SYNTAX_DOCS  = "https://pocketbase.io/docs/manage-collections#rules-filters-syntax" | ||||
| PB_RELEASES           = "https://github.com/pocketbase/pocketbase/releases" | ||||
| PB_VERSION            = "v0.6.1" | ||||
| PB_VERSION            = "v0.7.0" | ||||
|   | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -1,2 +1,2 @@ | ||||
| import{S as E,i as G,s as I,F as K,c as A,m as B,t as H,a as N,d as T,C as M,q as J,e as c,w as q,b as k,f as u,r as L,g as b,h as _,u as h,v as O,j as Q,l as U,o as w,A as V,p as W,B as X,D as Y,x as Z,z as S}from"./index.a9e352ad.js";function y(f){let e,o,s;return{c(){e=q("for "),o=c("strong"),s=q(f[3]),u(o,"class","txt-nowrap")},m(l,t){b(l,e,t),b(l,o,t),_(o,s)},p(l,t){t&8&&Z(s,l[3])},d(l){l&&w(e),l&&w(o)}}}function x(f){let e,o,s,l,t,r,p,d;return{c(){e=c("label"),o=q("New password"),l=k(),t=c("input"),u(e,"for",s=f[8]),u(t,"type","password"),u(t,"id",r=f[8]),t.required=!0,t.autofocus=!0},m(n,i){b(n,e,i),_(e,o),b(n,l,i),b(n,t,i),S(t,f[0]),t.focus(),p||(d=h(t,"input",f[6]),p=!0)},p(n,i){i&256&&s!==(s=n[8])&&u(e,"for",s),i&256&&r!==(r=n[8])&&u(t,"id",r),i&1&&t.value!==n[0]&&S(t,n[0])},d(n){n&&w(e),n&&w(l),n&&w(t),p=!1,d()}}}function ee(f){let e,o,s,l,t,r,p,d;return{c(){e=c("label"),o=q("New password confirm"),l=k(),t=c("input"),u(e,"for",s=f[8]),u(t,"type","password"),u(t,"id",r=f[8]),t.required=!0},m(n,i){b(n,e,i),_(e,o),b(n,l,i),b(n,t,i),S(t,f[1]),p||(d=h(t,"input",f[7]),p=!0)},p(n,i){i&256&&s!==(s=n[8])&&u(e,"for",s),i&256&&r!==(r=n[8])&&u(t,"id",r),i&2&&t.value!==n[1]&&S(t,n[1])},d(n){n&&w(e),n&&w(l),n&&w(t),p=!1,d()}}}function te(f){let e,o,s,l,t,r,p,d,n,i,g,R,C,v,P,F,j,m=f[3]&&y(f);return r=new J({props:{class:"form-field required",name:"password",$$slots:{default:[x,({uniqueId:a})=>({8:a}),({uniqueId:a})=>a?256:0]},$$scope:{ctx:f}}}),d=new J({props:{class:"form-field required",name:"passwordConfirm",$$slots:{default:[ee,({uniqueId:a})=>({8:a}),({uniqueId:a})=>a?256:0]},$$scope:{ctx:f}}}),{c(){e=c("form"),o=c("div"),s=c("h4"),l=q(`Reset your admin password
 | ||||
| import{S as E,i as G,s as I,F as K,c as A,m as B,t as H,a as N,d as T,C as M,q as J,e as c,w as q,b as k,f as u,r as L,g as b,h as _,u as h,v as O,j as Q,l as U,o as w,A as V,p as W,B as X,D as Y,x as Z,z as S}from"./index.bdac21fd.js";function y(f){let e,o,s;return{c(){e=q("for "),o=c("strong"),s=q(f[3]),u(o,"class","txt-nowrap")},m(l,t){b(l,e,t),b(l,o,t),_(o,s)},p(l,t){t&8&&Z(s,l[3])},d(l){l&&w(e),l&&w(o)}}}function x(f){let e,o,s,l,t,r,p,d;return{c(){e=c("label"),o=q("New password"),l=k(),t=c("input"),u(e,"for",s=f[8]),u(t,"type","password"),u(t,"id",r=f[8]),t.required=!0,t.autofocus=!0},m(n,i){b(n,e,i),_(e,o),b(n,l,i),b(n,t,i),S(t,f[0]),t.focus(),p||(d=h(t,"input",f[6]),p=!0)},p(n,i){i&256&&s!==(s=n[8])&&u(e,"for",s),i&256&&r!==(r=n[8])&&u(t,"id",r),i&1&&t.value!==n[0]&&S(t,n[0])},d(n){n&&w(e),n&&w(l),n&&w(t),p=!1,d()}}}function ee(f){let e,o,s,l,t,r,p,d;return{c(){e=c("label"),o=q("New password confirm"),l=k(),t=c("input"),u(e,"for",s=f[8]),u(t,"type","password"),u(t,"id",r=f[8]),t.required=!0},m(n,i){b(n,e,i),_(e,o),b(n,l,i),b(n,t,i),S(t,f[1]),p||(d=h(t,"input",f[7]),p=!0)},p(n,i){i&256&&s!==(s=n[8])&&u(e,"for",s),i&256&&r!==(r=n[8])&&u(t,"id",r),i&2&&t.value!==n[1]&&S(t,n[1])},d(n){n&&w(e),n&&w(l),n&&w(t),p=!1,d()}}}function te(f){let e,o,s,l,t,r,p,d,n,i,g,R,C,v,P,F,j,m=f[3]&&y(f);return r=new J({props:{class:"form-field required",name:"password",$$slots:{default:[x,({uniqueId:a})=>({8:a}),({uniqueId:a})=>a?256:0]},$$scope:{ctx:f}}}),d=new J({props:{class:"form-field required",name:"passwordConfirm",$$slots:{default:[ee,({uniqueId:a})=>({8:a}),({uniqueId:a})=>a?256:0]},$$scope:{ctx:f}}}),{c(){e=c("form"),o=c("div"),s=c("h4"),l=q(`Reset your admin password
 | ||||
|                 `),m&&m.c(),t=k(),A(r.$$.fragment),p=k(),A(d.$$.fragment),n=k(),i=c("button"),g=c("span"),g.textContent="Set new password",R=k(),C=c("div"),v=c("a"),v.textContent="Back to login",u(s,"class","m-b-xs"),u(o,"class","content txt-center m-b-sm"),u(g,"class","txt"),u(i,"type","submit"),u(i,"class","btn btn-lg btn-block"),i.disabled=f[2],L(i,"btn-loading",f[2]),u(e,"class","m-b-base"),u(v,"href","/login"),u(v,"class","link-hint"),u(C,"class","content txt-center")},m(a,$){b(a,e,$),_(e,o),_(o,s),_(s,l),m&&m.m(s,null),_(e,t),B(r,e,null),_(e,p),B(d,e,null),_(e,n),_(e,i),_(i,g),b(a,R,$),b(a,C,$),_(C,v),P=!0,F||(j=[h(e,"submit",O(f[4])),Q(U.call(null,v))],F=!0)},p(a,$){a[3]?m?m.p(a,$):(m=y(a),m.c(),m.m(s,null)):m&&(m.d(1),m=null);const z={};$&769&&(z.$$scope={dirty:$,ctx:a}),r.$set(z);const D={};$&770&&(D.$$scope={dirty:$,ctx:a}),d.$set(D),(!P||$&4)&&(i.disabled=a[2]),$&4&&L(i,"btn-loading",a[2])},i(a){P||(H(r.$$.fragment,a),H(d.$$.fragment,a),P=!0)},o(a){N(r.$$.fragment,a),N(d.$$.fragment,a),P=!1},d(a){a&&w(e),m&&m.d(),T(r),T(d),a&&w(R),a&&w(C),F=!1,V(j)}}}function se(f){let e,o;return e=new K({props:{$$slots:{default:[te]},$$scope:{ctx:f}}}),{c(){A(e.$$.fragment)},m(s,l){B(e,s,l),o=!0},p(s,[l]){const t={};l&527&&(t.$$scope={dirty:l,ctx:s}),e.$set(t)},i(s){o||(H(e.$$.fragment,s),o=!0)},o(s){N(e.$$.fragment,s),o=!1},d(s){T(e,s)}}}function le(f,e,o){let s,{params:l}=e,t="",r="",p=!1;async function d(){if(!p){o(2,p=!0);try{await W.admins.confirmPasswordReset(l==null?void 0:l.token,t,r),X("Successfully set a new admin password."),Y("/")}catch(g){W.errorResponseHandler(g)}o(2,p=!1)}}function n(){t=this.value,o(0,t)}function i(){r=this.value,o(1,r)}return f.$$set=g=>{"params"in g&&o(5,l=g.params)},f.$$.update=()=>{f.$$.dirty&32&&o(3,s=M.getJWTPayload(l==null?void 0:l.token).email||"")},[t,r,p,s,d,l,n,i]}class ae extends E{constructor(e){super(),G(this,e,le,se,I,{params:5})}}export{ae as default};
 | ||||
| @@ -1,2 +1,2 @@ | ||||
| import{S as M,i as T,s as j,F as z,c as H,m as L,t as w,a as y,d as S,b as g,e as _,f as p,g as k,h as d,j as A,l as B,k as N,n as D,o as v,p as C,q as G,r as F,u as E,v as I,w as h,x as J,y as P,z as R}from"./index.a9e352ad.js";function K(c){let e,s,n,l,t,o,f,m,i,a,b,u;return l=new G({props:{class:"form-field required",name:"email",$$slots:{default:[Q,({uniqueId:r})=>({5:r}),({uniqueId:r})=>r?32:0]},$$scope:{ctx:c}}}),{c(){e=_("form"),s=_("div"),s.innerHTML=`<h4 class="m-b-xs">Forgotten admin password</h4> 
 | ||||
| import{S as M,i as T,s as j,F as z,c as H,m as L,t as w,a as y,d as S,b as g,e as _,f as p,g as k,h as d,j as A,l as B,k as N,n as D,o as v,p as C,q as G,r as F,u as E,v as I,w as h,x as J,y as P,z as R}from"./index.bdac21fd.js";function K(c){let e,s,n,l,t,o,f,m,i,a,b,u;return l=new G({props:{class:"form-field required",name:"email",$$slots:{default:[Q,({uniqueId:r})=>({5:r}),({uniqueId:r})=>r?32:0]},$$scope:{ctx:c}}}),{c(){e=_("form"),s=_("div"),s.innerHTML=`<h4 class="m-b-xs">Forgotten admin password</h4> 
 | ||||
|                 <p>Enter the email associated with your account and we\u2019ll send you a recovery link:</p>`,n=g(),H(l.$$.fragment),t=g(),o=_("button"),f=_("i"),m=g(),i=_("span"),i.textContent="Send recovery link",p(s,"class","content txt-center m-b-sm"),p(f,"class","ri-mail-send-line"),p(i,"class","txt"),p(o,"type","submit"),p(o,"class","btn btn-lg btn-block"),o.disabled=c[1],F(o,"btn-loading",c[1]),p(e,"class","m-b-base")},m(r,$){k(r,e,$),d(e,s),d(e,n),L(l,e,null),d(e,t),d(e,o),d(o,f),d(o,m),d(o,i),a=!0,b||(u=E(e,"submit",I(c[3])),b=!0)},p(r,$){const q={};$&97&&(q.$$scope={dirty:$,ctx:r}),l.$set(q),(!a||$&2)&&(o.disabled=r[1]),$&2&&F(o,"btn-loading",r[1])},i(r){a||(w(l.$$.fragment,r),a=!0)},o(r){y(l.$$.fragment,r),a=!1},d(r){r&&v(e),S(l),b=!1,u()}}}function O(c){let e,s,n,l,t,o,f,m,i;return{c(){e=_("div"),s=_("div"),s.innerHTML='<i class="ri-checkbox-circle-line"></i>',n=g(),l=_("div"),t=_("p"),o=h("Check "),f=_("strong"),m=h(c[0]),i=h(" for the recovery link."),p(s,"class","icon"),p(f,"class","txt-nowrap"),p(l,"class","content"),p(e,"class","alert alert-success")},m(a,b){k(a,e,b),d(e,s),d(e,n),d(e,l),d(l,t),d(t,o),d(t,f),d(f,m),d(t,i)},p(a,b){b&1&&J(m,a[0])},i:P,o:P,d(a){a&&v(e)}}}function Q(c){let e,s,n,l,t,o,f,m;return{c(){e=_("label"),s=h("Email"),l=g(),t=_("input"),p(e,"for",n=c[5]),p(t,"type","email"),p(t,"id",o=c[5]),t.required=!0,t.autofocus=!0},m(i,a){k(i,e,a),d(e,s),k(i,l,a),k(i,t,a),R(t,c[0]),t.focus(),f||(m=E(t,"input",c[4]),f=!0)},p(i,a){a&32&&n!==(n=i[5])&&p(e,"for",n),a&32&&o!==(o=i[5])&&p(t,"id",o),a&1&&t.value!==i[0]&&R(t,i[0])},d(i){i&&v(e),i&&v(l),i&&v(t),f=!1,m()}}}function U(c){let e,s,n,l,t,o,f,m;const i=[O,K],a=[];function b(u,r){return u[2]?0:1}return e=b(c),s=a[e]=i[e](c),{c(){s.c(),n=g(),l=_("div"),t=_("a"),t.textContent="Back to login",p(t,"href","/login"),p(t,"class","link-hint"),p(l,"class","content txt-center")},m(u,r){a[e].m(u,r),k(u,n,r),k(u,l,r),d(l,t),o=!0,f||(m=A(B.call(null,t)),f=!0)},p(u,r){let $=e;e=b(u),e===$?a[e].p(u,r):(N(),y(a[$],1,1,()=>{a[$]=null}),D(),s=a[e],s?s.p(u,r):(s=a[e]=i[e](u),s.c()),w(s,1),s.m(n.parentNode,n))},i(u){o||(w(s),o=!0)},o(u){y(s),o=!1},d(u){a[e].d(u),u&&v(n),u&&v(l),f=!1,m()}}}function V(c){let e,s;return e=new z({props:{$$slots:{default:[U]},$$scope:{ctx:c}}}),{c(){H(e.$$.fragment)},m(n,l){L(e,n,l),s=!0},p(n,[l]){const t={};l&71&&(t.$$scope={dirty:l,ctx:n}),e.$set(t)},i(n){s||(w(e.$$.fragment,n),s=!0)},o(n){y(e.$$.fragment,n),s=!1},d(n){S(e,n)}}}function W(c,e,s){let n="",l=!1,t=!1;async function o(){if(!l){s(1,l=!0);try{await C.admins.requestPasswordReset(n),s(2,t=!0)}catch(m){C.errorResponseHandler(m)}s(1,l=!1)}}function f(){n=this.value,s(0,n)}return[n,l,t,o,f]}class Y extends M{constructor(e){super(),T(this,e,W,V,j,{})}}export{Y as default}; | ||||
| @@ -1,4 +1,4 @@ | ||||
| import{S as G,i as J,s as M,F as N,c as T,m as L,t as v,a as y,d as z,C as R,E as U,g as _,k as W,n as Y,o as b,G as j,p as A,q as B,e as m,w as C,b as h,f as d,r as F,h as k,u as q,v as D,y as E,x as I,z as H}from"./index.a9e352ad.js";function K(r){let e,t,s,l,n,o,c,a,i,u,g,$,p=r[3]&&S(r);return o=new B({props:{class:"form-field required",name:"password",$$slots:{default:[Q,({uniqueId:f})=>({8:f}),({uniqueId:f})=>f?256:0]},$$scope:{ctx:r}}}),{c(){e=m("form"),t=m("div"),s=m("h5"),l=C(`Type your password to confirm changing your email address
 | ||||
| import{S as G,i as J,s as M,F as N,c as T,m as L,t as v,a as y,d as z,C as R,E as U,g as _,k as W,n as Y,o as b,G as j,p as A,q as B,e as m,w as C,b as h,f as d,r as F,h as k,u as q,v as D,y as E,x as I,z as H}from"./index.bdac21fd.js";function K(r){let e,t,s,l,n,o,c,a,i,u,g,$,p=r[3]&&S(r);return o=new B({props:{class:"form-field required",name:"password",$$slots:{default:[Q,({uniqueId:f})=>({8:f}),({uniqueId:f})=>f?256:0]},$$scope:{ctx:r}}}),{c(){e=m("form"),t=m("div"),s=m("h5"),l=C(`Type your password to confirm changing your email address
 | ||||
|                     `),p&&p.c(),n=h(),T(o.$$.fragment),c=h(),a=m("button"),i=m("span"),i.textContent="Confirm new email",d(t,"class","content txt-center m-b-base"),d(i,"class","txt"),d(a,"type","submit"),d(a,"class","btn btn-lg btn-block"),a.disabled=r[1],F(a,"btn-loading",r[1])},m(f,w){_(f,e,w),k(e,t),k(t,s),k(s,l),p&&p.m(s,null),k(e,n),L(o,e,null),k(e,c),k(e,a),k(a,i),u=!0,g||($=q(e,"submit",D(r[4])),g=!0)},p(f,w){f[3]?p?p.p(f,w):(p=S(f),p.c(),p.m(s,null)):p&&(p.d(1),p=null);const P={};w&769&&(P.$$scope={dirty:w,ctx:f}),o.$set(P),(!u||w&2)&&(a.disabled=f[1]),w&2&&F(a,"btn-loading",f[1])},i(f){u||(v(o.$$.fragment,f),u=!0)},o(f){y(o.$$.fragment,f),u=!1},d(f){f&&b(e),p&&p.d(),z(o),g=!1,$()}}}function O(r){let e,t,s,l,n;return{c(){e=m("div"),e.innerHTML=`<div class="icon"><i class="ri-checkbox-circle-line"></i></div>  | ||||
|             <div class="content txt-bold"><p>Successfully changed the user email address.</p>  | ||||
|                 <p>You can now sign in with your new email address.</p></div>`,t=h(),s=m("button"),s.textContent="Close",d(e,"class","alert alert-success"),d(s,"type","button"),d(s,"class","btn btn-secondary btn-block")},m(o,c){_(o,e,c),_(o,t,c),_(o,s,c),l||(n=q(s,"click",r[6]),l=!0)},p:E,i:E,o:E,d(o){o&&b(e),o&&b(t),o&&b(s),l=!1,n()}}}function S(r){let e,t,s;return{c(){e=C("to "),t=m("strong"),s=C(r[3]),d(t,"class","txt-nowrap")},m(l,n){_(l,e,n),_(l,t,n),k(t,s)},p(l,n){n&8&&I(s,l[3])},d(l){l&&b(e),l&&b(t)}}}function Q(r){let e,t,s,l,n,o,c,a;return{c(){e=m("label"),t=C("Password"),l=h(),n=m("input"),d(e,"for",s=r[8]),d(n,"type","password"),d(n,"id",o=r[8]),n.required=!0,n.autofocus=!0},m(i,u){_(i,e,u),k(e,t),_(i,l,u),_(i,n,u),H(n,r[0]),n.focus(),c||(a=q(n,"input",r[7]),c=!0)},p(i,u){u&256&&s!==(s=i[8])&&d(e,"for",s),u&256&&o!==(o=i[8])&&d(n,"id",o),u&1&&n.value!==i[0]&&H(n,i[0])},d(i){i&&b(e),i&&b(l),i&&b(n),c=!1,a()}}}function V(r){let e,t,s,l;const n=[O,K],o=[];function c(a,i){return a[2]?0:1}return e=c(r),t=o[e]=n[e](r),{c(){t.c(),s=U()},m(a,i){o[e].m(a,i),_(a,s,i),l=!0},p(a,i){let u=e;e=c(a),e===u?o[e].p(a,i):(W(),y(o[u],1,1,()=>{o[u]=null}),Y(),t=o[e],t?t.p(a,i):(t=o[e]=n[e](a),t.c()),v(t,1),t.m(s.parentNode,s))},i(a){l||(v(t),l=!0)},o(a){y(t),l=!1},d(a){o[e].d(a),a&&b(s)}}}function X(r){let e,t;return e=new N({props:{nobranding:!0,$$slots:{default:[V]},$$scope:{ctx:r}}}),{c(){T(e.$$.fragment)},m(s,l){L(e,s,l),t=!0},p(s,[l]){const n={};l&527&&(n.$$scope={dirty:l,ctx:s}),e.$set(n)},i(s){t||(v(e.$$.fragment,s),t=!0)},o(s){y(e.$$.fragment,s),t=!1},d(s){z(e,s)}}}function Z(r,e,t){let s,{params:l}=e,n="",o=!1,c=!1;async function a(){if(o)return;t(1,o=!0);const g=new j("../");try{await g.users.confirmEmailChange(l==null?void 0:l.token,n),t(2,c=!0)}catch($){A.errorResponseHandler($)}t(1,o=!1)}const i=()=>window.close();function u(){n=this.value,t(0,n)}return r.$$set=g=>{"params"in g&&t(5,l=g.params)},r.$$.update=()=>{r.$$.dirty&32&&t(3,s=R.getJWTPayload(l==null?void 0:l.token).newEmail||"")},[n,o,c,s,a,l,i,u]}class ee extends G{constructor(e){super(),J(this,e,Z,X,M,{params:5})}}export{ee as default}; | ||||
| @@ -1,4 +1,4 @@ | ||||
| import{S as M,i as U,s as W,F as Y,c as H,m as N,t as P,a as q,d as L,C as j,E as A,g as _,k as B,n as D,o as m,G as I,p as K,q as E,e as b,w as y,b as C,f as c,r as G,h as w,u as S,v as O,y as F,x as Q,z as R}from"./index.a9e352ad.js";function V(i){let e,l,s,n,t,o,p,u,r,a,v,g,k,h,d=i[4]&&J(i);return o=new E({props:{class:"form-field required",name:"password",$$slots:{default:[Z,({uniqueId:f})=>({10:f}),({uniqueId:f})=>f?1024:0]},$$scope:{ctx:i}}}),u=new E({props:{class:"form-field required",name:"passwordConfirm",$$slots:{default:[x,({uniqueId:f})=>({10:f}),({uniqueId:f})=>f?1024:0]},$$scope:{ctx:i}}}),{c(){e=b("form"),l=b("div"),s=b("h5"),n=y(`Reset your user password
 | ||||
| import{S as M,i as U,s as W,F as Y,c as H,m as N,t as P,a as q,d as L,C as j,E as A,g as _,k as B,n as D,o as m,G as I,p as K,q as E,e as b,w as y,b as C,f as c,r as G,h as w,u as S,v as O,y as F,x as Q,z as R}from"./index.bdac21fd.js";function V(i){let e,l,s,n,t,o,p,u,r,a,v,g,k,h,d=i[4]&&J(i);return o=new E({props:{class:"form-field required",name:"password",$$slots:{default:[Z,({uniqueId:f})=>({10:f}),({uniqueId:f})=>f?1024:0]},$$scope:{ctx:i}}}),u=new E({props:{class:"form-field required",name:"passwordConfirm",$$slots:{default:[x,({uniqueId:f})=>({10:f}),({uniqueId:f})=>f?1024:0]},$$scope:{ctx:i}}}),{c(){e=b("form"),l=b("div"),s=b("h5"),n=y(`Reset your user password
 | ||||
|                     `),d&&d.c(),t=C(),H(o.$$.fragment),p=C(),H(u.$$.fragment),r=C(),a=b("button"),v=b("span"),v.textContent="Set new password",c(l,"class","content txt-center m-b-base"),c(v,"class","txt"),c(a,"type","submit"),c(a,"class","btn btn-lg btn-block"),a.disabled=i[2],G(a,"btn-loading",i[2])},m(f,$){_(f,e,$),w(e,l),w(l,s),w(s,n),d&&d.m(s,null),w(e,t),N(o,e,null),w(e,p),N(u,e,null),w(e,r),w(e,a),w(a,v),g=!0,k||(h=S(e,"submit",O(i[5])),k=!0)},p(f,$){f[4]?d?d.p(f,$):(d=J(f),d.c(),d.m(s,null)):d&&(d.d(1),d=null);const T={};$&3073&&(T.$$scope={dirty:$,ctx:f}),o.$set(T);const z={};$&3074&&(z.$$scope={dirty:$,ctx:f}),u.$set(z),(!g||$&4)&&(a.disabled=f[2]),$&4&&G(a,"btn-loading",f[2])},i(f){g||(P(o.$$.fragment,f),P(u.$$.fragment,f),g=!0)},o(f){q(o.$$.fragment,f),q(u.$$.fragment,f),g=!1},d(f){f&&m(e),d&&d.d(),L(o),L(u),k=!1,h()}}}function X(i){let e,l,s,n,t;return{c(){e=b("div"),e.innerHTML=`<div class="icon"><i class="ri-checkbox-circle-line"></i></div>  | ||||
|             <div class="content txt-bold"><p>Successfully changed the user password.</p>  | ||||
|                 <p>You can now sign in with your new password.</p></div>`,l=C(),s=b("button"),s.textContent="Close",c(e,"class","alert alert-success"),c(s,"type","button"),c(s,"class","btn btn-secondary btn-block")},m(o,p){_(o,e,p),_(o,l,p),_(o,s,p),n||(t=S(s,"click",i[7]),n=!0)},p:F,i:F,o:F,d(o){o&&m(e),o&&m(l),o&&m(s),n=!1,t()}}}function J(i){let e,l,s;return{c(){e=y("for "),l=b("strong"),s=y(i[4])},m(n,t){_(n,e,t),_(n,l,t),w(l,s)},p(n,t){t&16&&Q(s,n[4])},d(n){n&&m(e),n&&m(l)}}}function Z(i){let e,l,s,n,t,o,p,u;return{c(){e=b("label"),l=y("New password"),n=C(),t=b("input"),c(e,"for",s=i[10]),c(t,"type","password"),c(t,"id",o=i[10]),t.required=!0,t.autofocus=!0},m(r,a){_(r,e,a),w(e,l),_(r,n,a),_(r,t,a),R(t,i[0]),t.focus(),p||(u=S(t,"input",i[8]),p=!0)},p(r,a){a&1024&&s!==(s=r[10])&&c(e,"for",s),a&1024&&o!==(o=r[10])&&c(t,"id",o),a&1&&t.value!==r[0]&&R(t,r[0])},d(r){r&&m(e),r&&m(n),r&&m(t),p=!1,u()}}}function x(i){let e,l,s,n,t,o,p,u;return{c(){e=b("label"),l=y("New password confirm"),n=C(),t=b("input"),c(e,"for",s=i[10]),c(t,"type","password"),c(t,"id",o=i[10]),t.required=!0},m(r,a){_(r,e,a),w(e,l),_(r,n,a),_(r,t,a),R(t,i[1]),p||(u=S(t,"input",i[9]),p=!0)},p(r,a){a&1024&&s!==(s=r[10])&&c(e,"for",s),a&1024&&o!==(o=r[10])&&c(t,"id",o),a&2&&t.value!==r[1]&&R(t,r[1])},d(r){r&&m(e),r&&m(n),r&&m(t),p=!1,u()}}}function ee(i){let e,l,s,n;const t=[X,V],o=[];function p(u,r){return u[3]?0:1}return e=p(i),l=o[e]=t[e](i),{c(){l.c(),s=A()},m(u,r){o[e].m(u,r),_(u,s,r),n=!0},p(u,r){let a=e;e=p(u),e===a?o[e].p(u,r):(B(),q(o[a],1,1,()=>{o[a]=null}),D(),l=o[e],l?l.p(u,r):(l=o[e]=t[e](u),l.c()),P(l,1),l.m(s.parentNode,s))},i(u){n||(P(l),n=!0)},o(u){q(l),n=!1},d(u){o[e].d(u),u&&m(s)}}}function te(i){let e,l;return e=new Y({props:{nobranding:!0,$$slots:{default:[ee]},$$scope:{ctx:i}}}),{c(){H(e.$$.fragment)},m(s,n){N(e,s,n),l=!0},p(s,[n]){const t={};n&2079&&(t.$$scope={dirty:n,ctx:s}),e.$set(t)},i(s){l||(P(e.$$.fragment,s),l=!0)},o(s){q(e.$$.fragment,s),l=!1},d(s){L(e,s)}}}function se(i,e,l){let s,{params:n}=e,t="",o="",p=!1,u=!1;async function r(){if(p)return;l(2,p=!0);const k=new I("../");try{await k.users.confirmPasswordReset(n==null?void 0:n.token,t,o),l(3,u=!0)}catch(h){K.errorResponseHandler(h)}l(2,p=!1)}const a=()=>window.close();function v(){t=this.value,l(0,t)}function g(){o=this.value,l(1,o)}return i.$$set=k=>{"params"in k&&l(6,n=k.params)},i.$$.update=()=>{i.$$.dirty&64&&l(4,s=j.getJWTPayload(n==null?void 0:n.token).email||"")},[t,o,p,u,s,r,n,a,v,g]}class ne extends M{constructor(e){super(),U(this,e,se,te,W,{params:6})}}export{ne as default}; | ||||
| @@ -1,3 +1,3 @@ | ||||
| import{S as k,i as v,s as y,F as w,c as x,m as C,t as g,a as $,d as L,G as H,E as M,g as r,o as a,e as u,b as m,f,u as _,y as p}from"./index.a9e352ad.js";function P(c){let t,s,e,n,i;return{c(){t=u("div"),t.innerHTML=`<div class="icon"><i class="ri-error-warning-line"></i></div> 
 | ||||
| import{S as k,i as v,s as y,F as w,c as x,m as C,t as g,a as $,d as L,G as H,E as M,g as r,o as a,e as u,b as m,f,u as _,y as p}from"./index.bdac21fd.js";function P(c){let t,s,e,n,i;return{c(){t=u("div"),t.innerHTML=`<div class="icon"><i class="ri-error-warning-line"></i></div> 
 | ||||
|             <div class="content txt-bold"><p>Invalid or expired verification token.</p></div>`,s=m(),e=u("button"),e.textContent="Close",f(t,"class","alert alert-danger"),f(e,"type","button"),f(e,"class","btn btn-secondary btn-block")},m(l,o){r(l,t,o),r(l,s,o),r(l,e,o),n||(i=_(e,"click",c[4]),n=!0)},p,d(l){l&&a(t),l&&a(s),l&&a(e),n=!1,i()}}}function S(c){let t,s,e,n,i;return{c(){t=u("div"),t.innerHTML=`<div class="icon"><i class="ri-checkbox-circle-line"></i></div>  | ||||
|             <div class="content txt-bold"><p>Successfully verified email address.</p></div>`,s=m(),e=u("button"),e.textContent="Close",f(t,"class","alert alert-success"),f(e,"type","button"),f(e,"class","btn btn-secondary btn-block")},m(l,o){r(l,t,o),r(l,s,o),r(l,e,o),n||(i=_(e,"click",c[3]),n=!0)},p,d(l){l&&a(t),l&&a(s),l&&a(e),n=!1,i()}}}function T(c){let t;return{c(){t=u("div"),t.innerHTML='<div class="loader loader-lg"><em>Please wait...</em></div>',f(t,"class","txt-center")},m(s,e){r(s,t,e)},p,d(s){s&&a(t)}}}function F(c){let t;function s(i,l){return i[1]?T:i[0]?S:P}let e=s(c),n=e(c);return{c(){n.c(),t=M()},m(i,l){n.m(i,l),r(i,t,l)},p(i,l){e===(e=s(i))&&n?n.p(i,l):(n.d(1),n=e(i),n&&(n.c(),n.m(t.parentNode,t)))},d(i){n.d(i),i&&a(t)}}}function V(c){let t,s;return t=new w({props:{nobranding:!0,$$slots:{default:[F]},$$scope:{ctx:c}}}),{c(){x(t.$$.fragment)},m(e,n){C(t,e,n),s=!0},p(e,[n]){const i={};n&67&&(i.$$scope={dirty:n,ctx:e}),t.$set(i)},i(e){s||(g(t.$$.fragment,e),s=!0)},o(e){$(t.$$.fragment,e),s=!1},d(e){L(t,e)}}}function q(c,t,s){let{params:e}=t,n=!1,i=!1;l();async function l(){s(1,i=!0);const d=new H("../");try{await d.users.confirmVerification(e==null?void 0:e.token),s(0,n=!0)}catch{s(0,n=!1)}s(1,i=!1)}const o=()=>window.close(),b=()=>window.close();return c.$$set=d=>{"params"in d&&s(2,e=d.params)},[n,i,e,o,b]}class I extends k{constructor(t){super(),v(this,t,q,V,y,{params:2})}}export{I as default}; | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								ui/dist/index.html
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								ui/dist/index.html
									
									
									
									
										vendored
									
									
								
							| @@ -24,7 +24,7 @@ | ||||
|         window.Prism = window.Prism || {}; | ||||
|         window.Prism.manual = true; | ||||
|     </script> | ||||
|   <script type="module" crossorigin src="./assets/index.a9e352ad.js"></script> | ||||
|   <script type="module" crossorigin src="./assets/index.bdac21fd.js"></script> | ||||
|   <link rel="stylesheet" href="./assets/index.9a52adce.css"> | ||||
| </head> | ||||
| <body> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user