mirror of
https://github.com/imgproxy/imgproxy.git
synced 2025-10-05 02:59:45 +02:00
60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package testutil
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/stretchr/testify/suite"
|
|
)
|
|
|
|
// LazySuite is a test suite that automatically resets [LazyObj] instances.
|
|
// It uses [LazySuite.AfterTest] to perform the reset after each test,
|
|
// so if you also use this function in your test suite, don't forget to call
|
|
// [LazySuite.AfterTest] or [LazySuite.ResetLazyObjects] explicitly.
|
|
type LazySuite struct {
|
|
suite.Suite
|
|
|
|
resets []context.CancelFunc
|
|
}
|
|
|
|
// Lazy returns the LazySuite instance itself.
|
|
// Needed to implement [LazySuiteFrom].
|
|
func (s *LazySuite) Lazy() *LazySuite {
|
|
return s
|
|
}
|
|
|
|
// AfterTest is called by testify after each test.
|
|
// If you also use this function in your test suite, don't forget to call
|
|
// [LazySuite.AfterTest] or [LazySuite.ResetLazyObjects] explicitly.
|
|
func (s *LazySuite) AfterTest(_, _ string) {
|
|
// Reset lazy objects after each test
|
|
s.ResetLazyObjects()
|
|
}
|
|
|
|
// ResetLazyObjects resets all lazy objects created with [NewLazySuiteObj]
|
|
func (s *LazySuite) ResetLazyObjects() {
|
|
for _, reset := range s.resets {
|
|
reset()
|
|
}
|
|
}
|
|
|
|
type LazySuiteFrom interface {
|
|
Lazy() *LazySuite
|
|
}
|
|
|
|
// NewLazySuiteObj creates a new [LazyObj] instance and registers its cleanup function
|
|
// to a provided [LazySuite].
|
|
func NewLazySuiteObj[T any](
|
|
s LazySuiteFrom,
|
|
newFn LazyObjNew[T],
|
|
dropFn ...LazyObjDrop[T],
|
|
) (LazyObj[T], context.CancelFunc) {
|
|
// Get the [LazySuite] instance
|
|
lazy := s.Lazy()
|
|
// Create the [LazyObj] instance
|
|
obj, cancel := NewLazyObj(lazy, newFn, dropFn...)
|
|
// Add cleanup function to the resets list
|
|
lazy.resets = append(lazy.resets, cancel)
|
|
|
|
return obj, cancel
|
|
}
|