mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-11-02 16:52:25 -06:00 
			
		
		
		
	* Add ContentType to internal models * Add ContentType to API models StatusSource and StatusEdit * Add helpers to convert between API/internal StatusContentType * Write status content type on create/edit * Add migration * Update API docs go run github.com/go-swagger/go-swagger/cmd/swagger generate spec --scan-models --exclude-deps --output docs/api/swagger.yaml * ensure ContentType is updated anywhere Text is * Update docs, take care of TODOs * Set ContentType in more places where Text is set * We don't actually use ContentType on the API status model * Update StatusSource test * Remove unused helper function I copied * Revert change to StatusContentType swagger annotation I'm going to include this in a follow-on PR instead. * Add test for updating content type in edits * Return a value from processContentType instead of modifying the existing status Fixes an issue that was caught by the test I just added - the recorded edit would be marked with the *new* content type instead of the old one, which is obviously bad * Add test for handling of statuses with no stored content type * repurpose an existing test status instead of adding a new one to avoid breaking other tests * Add test to ensure newly created statuses always have content type saved * Do include content type on status API model actually This is mostly important when deleting and redrafting. The comment on `apimodel.Status.Text` implies that it's not sent except in response to status deletion, but actually this doesn't seem to be the case; it also appears to be present in responses to creations and normal fetches and stuff. So I'm treating `ContentType` the same here. * Update new tests to check content type on API statuses * Check content type of API statuses in all tests where text is checked * update other api tests with status content type field * Add test ensuring text and content type are returned when deleting a status * Convert processContentType to free function and remove unused parameter * check for the correct value in the deletion test * Be explicit about this test status having an empty content type * Use omitempty consistently on API models * clean up the final diff a bit * one more swagger regen for the road * Handle nil statuses in processContentType * Don't pass processContentType the entire edit form, it doesn't need it * Move processContentType to common.go and use for creation as well * Remove unused parameters to ContentTypeToAPIContentType
		
			
				
	
	
		
			102 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// GoToSocial
 | 
						|
// Copyright (C) GoToSocial Authors admin@gotosocial.org
 | 
						|
// SPDX-License-Identifier: AGPL-3.0-or-later
 | 
						|
//
 | 
						|
// This program is free software: you can redistribute it and/or modify
 | 
						|
// it under the terms of the GNU Affero General Public License as published by
 | 
						|
// the Free Software Foundation, either version 3 of the License, or
 | 
						|
// (at your option) any later version.
 | 
						|
//
 | 
						|
// This program is distributed in the hope that it will be useful,
 | 
						|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
// GNU Affero General Public License for more details.
 | 
						|
//
 | 
						|
// You should have received a copy of the GNU Affero General Public License
 | 
						|
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 | 
						|
package statuses_test
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"io"
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"strings"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/gin-gonic/gin"
 | 
						|
	"github.com/stretchr/testify/suite"
 | 
						|
	"github.com/superseriousbusiness/gotosocial/internal/api/client/statuses"
 | 
						|
	"github.com/superseriousbusiness/gotosocial/internal/oauth"
 | 
						|
	"github.com/superseriousbusiness/gotosocial/testrig"
 | 
						|
)
 | 
						|
 | 
						|
type StatusSourceTestSuite struct {
 | 
						|
	StatusStandardTestSuite
 | 
						|
}
 | 
						|
 | 
						|
func (suite *StatusSourceTestSuite) TestGetSource() {
 | 
						|
	var (
 | 
						|
		testApplication = suite.testApplications["application_1"]
 | 
						|
		testAccount     = suite.testAccounts["local_account_1"]
 | 
						|
		testUser        = suite.testUsers["local_account_1"]
 | 
						|
		testToken       = oauth.DBTokenToToken(suite.testTokens["local_account_1"])
 | 
						|
		targetStatusID  = suite.testStatuses["local_account_1_status_1"].ID
 | 
						|
		target          = fmt.Sprintf("http://localhost:8080%s", strings.ReplaceAll(statuses.SourcePath, ":id", targetStatusID))
 | 
						|
	)
 | 
						|
 | 
						|
	// Setup request.
 | 
						|
	recorder := httptest.NewRecorder()
 | 
						|
	request := httptest.NewRequest(http.MethodGet, target, nil)
 | 
						|
	request.Header.Set("accept", "application/json")
 | 
						|
	ctx, _ := testrig.CreateGinTestContext(recorder, request)
 | 
						|
 | 
						|
	// Set auth + path params.
 | 
						|
	ctx.Set(oauth.SessionAuthorizedApplication, testApplication)
 | 
						|
	ctx.Set(oauth.SessionAuthorizedToken, testToken)
 | 
						|
	ctx.Set(oauth.SessionAuthorizedUser, testUser)
 | 
						|
	ctx.Set(oauth.SessionAuthorizedAccount, testAccount)
 | 
						|
	ctx.Params = gin.Params{
 | 
						|
		gin.Param{
 | 
						|
			Key:   statuses.IDKey,
 | 
						|
			Value: targetStatusID,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	// Call the handler.
 | 
						|
	suite.statusModule.StatusSourceGETHandler(ctx)
 | 
						|
 | 
						|
	// Check code.
 | 
						|
	if code := recorder.Code; code != http.StatusOK {
 | 
						|
		suite.FailNow("", "unexpected http code: %d", code)
 | 
						|
	}
 | 
						|
 | 
						|
	// Read body.
 | 
						|
	result := recorder.Result()
 | 
						|
	defer result.Body.Close()
 | 
						|
 | 
						|
	b, err := io.ReadAll(result.Body)
 | 
						|
	if err != nil {
 | 
						|
		suite.FailNow(err.Error())
 | 
						|
	}
 | 
						|
 | 
						|
	// Indent nicely.
 | 
						|
	dst := new(bytes.Buffer)
 | 
						|
	if err := json.Indent(dst, b, "", "  "); err != nil {
 | 
						|
		suite.FailNow(err.Error())
 | 
						|
	}
 | 
						|
 | 
						|
	suite.Equal(`{
 | 
						|
  "id": "01F8MHAMCHF6Y650WCRSCP4WMY",
 | 
						|
  "text": "hello everyone!",
 | 
						|
  "spoiler_text": "introduction post",
 | 
						|
  "content_type": "text/plain"
 | 
						|
}`, dst.String())
 | 
						|
}
 | 
						|
 | 
						|
func TestStatusSourceTestSuite(t *testing.T) {
 | 
						|
	suite.Run(t, new(StatusSourceTestSuite))
 | 
						|
}
 |