2020-01-09 14:56:32 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package integrations
import (
"fmt"
"net/http"
"testing"
"code.gitea.io/gitea/models"
2021-11-16 11:53:21 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2020-01-09 14:56:32 +03:00
api "code.gitea.io/gitea/modules/structs"
"github.com/stretchr/testify/assert"
)
func TestAPINotification ( t * testing . T ) {
defer prepareTestEnv ( t ) ( )
2021-11-24 12:49:20 +03:00
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } ) . ( * user_model . User )
2021-11-16 11:53:21 +03:00
repo1 := unittest . AssertExistsAndLoadBean ( t , & models . Repository { ID : 1 } ) . ( * models . Repository )
thread5 := unittest . AssertExistsAndLoadBean ( t , & models . Notification { ID : 5 } ) . ( * models . Notification )
2020-01-09 14:56:32 +03:00
assert . NoError ( t , thread5 . LoadAttributes ( ) )
session := loginUser ( t , user2 . Name )
token := getTokenForLoggedInUser ( t , session )
// -- GET /notifications --
// test filter
since := "2000-01-01T00%3A50%3A01%2B00%3A00" //946687801
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications?since=%s&token=%s" , since , token ) )
resp := session . MakeRequest ( t , req , http . StatusOK )
var apiNL [ ] api . NotificationThread
DecodeJSON ( t , resp , & apiNL )
assert . Len ( t , apiNL , 1 )
assert . EqualValues ( t , 5 , apiNL [ 0 ] . ID )
// test filter
before := "2000-01-01T01%3A06%3A59%2B00%3A00" //946688819
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications?all=%s&before=%s&token=%s" , "true" , before , token ) )
resp = session . MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & apiNL )
assert . Len ( t , apiNL , 3 )
assert . EqualValues ( t , 4 , apiNL [ 0 ] . ID )
2021-06-07 08:27:09 +03:00
assert . True ( t , apiNL [ 0 ] . Unread )
assert . False ( t , apiNL [ 0 ] . Pinned )
2020-01-09 14:56:32 +03:00
assert . EqualValues ( t , 3 , apiNL [ 1 ] . ID )
2021-06-07 08:27:09 +03:00
assert . False ( t , apiNL [ 1 ] . Unread )
assert . True ( t , apiNL [ 1 ] . Pinned )
2020-01-09 14:56:32 +03:00
assert . EqualValues ( t , 2 , apiNL [ 2 ] . ID )
2021-06-07 08:27:09 +03:00
assert . False ( t , apiNL [ 2 ] . Unread )
assert . False ( t , apiNL [ 2 ] . Pinned )
2020-01-09 14:56:32 +03:00
// -- GET /repos/{owner}/{repo}/notifications --
2020-07-12 00:46:01 +03:00
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/repos/%s/%s/notifications?status-types=unread&token=%s" , user2 . Name , repo1 . Name , token ) )
2020-01-09 14:56:32 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & apiNL )
assert . Len ( t , apiNL , 1 )
assert . EqualValues ( t , 4 , apiNL [ 0 ] . ID )
2021-12-03 22:20:41 +03:00
// -- GET /repos/{owner}/{repo}/notifications -- multiple status-types
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/repos/%s/%s/notifications?status-types=unread&status-types=pinned&token=%s" , user2 . Name , repo1 . Name , token ) )
resp = session . MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & apiNL )
assert . Len ( t , apiNL , 2 )
assert . EqualValues ( t , 4 , apiNL [ 0 ] . ID )
assert . True ( t , apiNL [ 0 ] . Unread )
assert . False ( t , apiNL [ 0 ] . Pinned )
assert . EqualValues ( t , 3 , apiNL [ 1 ] . ID )
assert . False ( t , apiNL [ 1 ] . Unread )
assert . True ( t , apiNL [ 1 ] . Pinned )
2020-01-09 14:56:32 +03:00
// -- GET /notifications/threads/{id} --
// get forbidden
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications/threads/%d?token=%s" , 1 , token ) )
2021-11-18 04:33:06 +03:00
session . MakeRequest ( t , req , http . StatusForbidden )
2020-01-09 14:56:32 +03:00
// get own
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications/threads/%d?token=%s" , thread5 . ID , token ) )
resp = session . MakeRequest ( t , req , http . StatusOK )
var apiN api . NotificationThread
DecodeJSON ( t , resp , & apiN )
assert . EqualValues ( t , 5 , apiN . ID )
2021-06-07 08:27:09 +03:00
assert . False ( t , apiN . Pinned )
assert . True ( t , apiN . Unread )
2020-01-09 14:56:32 +03:00
assert . EqualValues ( t , "issue4" , apiN . Subject . Title )
assert . EqualValues ( t , "Issue" , apiN . Subject . Type )
assert . EqualValues ( t , thread5 . Issue . APIURL ( ) , apiN . Subject . URL )
assert . EqualValues ( t , thread5 . Repository . HTMLURL ( ) , apiN . Repository . HTMLURL )
2020-04-11 02:49:39 +03:00
new := struct {
New int64 ` json:"new" `
} { }
2020-01-14 18:37:19 +03:00
// -- check notifications --
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications/new?token=%s" , token ) )
resp = session . MakeRequest ( t , req , http . StatusOK )
2020-04-11 02:49:39 +03:00
DecodeJSON ( t , resp , & new )
assert . True ( t , new . New > 0 )
2020-01-14 18:37:19 +03:00
2020-01-09 14:56:32 +03:00
// -- mark notifications as read --
2020-07-12 00:46:01 +03:00
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications?status-types=unread&token=%s" , token ) )
2020-01-09 14:56:32 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & apiNL )
assert . Len ( t , apiNL , 2 )
lastReadAt := "2000-01-01T00%3A50%3A01%2B00%3A00" //946687801 <- only Notification 4 is in this filter ...
req = NewRequest ( t , "PUT" , fmt . Sprintf ( "/api/v1/repos/%s/%s/notifications?last_read_at=%s&token=%s" , user2 . Name , repo1 . Name , lastReadAt , token ) )
2021-11-18 04:33:06 +03:00
session . MakeRequest ( t , req , http . StatusResetContent )
2020-01-09 14:56:32 +03:00
2020-07-12 00:46:01 +03:00
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications?status-types=unread&token=%s" , token ) )
2020-01-09 14:56:32 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & apiNL )
assert . Len ( t , apiNL , 1 )
// -- PATCH /notifications/threads/{id} --
req = NewRequest ( t , "PATCH" , fmt . Sprintf ( "/api/v1/notifications/threads/%d?token=%s" , thread5 . ID , token ) )
2021-11-18 04:33:06 +03:00
session . MakeRequest ( t , req , http . StatusResetContent )
2020-01-09 14:56:32 +03:00
assert . Equal ( t , models . NotificationStatusUnread , thread5 . Status )
2021-11-16 11:53:21 +03:00
thread5 = unittest . AssertExistsAndLoadBean ( t , & models . Notification { ID : 5 } ) . ( * models . Notification )
2020-01-09 14:56:32 +03:00
assert . Equal ( t , models . NotificationStatusRead , thread5 . Status )
2020-01-14 18:37:19 +03:00
// -- check notifications --
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications/new?token=%s" , token ) )
2020-04-11 02:49:39 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & new )
assert . True ( t , new . New == 0 )
2020-01-09 14:56:32 +03:00
}
2021-12-03 22:20:41 +03:00
func TestAPINotificationPUT ( t * testing . T ) {
defer prepareTestEnv ( t ) ( )
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } ) . ( * user_model . User )
thread5 := unittest . AssertExistsAndLoadBean ( t , & models . Notification { ID : 5 } ) . ( * models . Notification )
assert . NoError ( t , thread5 . LoadAttributes ( ) )
session := loginUser ( t , user2 . Name )
token := getTokenForLoggedInUser ( t , session )
// Check notifications are as expected
req := NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications?all=true&token=%s" , token ) )
resp := session . MakeRequest ( t , req , http . StatusOK )
var apiNL [ ] api . NotificationThread
DecodeJSON ( t , resp , & apiNL )
assert . Len ( t , apiNL , 4 )
assert . EqualValues ( t , 5 , apiNL [ 0 ] . ID )
assert . True ( t , apiNL [ 0 ] . Unread )
assert . False ( t , apiNL [ 0 ] . Pinned )
assert . EqualValues ( t , 4 , apiNL [ 1 ] . ID )
assert . True ( t , apiNL [ 1 ] . Unread )
assert . False ( t , apiNL [ 1 ] . Pinned )
assert . EqualValues ( t , 3 , apiNL [ 2 ] . ID )
assert . False ( t , apiNL [ 2 ] . Unread )
assert . True ( t , apiNL [ 2 ] . Pinned )
assert . EqualValues ( t , 2 , apiNL [ 3 ] . ID )
assert . False ( t , apiNL [ 3 ] . Unread )
assert . False ( t , apiNL [ 3 ] . Pinned )
//
// Notification ID 2 is the only one with status-type read & pinned
// change it to unread.
//
req = NewRequest ( t , "PUT" , fmt . Sprintf ( "/api/v1/notifications?status-types=read&status-type=pinned&to-status=unread&token=%s" , token ) )
resp = session . MakeRequest ( t , req , http . StatusResetContent )
DecodeJSON ( t , resp , & apiNL )
assert . Len ( t , apiNL , 1 )
assert . EqualValues ( t , 2 , apiNL [ 0 ] . ID )
assert . True ( t , apiNL [ 0 ] . Unread )
assert . False ( t , apiNL [ 0 ] . Pinned )
//
// Now nofication ID 2 is the first in the list and is unread.
//
req = NewRequest ( t , "GET" , fmt . Sprintf ( "/api/v1/notifications?all=true&token=%s" , token ) )
resp = session . MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & apiNL )
assert . Len ( t , apiNL , 4 )
assert . EqualValues ( t , 2 , apiNL [ 0 ] . ID )
assert . True ( t , apiNL [ 0 ] . Unread )
assert . False ( t , apiNL [ 0 ] . Pinned )
}