Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
陈曦
sub2api
Commits
5fc30ea9
Commit
5fc30ea9
authored
Apr 21, 2026
by
KnowSky404
Browse files
test: cover openai admin test state transitions
parent
f68909a6
Changes
1
Show whitespace changes
Inline
Side-by-side
backend/internal/service/account_test_service_openai_test.go
View file @
5fc30ea9
...
...
@@ -65,6 +65,8 @@ type openAIAccountTestRepo struct {
rateLimitedID
int64
rateLimitedAt
*
time
.
Time
clearedErrorID
int64
setErrorID
int64
setErrorMsg
string
}
func
(
r
*
openAIAccountTestRepo
)
UpdateExtra
(
_
context
.
Context
,
_
int64
,
updates
map
[
string
]
any
)
error
{
...
...
@@ -83,6 +85,12 @@ func (r *openAIAccountTestRepo) ClearError(_ context.Context, id int64) error {
return
nil
}
func
(
r
*
openAIAccountTestRepo
)
SetError
(
_
context
.
Context
,
id
int64
,
errorMsg
string
)
error
{
r
.
setErrorID
=
id
r
.
setErrorMsg
=
errorMsg
return
nil
}
func
TestAccountTestService_OpenAISuccessPersistsSnapshotFromHeaders
(
t
*
testing
.
T
)
{
gin
.
SetMode
(
gin
.
TestMode
)
ctx
,
recorder
:=
newTestContext
()
...
...
@@ -148,4 +156,120 @@ func TestAccountTestService_OpenAI429PersistsSnapshotAndRateLimitState(t *testin
require
.
Equal
(
t
,
account
.
ID
,
repo
.
rateLimitedID
)
require
.
NotNil
(
t
,
repo
.
rateLimitedAt
)
require
.
Equal
(
t
,
account
.
ID
,
repo
.
clearedErrorID
)
require
.
Equal
(
t
,
StatusActive
,
account
.
Status
)
require
.
Empty
(
t
,
account
.
ErrorMessage
)
require
.
NotNil
(
t
,
account
.
RateLimitResetAt
)
}
func
TestAccountTestService_OpenAI429BodyOnlyPersistsRateLimitAndClearsStaleError
(
t
*
testing
.
T
)
{
gin
.
SetMode
(
gin
.
TestMode
)
ctx
,
_
:=
newTestContext
()
resp
:=
newJSONResponse
(
http
.
StatusTooManyRequests
,
`{"error":{"type":"usage_limit_reached","message":"limit reached","resets_at":"1777283883"}}`
)
repo
:=
&
openAIAccountTestRepo
{}
upstream
:=
&
queuedHTTPUpstream
{
responses
:
[]
*
http
.
Response
{
resp
}}
svc
:=
&
AccountTestService
{
accountRepo
:
repo
,
httpUpstream
:
upstream
}
account
:=
&
Account
{
ID
:
77
,
Platform
:
PlatformOpenAI
,
Type
:
AccountTypeOAuth
,
Status
:
StatusError
,
ErrorMessage
:
"Access forbidden (403): account may be suspended or lack permissions"
,
Concurrency
:
1
,
Credentials
:
map
[
string
]
any
{
"access_token"
:
"test-token"
},
}
err
:=
svc
.
testOpenAIAccountConnection
(
ctx
,
account
,
"gpt-5.4"
)
require
.
Error
(
t
,
err
)
require
.
Equal
(
t
,
account
.
ID
,
repo
.
rateLimitedID
)
require
.
NotNil
(
t
,
repo
.
rateLimitedAt
)
require
.
Equal
(
t
,
account
.
ID
,
repo
.
clearedErrorID
)
require
.
Equal
(
t
,
StatusActive
,
account
.
Status
)
require
.
Empty
(
t
,
account
.
ErrorMessage
)
require
.
NotNil
(
t
,
account
.
RateLimitResetAt
)
require
.
Empty
(
t
,
repo
.
updatedExtra
)
}
func
TestAccountTestService_OpenAI429ActiveAccountDoesNotClearError
(
t
*
testing
.
T
)
{
gin
.
SetMode
(
gin
.
TestMode
)
ctx
,
_
:=
newTestContext
()
resp
:=
newJSONResponse
(
http
.
StatusTooManyRequests
,
`{"error":{"type":"usage_limit_reached","message":"limit reached","resets_in_seconds":3600}}`
)
repo
:=
&
openAIAccountTestRepo
{}
upstream
:=
&
queuedHTTPUpstream
{
responses
:
[]
*
http
.
Response
{
resp
}}
svc
:=
&
AccountTestService
{
accountRepo
:
repo
,
httpUpstream
:
upstream
}
account
:=
&
Account
{
ID
:
78
,
Platform
:
PlatformOpenAI
,
Type
:
AccountTypeOAuth
,
Status
:
StatusActive
,
Concurrency
:
1
,
Credentials
:
map
[
string
]
any
{
"access_token"
:
"test-token"
},
}
err
:=
svc
.
testOpenAIAccountConnection
(
ctx
,
account
,
"gpt-5.4"
)
require
.
Error
(
t
,
err
)
require
.
Equal
(
t
,
account
.
ID
,
repo
.
rateLimitedID
)
require
.
NotNil
(
t
,
repo
.
rateLimitedAt
)
require
.
Zero
(
t
,
repo
.
clearedErrorID
)
require
.
Equal
(
t
,
StatusActive
,
account
.
Status
)
require
.
NotNil
(
t
,
account
.
RateLimitResetAt
)
}
func
TestAccountTestService_OpenAI429WithoutResetSignalDoesNotMutateRuntimeState
(
t
*
testing
.
T
)
{
gin
.
SetMode
(
gin
.
TestMode
)
ctx
,
_
:=
newTestContext
()
resp
:=
newJSONResponse
(
http
.
StatusTooManyRequests
,
`{"error":{"type":"usage_limit_reached","message":"limit reached"}}`
)
repo
:=
&
openAIAccountTestRepo
{}
upstream
:=
&
queuedHTTPUpstream
{
responses
:
[]
*
http
.
Response
{
resp
}}
svc
:=
&
AccountTestService
{
accountRepo
:
repo
,
httpUpstream
:
upstream
}
account
:=
&
Account
{
ID
:
79
,
Platform
:
PlatformOpenAI
,
Type
:
AccountTypeOAuth
,
Status
:
StatusError
,
ErrorMessage
:
"stale 403"
,
Concurrency
:
1
,
Credentials
:
map
[
string
]
any
{
"access_token"
:
"test-token"
},
}
err
:=
svc
.
testOpenAIAccountConnection
(
ctx
,
account
,
"gpt-5.4"
)
require
.
Error
(
t
,
err
)
require
.
Zero
(
t
,
repo
.
rateLimitedID
)
require
.
Nil
(
t
,
repo
.
rateLimitedAt
)
require
.
Zero
(
t
,
repo
.
clearedErrorID
)
require
.
Equal
(
t
,
StatusError
,
account
.
Status
)
require
.
Equal
(
t
,
"stale 403"
,
account
.
ErrorMessage
)
require
.
Nil
(
t
,
account
.
RateLimitResetAt
)
}
func
TestAccountTestService_OpenAI401SetsPermanentErrorOnly
(
t
*
testing
.
T
)
{
gin
.
SetMode
(
gin
.
TestMode
)
ctx
,
_
:=
newTestContext
()
resp
:=
newJSONResponse
(
http
.
StatusUnauthorized
,
`{"error":"bad token"}`
)
repo
:=
&
openAIAccountTestRepo
{}
upstream
:=
&
queuedHTTPUpstream
{
responses
:
[]
*
http
.
Response
{
resp
}}
svc
:=
&
AccountTestService
{
accountRepo
:
repo
,
httpUpstream
:
upstream
}
account
:=
&
Account
{
ID
:
80
,
Platform
:
PlatformOpenAI
,
Type
:
AccountTypeOAuth
,
Status
:
StatusActive
,
Concurrency
:
1
,
Credentials
:
map
[
string
]
any
{
"access_token"
:
"test-token"
},
}
err
:=
svc
.
testOpenAIAccountConnection
(
ctx
,
account
,
"gpt-5.4"
)
require
.
Error
(
t
,
err
)
require
.
Equal
(
t
,
account
.
ID
,
repo
.
setErrorID
)
require
.
Contains
(
t
,
repo
.
setErrorMsg
,
"Authentication failed (401)"
)
require
.
Zero
(
t
,
repo
.
rateLimitedID
)
require
.
Zero
(
t
,
repo
.
clearedErrorID
)
require
.
Nil
(
t
,
account
.
RateLimitResetAt
)
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment