@@ -22,10 +22,12 @@ import (
2222
2323type messageThreadHandlerIndexRepositoryStub struct {
2424 repositories.MessageThreadRepository
25- threads []entities.MessageThread
25+ threads []entities.MessageThread
26+ unreadOnly bool
2627}
2728
28- func (stub * messageThreadHandlerIndexRepositoryStub ) Index (context.Context , entities.UserID , string , bool , repositories.IndexParams ) (* []entities.MessageThread , error ) {
29+ func (stub * messageThreadHandlerIndexRepositoryStub ) Index (_ context.Context , _ entities.UserID , _ string , _ bool , unreadOnly bool , _ repositories.IndexParams ) (* []entities.MessageThread , error ) {
30+ stub .unreadOnly = unreadOnly
2931 threads := make ([]entities.MessageThread , len (stub .threads ))
3032 copy (threads , stub .threads )
3133 return & threads , nil
@@ -41,7 +43,7 @@ func (stub *messageThreadHandlerContactProviderStub) GetContactMap(context.Conte
4143 return stub .contacts , nil
4244}
4345
44- func TestMessageThreadHandlerIndex_ParsesContactsQuery (t * testing.T ) {
46+ func TestMessageThreadHandlerIndex_ParsesContactsAndUnreadQuery (t * testing.T ) {
4547 contact := & entities.Contact {ID : uuid .New (), Name : "Alice" , PhoneNumbers : []string {"+18005550100" }}
4648 repository := & messageThreadHandlerIndexRepositoryStub {threads : []entities.MessageThread {{Contact : "+18005550100" }}}
4749 provider := & messageThreadHandlerContactProviderStub {contacts : map [string ]* entities.Contact {"+18005550100" : contact }}
@@ -57,19 +59,41 @@ func TestMessageThreadHandlerIndex_ParsesContactsQuery(t *testing.T) {
5759 })
5860 handler .RegisterRoutes (app )
5961
60- req := httptest .NewRequest (http .MethodGet , "/v1/message-threads?owner=%2B18005550199&contacts=true" , nil )
62+ req := httptest .NewRequest (http .MethodGet , "/v1/message-threads?owner=%2B18005550199&contacts=true&unread_only=true " , nil )
6163 resp , err := app .Test (req , fiber.TestConfig {Timeout : time .Second })
6264
6365 require .NoError (t , err )
6466 require .Equal (t , http .StatusOK , resp .StatusCode )
6567 assert .Equal (t , 1 , provider .calls )
68+ assert .True (t , repository .unreadOnly )
6669
6770 var payload struct {
6871 Data []entities.MessageThread `json:"data"`
6972 }
73+
7074 require .NoError (t , json .NewDecoder (resp .Body ).Decode (& payload ))
7175 require .Len (t , payload .Data , 1 )
7276 require .NotNil (t , payload .Data [0 ].ContactDetails )
7377 assert .Equal (t , contact .ID , payload .Data [0 ].ContactDetails .ID )
7478 assert .Equal (t , "Alice" , payload .Data [0 ].ContactDetails .Name )
7579}
80+
81+ func TestMessageThreadHandlerIndexRejectsInvalidUnreadFilter (t * testing.T ) {
82+ repository := & messageThreadHandlerIndexRepositoryStub {}
83+ logger := & messageThreadHandlerNoopLogger {}
84+ tracer := telemetry .NewOtelLogger ("test" , logger )
85+ service := services .NewMessageThreadService (logger , tracer , repository , nil , nil , nil )
86+ handler := NewMessageThreadHandler (logger , tracer , validators .NewMessageThreadHandlerValidator (logger , tracer ), service )
87+ app := fiber .New ()
88+ app .Use (func (c fiber.Ctx ) error {
89+ c .Locals (middlewares .ContextKeyAuthUserID , entities.AuthContext {ID : entities .UserID ("user-id" ), Email : "user@example.com" })
90+ return c .Next ()
91+ })
92+ handler .RegisterRoutes (app )
93+
94+ response , err := app .Test (httptest .NewRequest (http .MethodGet , "/v1/message-threads?owner=%2B18005550199&unread_only=invalid" , nil ))
95+
96+ require .NoError (t , err )
97+ defer response .Body .Close ()
98+ assert .Equal (t , http .StatusUnprocessableEntity , response .StatusCode )
99+ }
0 commit comments