diff options
| author | 2021-09-10 14:36:10 +0200 | |
|---|---|---|
| committer | 2021-09-10 14:36:10 +0200 | |
| commit | e681aac5899b4a93d7c71e9a334a67c3f2b00e93 (patch) | |
| tree | 748a916a058dff03e42e5aebbfa7f98f8f6288ad /internal/api/client | |
| parent | remove boosted statuses from public (federated timeline) (#201) (diff) | |
| download | gotosocial-e681aac5899b4a93d7c71e9a334a67c3f2b00e93.tar.xz | |
fixes + db changes (#204)
* fixes + db changes
* make duration more lenient
Diffstat (limited to 'internal/api/client')
| -rw-r--r-- | internal/api/client/account/account_test.go | 56 | ||||
| -rw-r--r-- | internal/api/client/account/accountupdate.go | 3 | ||||
| -rw-r--r-- | internal/api/client/account/accountupdate_test.go | 87 | ||||
| -rw-r--r-- | internal/api/client/account/accountverify_test.go | 74 | 
4 files changed, 168 insertions, 52 deletions
| diff --git a/internal/api/client/account/account_test.go b/internal/api/client/account/account_test.go index 02817984b..56f981ab1 100644 --- a/internal/api/client/account/account_test.go +++ b/internal/api/client/account/account_test.go @@ -1,6 +1,12 @@  package account_test  import ( +	"bytes" +	"fmt" +	"net/http" +	"net/http/httptest" + +	"github.com/gin-gonic/gin"  	"github.com/sirupsen/logrus"  	"github.com/stretchr/testify/suite"  	"github.com/superseriousbusiness/gotosocial/internal/api/client/account" @@ -9,11 +15,12 @@ import (  	"github.com/superseriousbusiness/gotosocial/internal/db"  	"github.com/superseriousbusiness/gotosocial/internal/federation"  	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +	"github.com/superseriousbusiness/gotosocial/internal/oauth"  	"github.com/superseriousbusiness/gotosocial/internal/processing"  	"github.com/superseriousbusiness/gotosocial/internal/typeutils" +	"github.com/superseriousbusiness/gotosocial/testrig"  ) -// nolint  type AccountStandardTestSuite struct {  	// standard suite interfaces  	suite.Suite @@ -37,3 +44,50 @@ type AccountStandardTestSuite struct {  	// module being tested  	accountModule *account.Module  } + +func (suite *AccountStandardTestSuite) SetupSuite() { +	suite.testTokens = testrig.NewTestTokens() +	suite.testClients = testrig.NewTestClients() +	suite.testApplications = testrig.NewTestApplications() +	suite.testUsers = testrig.NewTestUsers() +	suite.testAccounts = testrig.NewTestAccounts() +	suite.testAttachments = testrig.NewTestAttachments() +	suite.testStatuses = testrig.NewTestStatuses() +} + +func (suite *AccountStandardTestSuite) SetupTest() { +	suite.config = testrig.NewTestConfig() +	suite.db = testrig.NewTestDB() +	suite.storage = testrig.NewTestStorage() +	suite.log = testrig.NewTestLog() +	suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) +	suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator) +	suite.accountModule = account.New(suite.config, suite.processor, suite.log).(*account.Module) +	testrig.StandardDBSetup(suite.db, nil) +	testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") +} + +func (suite *AccountStandardTestSuite) TearDownTest() { +	testrig.StandardDBTeardown(suite.db) +	testrig.StandardStorageTeardown(suite.storage) +} + +func (suite *AccountStandardTestSuite) newContext(recorder *httptest.ResponseRecorder, requestMethod string, requestBody []byte, requestPath string, bodyContentType string) *gin.Context { +	ctx, _ := gin.CreateTestContext(recorder) + +	ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) +	ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["local_account_1"])) +	ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) +	ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) + +	baseURI := fmt.Sprintf("%s://%s", suite.config.Protocol, suite.config.Host) +	requestURI := fmt.Sprintf("%s/%s", baseURI, requestPath) + +	ctx.Request = httptest.NewRequest(http.MethodPatch, requestURI, bytes.NewReader(requestBody)) // the endpoint we're hitting + +	if bodyContentType != "" { +		ctx.Request.Header.Set("Content-Type", bodyContentType) +	} + +	return ctx +} diff --git a/internal/api/client/account/accountupdate.go b/internal/api/client/account/accountupdate.go index 282d172ed..c38ede252 100644 --- a/internal/api/client/account/accountupdate.go +++ b/internal/api/client/account/accountupdate.go @@ -107,7 +107,6 @@ func (m *Module) AccountUpdateCredentialsPATCHHandler(c *gin.Context) {  	}  	l.Tracef("retrieved account %+v", authed.Account.ID) -	l.Debugf("parsing request form %s", c.Request.Form)  	form := &model.UpdateCredentialsRequest{}  	if err := c.ShouldBind(&form); err != nil || form == nil {  		l.Debugf("could not parse form from request: %s", err) @@ -115,6 +114,8 @@ func (m *Module) AccountUpdateCredentialsPATCHHandler(c *gin.Context) {  		return  	} +	l.Debugf("parsed request form %+v", form) +  	// if everything on the form is nil, then nothing has been set and we shouldn't continue  	if form.Discoverable == nil && form.Bot == nil && form.DisplayName == nil && form.Note == nil && form.Avatar == nil && form.Header == nil && form.Locked == nil && form.Source == nil && form.FieldsAttributes == nil {  		l.Debugf("could not parse form from request") diff --git a/internal/api/client/account/accountupdate_test.go b/internal/api/client/account/accountupdate_test.go index 8fc31171b..a02573631 100644 --- a/internal/api/client/account/accountupdate_test.go +++ b/internal/api/client/account/accountupdate_test.go @@ -19,18 +19,17 @@  package account_test  import ( -	"bytes" +	"encoding/json"  	"fmt"  	"io/ioutil"  	"net/http"  	"net/http/httptest"  	"testing" -	"github.com/gin-gonic/gin"  	"github.com/stretchr/testify/assert"  	"github.com/stretchr/testify/suite"  	"github.com/superseriousbusiness/gotosocial/internal/api/client/account" -	"github.com/superseriousbusiness/gotosocial/internal/oauth" +	apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model"  	"github.com/superseriousbusiness/gotosocial/testrig"  ) @@ -38,69 +37,57 @@ type AccountUpdateTestSuite struct {  	AccountStandardTestSuite  } -func (suite *AccountUpdateTestSuite) SetupSuite() { -	suite.testTokens = testrig.NewTestTokens() -	suite.testClients = testrig.NewTestClients() -	suite.testApplications = testrig.NewTestApplications() -	suite.testUsers = testrig.NewTestUsers() -	suite.testAccounts = testrig.NewTestAccounts() -	suite.testAttachments = testrig.NewTestAttachments() -	suite.testStatuses = testrig.NewTestStatuses() -} - -func (suite *AccountUpdateTestSuite) SetupTest() { -	suite.config = testrig.NewTestConfig() -	suite.db = testrig.NewTestDB() -	suite.storage = testrig.NewTestStorage() -	suite.log = testrig.NewTestLog() -	suite.federator = testrig.NewTestFederator(suite.db, testrig.NewTestTransportController(testrig.NewMockHTTPClient(nil), suite.db), suite.storage) -	suite.processor = testrig.NewTestProcessor(suite.db, suite.storage, suite.federator) -	suite.accountModule = account.New(suite.config, suite.processor, suite.log).(*account.Module) -	testrig.StandardDBSetup(suite.db, nil) -	testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") -} - -func (suite *AccountUpdateTestSuite) TearDownTest() { -	testrig.StandardDBTeardown(suite.db) -	testrig.StandardStorageTeardown(suite.storage) -} - -func (suite *AccountUpdateTestSuite) TestAccountUpdateCredentialsPATCHHandler() { - -	requestBody, w, err := testrig.CreateMultipartFormData("header", "../../../../testrig/media/test-jpeg.jpg", map[string]string{ -		"display_name": "updated zork display name!!!", -		"locked":       "true", -	}) +func (suite *AccountUpdateTestSuite) TestAccountUpdateCredentialsPATCHHandlerSimple() { +	// set up the request +	// we're updating the header image, the display name, and the locked status of zork +	// we're removing the note/bio +	requestBody, w, err := testrig.CreateMultipartFormData( +		"header", "../../../../testrig/media/test-jpeg.jpg", +		map[string]string{ +			"display_name": "updated zork display name!!!", +			"note":         "", +			"locked":       "true", +		})  	if err != nil {  		panic(err)  	} - -	// setup  	recorder := httptest.NewRecorder() -	ctx, _ := gin.CreateTestContext(recorder) -	ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) -	ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["local_account_1"])) -	ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) -	ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) -	ctx.Request = httptest.NewRequest(http.MethodPatch, fmt.Sprintf("http://localhost:8080/%s", account.UpdateCredentialsPath), bytes.NewReader(requestBody.Bytes())) // the endpoint we're hitting -	ctx.Request.Header.Set("Content-Type", w.FormDataContentType()) -	suite.accountModule.AccountUpdateCredentialsPATCHHandler(ctx) +	ctx := suite.newContext(recorder, http.MethodPatch, requestBody.Bytes(), account.UpdateCredentialsPath, w.FormDataContentType()) -	// check response +	// call the handler +	suite.accountModule.AccountUpdateCredentialsPATCHHandler(ctx)  	// 1. we should have OK because our request was valid -	suite.EqualValues(http.StatusOK, recorder.Code) +	suite.Equal(http.StatusOK, recorder.Code)  	// 2. we should have no error message in the result body  	result := recorder.Result()  	defer result.Body.Close() +	// check the response  	b, err := ioutil.ReadAll(result.Body)  	assert.NoError(suite.T(), err) -  	fmt.Println(string(b)) -	// TODO write more assertions allee +	// unmarshal the returned account +	apimodelAccount := &apimodel.Account{} +	err = json.Unmarshal(b, apimodelAccount) +	suite.NoError(err) + +	// check the returned api model account +	// fields should be updated +	suite.Equal("updated zork display name!!!", apimodelAccount.DisplayName) +	suite.True(apimodelAccount.Locked) +	suite.Empty(apimodelAccount.Note) + +	// header values... +	// should be set +	suite.NotEmpty(apimodelAccount.Header) +	suite.NotEmpty(apimodelAccount.HeaderStatic) + +	// should be different from the values set before +	suite.NotEqual("http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpeg", apimodelAccount.Header) +	suite.NotEqual("http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.jpeg", apimodelAccount.HeaderStatic)  }  func TestAccountUpdateTestSuite(t *testing.T) { diff --git a/internal/api/client/account/accountverify_test.go b/internal/api/client/account/accountverify_test.go index 85b0dce50..746d2f5fe 100644 --- a/internal/api/client/account/accountverify_test.go +++ b/internal/api/client/account/accountverify_test.go @@ -17,3 +17,77 @@  */  package account_test + +import ( +	"encoding/json" +	"io/ioutil" +	"net/http" +	"net/http/httptest" +	"testing" +	"time" + +	"github.com/stretchr/testify/assert" +	"github.com/stretchr/testify/suite" +	"github.com/superseriousbusiness/gotosocial/internal/api/client/account" +	apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" +	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +type AccountVerifyTestSuite struct { +	AccountStandardTestSuite +} + +func (suite *AccountVerifyTestSuite) TestAccountVerifyGet() { +	testAccount := suite.testAccounts["local_account_1"] + +	// set up the request +	recorder := httptest.NewRecorder() +	ctx := suite.newContext(recorder, http.MethodPatch, nil, account.UpdateCredentialsPath, "") + +	// call the handler +	suite.accountModule.AccountVerifyGETHandler(ctx) + +	// 1. we should have OK because our request was valid +	suite.Equal(http.StatusOK, recorder.Code) + +	// 2. we should have no error message in the result body +	result := recorder.Result() +	defer result.Body.Close() + +	// check the response +	b, err := ioutil.ReadAll(result.Body) +	assert.NoError(suite.T(), err) + +	// unmarshal the returned account +	apimodelAccount := &apimodel.Account{} +	err = json.Unmarshal(b, apimodelAccount) +	suite.NoError(err) + +	createdAt, err := time.Parse(time.RFC3339, apimodelAccount.CreatedAt) +	suite.NoError(err) +	lastStatusAt, err := time.Parse(time.RFC3339, apimodelAccount.LastStatusAt) +	suite.NoError(err) + +	suite.Equal(testAccount.ID, apimodelAccount.ID) +	suite.Equal(testAccount.Username, apimodelAccount.Username) +	suite.Equal(testAccount.Username, apimodelAccount.Acct) +	suite.Equal(testAccount.DisplayName, apimodelAccount.DisplayName) +	suite.Equal(testAccount.Locked, apimodelAccount.Locked) +	suite.Equal(testAccount.Bot, apimodelAccount.Bot) +	suite.WithinDuration(testAccount.CreatedAt, createdAt, 30*time.Second) // we lose a bit of accuracy serializing so fuzz this a bit +	suite.Equal(testAccount.URL, apimodelAccount.URL) +	suite.Equal("http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/original/01F8MH58A357CV5K7R7TJMSH6S.jpeg", apimodelAccount.Avatar) +	suite.Equal("http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/avatar/small/01F8MH58A357CV5K7R7TJMSH6S.jpeg", apimodelAccount.AvatarStatic) +	suite.Equal("http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpeg", apimodelAccount.Header) +	suite.Equal("http://localhost:8080/fileserver/01F8MH1H7YV1Z7D2C8K2730QBF/header/small/01PFPMWK2FF0D9WMHEJHR07C3Q.jpeg", apimodelAccount.HeaderStatic) +	suite.Zero(apimodelAccount.FollowersCount) +	suite.Equal(2, apimodelAccount.FollowingCount) +	suite.Equal(5, apimodelAccount.StatusesCount) +	suite.WithinDuration(time.Now(), lastStatusAt, 5*time.Minute) +	suite.EqualValues(gtsmodel.VisibilityPublic, apimodelAccount.Source.Privacy) +	suite.Equal(testAccount.Language, apimodelAccount.Source.Language) +} + +func TestAccountVerifyTestSuite(t *testing.T) { +	suite.Run(t, new(AccountVerifyTestSuite)) +} | 
