Initial buildout of worker pattern.

This commit is contained in:
Jay
2026-04-17 13:29:49 -04:00
parent 8a9253a9a4
commit 4407e4f202
7 changed files with 272 additions and 102 deletions

View File

@@ -1,118 +1,82 @@
package honeybee
import (
"git.wisehodl.dev/jay/go-honeybee/errors"
"github.com/stretchr/testify/assert"
"testing"
"time"
)
func TestNewPoolConfig(t *testing.T) {
conf, err := NewPoolConfig()
conf, err := NewInitiatorPoolConfig()
assert.NoError(t, err)
assert.Equal(t, conf, &PoolConfig{
IdleTimeout: 20 * time.Second,
assert.Equal(t, conf, &InitiatorPoolConfig{
ConnectionConfig: nil,
WorkerConfig: nil,
WorkerFactory: nil,
})
// errors propagate
_, err = NewPoolConfig(WithIdleTimeout(-1))
assert.Error(t, err)
}
func TestDefaultPoolConfig(t *testing.T) {
conf := GetDefaultPoolConfig()
conf := GetDefaultInitiatorPoolConfig()
assert.Equal(t, conf, &PoolConfig{
IdleTimeout: 20 * time.Second,
assert.Equal(t, conf, &InitiatorPoolConfig{
ConnectionConfig: nil,
WorkerConfig: nil,
WorkerFactory: nil,
})
}
func TestApplyPoolOptions(t *testing.T) {
conf := &PoolConfig{}
err := applyPoolOptions(
conf := &InitiatorPoolConfig{}
err := applyInitiatorPoolOptions(
conf,
WithIdleTimeout(15),
WithConnectionConfig(&ConnectionConfig{}),
WithInitiatorConnectionConfig(&ConnectionConfig{}),
)
assert.NoError(t, err)
assert.Equal(t, time.Duration(15), conf.IdleTimeout)
assert.Equal(t, 0*time.Second, conf.ConnectionConfig.WriteTimeout)
// errors propagate
err = applyPoolOptions(
conf,
WithIdleTimeout(-1),
)
assert.ErrorIs(t, err, errors.InvalidIdleTimeout)
}
func TestWithIdleTimeout(t *testing.T) {
conf := &PoolConfig{}
opt := WithIdleTimeout(30)
err := applyPoolOptions(conf, opt)
assert.NoError(t, err)
assert.Equal(t, conf.IdleTimeout, time.Duration(30))
// zero allowed
conf = &PoolConfig{}
opt = WithIdleTimeout(0)
err = applyPoolOptions(conf, opt)
assert.NoError(t, err)
assert.Equal(t, conf.IdleTimeout, time.Duration(0))
// negative disallowed
conf = &PoolConfig{}
opt = WithIdleTimeout(-30)
err = applyPoolOptions(conf, opt)
assert.ErrorIs(t, err, errors.InvalidIdleTimeout)
assert.ErrorContains(t, err, "idle timeout cannot be negative")
}
func TestWithConnectionConfig(t *testing.T) {
conf := &PoolConfig{}
opt := WithConnectionConfig(&ConnectionConfig{WriteTimeout: 1 * time.Second})
err := applyPoolOptions(conf, opt)
conf := &InitiatorPoolConfig{}
opt := WithInitiatorConnectionConfig(&ConnectionConfig{WriteTimeout: 1 * time.Second})
err := applyInitiatorPoolOptions(conf, opt)
assert.NoError(t, err)
assert.NotNil(t, conf.ConnectionConfig)
assert.Equal(t, 1*time.Second, conf.ConnectionConfig.WriteTimeout)
// invalid config is rejected
conf = &PoolConfig{}
opt = WithConnectionConfig(&ConnectionConfig{WriteTimeout: -1 * time.Second})
err = applyPoolOptions(conf, opt)
conf = &InitiatorPoolConfig{}
opt = WithInitiatorConnectionConfig(&ConnectionConfig{WriteTimeout: -1 * time.Second})
err = applyInitiatorPoolOptions(conf, opt)
assert.Error(t, err)
}
func TestValidatePoolConfig(t *testing.T) {
cases := []struct {
name string
conf PoolConfig
conf InitiatorPoolConfig
wantErr error
wantErrText string
}{
{
name: "valid empty",
conf: *&PoolConfig{},
conf: *&InitiatorPoolConfig{},
},
{
name: "valid defaults",
conf: *GetDefaultPoolConfig(),
conf: *GetDefaultInitiatorPoolConfig(),
},
{
name: "valid complete",
conf: PoolConfig{
IdleTimeout: 15 * time.Second,
conf: InitiatorPoolConfig{
ConnectionConfig: &ConnectionConfig{},
},
},
{
name: "invalid connection config",
conf: PoolConfig{
conf: InitiatorPoolConfig{
ConnectionConfig: &ConnectionConfig{
Retry: &RetryConfig{
InitialDelay: 10 * time.Second,
@@ -126,7 +90,7 @@ func TestValidatePoolConfig(t *testing.T) {
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
err := validatePoolConfig(&tc.conf)
err := validateInitiatorPoolConfig(&tc.conf)
if tc.wantErr != nil || tc.wantErrText != "" {
if tc.wantErr != nil {