diff options
Diffstat (limited to 'internal/api/client/statuses')
| -rw-r--r-- | internal/api/client/statuses/statuscreate.go | 10 | ||||
| -rw-r--r-- | internal/api/client/statuses/statuscreate_test.go | 36 | 
2 files changed, 43 insertions, 3 deletions
| diff --git a/internal/api/client/statuses/statuscreate.go b/internal/api/client/statuses/statuscreate.go index e4d8588c7..e8378f461 100644 --- a/internal/api/client/statuses/statuscreate.go +++ b/internal/api/client/statuses/statuscreate.go @@ -98,7 +98,7 @@ func (m *Module) StatusCreatePOSTHandler(c *gin.Context) {  	// }  	// form.Status += "\n\nsent from " + user + "'s iphone\n" -	if err := validateCreateStatus(form); err != nil { +	if err := validateNormalizeCreateStatus(form); err != nil {  		apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1)  		return  	} @@ -112,7 +112,9 @@ func (m *Module) StatusCreatePOSTHandler(c *gin.Context) {  	c.JSON(http.StatusOK, apiStatus)  } -func validateCreateStatus(form *apimodel.AdvancedStatusCreateForm) error { +// validateNormalizeCreateStatus checks the form for disallowed combinations of attachments and overlength inputs. +// Side effect: normalizes the post's language tag. +func validateNormalizeCreateStatus(form *apimodel.AdvancedStatusCreateForm) error {  	hasStatus := form.Status != ""  	hasMedia := len(form.MediaIDs) != 0  	hasPoll := form.Poll != nil @@ -162,9 +164,11 @@ func validateCreateStatus(form *apimodel.AdvancedStatusCreateForm) error {  	}  	if form.Language != "" { -		if err := validate.Language(form.Language); err != nil { +		language, err := validate.Language(form.Language) +		if err != nil {  			return err  		} +		form.Language = language  	}  	return nil diff --git a/internal/api/client/statuses/statuscreate_test.go b/internal/api/client/statuses/statuscreate_test.go index 05f24c24c..d47a74bbc 100644 --- a/internal/api/client/statuses/statuscreate_test.go +++ b/internal/api/client/statuses/statuscreate_test.go @@ -391,6 +391,42 @@ func (suite *StatusCreateTestSuite) TestAttachNewMediaSuccess() {  	suite.Equal(statusResponse.ID, gtsAttachment.StatusID)  } +// Post a new status with a language tag that is not in canonical format +func (suite *StatusCreateTestSuite) TestPostNewStatusWithNoncanonicalLanguageTag() { +	t := suite.testTokens["local_account_1"] +	oauthToken := oauth.DBTokenToToken(t) + +	// setup +	recorder := httptest.NewRecorder() +	ctx, _ := testrig.CreateGinTestContext(recorder, nil) +	ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) +	ctx.Set(oauth.SessionAuthorizedToken, oauthToken) +	ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) +	ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) +	ctx.Request = httptest.NewRequest(http.MethodPost, fmt.Sprintf("http://localhost:8080/%s", statuses.BasePath), nil) // the endpoint we're hitting +	ctx.Request.Header.Set("accept", "application/json") +	ctx.Request.Form = url.Values{ +		"status":   {"English? what's English? i speak American"}, +		"language": {"en-us"}, +	} +	suite.statusModule.StatusCreatePOSTHandler(ctx) + +	suite.EqualValues(http.StatusOK, recorder.Code) + +	result := recorder.Result() +	defer result.Body.Close() +	b, err := ioutil.ReadAll(result.Body) +	suite.NoError(err) + +	statusReply := &apimodel.Status{} +	err = json.Unmarshal(b, statusReply) +	suite.NoError(err) + +	suite.Equal("<p>English? what's English? i speak American</p>", statusReply.Content) +	suite.NotNil(statusReply.Language) +	suite.Equal("en-US", *statusReply.Language) +} +  func TestStatusCreateTestSuite(t *testing.T) {  	suite.Run(t, new(StatusCreateTestSuite))  } | 
