Files

104 lines
2.3 KiB
Go

package tokens
import (
"context"
customermodel "git.sendico.io/tech/sxchnge/product/customers/model"
sessionmodel "git.sendico.io/tech/sxchnge/product/sessions/model"
"net/http"
"testing"
"git.sendico.io/tech/sxchnge/product/sessions/store"
"go.mongodb.org/mongo-driver/v2/bson"
"go.uber.org/zap"
)
type recordingRefreshTokenDB struct {
refreshtokens.DB
token *sessionmodel.RefreshToken
}
func (db *recordingRefreshTokenDB) Create(_ context.Context, token *sessionmodel.RefreshToken) error {
db.token = token
return nil
}
func TestPrepareRefreshTokenStoresResolvedClientIP(t *testing.T) {
tests := []struct {
name string
remoteAddr string
realIP string
want string
}{
{
name: "proxied IPv4",
remoteAddr: "172.19.0.37:45706",
realIP: "203.0.113.10",
want: "203.0.113.10",
},
{
name: "direct IPv4",
remoteAddr: "203.0.113.11:45706",
want: "203.0.113.11",
},
{
name: "proxied IPv6",
remoteAddr: "172.19.0.37:45706",
realIP: "2001:0db8:0000:0000:0000:0000:0000:0012",
want: "2001:db8::12",
},
{
name: "direct IPv6",
remoteAddr: "[2001:db8::13]:45706",
want: "2001:db8::13",
},
{
name: "missing address",
want: "",
},
{
name: "invalid address",
remoteAddr: "not-an-address",
realIP: "also-not-an-address",
want: "",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
request := &http.Request{
RemoteAddr: tt.remoteAddr,
Header: make(http.Header),
}
if tt.realIP != "" {
request.Header.Set("X-Real-IP", tt.realIP)
}
account := &customermodel.Account{}
account.SetID(bson.NewObjectID())
db := &recordingRefreshTokenDB{}
_, err := PrepareRefreshToken(
context.Background(),
request,
db,
32,
24,
&sessionmodel.SessionIdentifier{ClientID: "client", DeviceID: "device"},
account,
zap.NewNop(),
)
if err != nil {
t.Fatalf("prepare refresh token: %v", err)
}
if db.token == nil {
t.Fatal("expected refresh token to be stored")
}
if db.token.IPAddress != tt.want {
t.Fatalf("unexpected stored IP address: got %q, want %q", db.token.IPAddress, tt.want)
}
if db.token.SessionVersion == "" {
t.Fatal("expected a server-generated session version")
}
})
}
}