2023-03-01 11:53:17 +00:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/base64"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/url"
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/stretchr/testify/suite"
|
|
|
|
|
|
|
|
"github.com/status-im/status-go/images"
|
|
|
|
"github.com/status-im/status-go/multiaccounts"
|
2023-03-21 12:22:46 +00:00
|
|
|
"github.com/status-im/status-go/server/servertest"
|
2023-03-01 11:53:17 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type QROpsTestSuite struct {
|
|
|
|
suite.Suite
|
2023-03-21 12:22:46 +00:00
|
|
|
servertest.TestKeyComponents
|
|
|
|
servertest.TestLoggerComponents
|
2023-03-01 11:53:17 +00:00
|
|
|
|
|
|
|
server *MediaServer
|
|
|
|
serverNoPort *MediaServer
|
|
|
|
testStart time.Time
|
|
|
|
multiaccountsDB *multiaccounts.Database
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
keyUID = "0xdeadbeef"
|
|
|
|
qrURL = "https://github.com/status-im/status-go/pull/3154"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestQROpsTestSuite(t *testing.T) {
|
|
|
|
suite.Run(t, new(QROpsTestSuite))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *QROpsTestSuite) SetupTest() {
|
|
|
|
s.SetupKeyComponents(s.T())
|
|
|
|
s.SetupLoggerComponents()
|
|
|
|
|
2023-12-15 20:29:39 +00:00
|
|
|
mediaServer, err := NewMediaServer(nil, nil, nil, nil)
|
2023-03-01 11:53:17 +00:00
|
|
|
s.Require().NoError(err)
|
|
|
|
|
|
|
|
s.server = mediaServer
|
|
|
|
err = s.server.SetPort(customPortForTests)
|
|
|
|
s.Require().NoError(err)
|
|
|
|
|
|
|
|
err = s.server.Start()
|
|
|
|
s.Require().NoError(err)
|
|
|
|
|
|
|
|
s.serverNoPort = &MediaServer{Server: Server{
|
2023-08-22 16:18:14 +00:00
|
|
|
hostname: LocalHostIP.String(),
|
2023-03-01 11:53:17 +00:00
|
|
|
portManger: newPortManager(s.Logger, nil),
|
|
|
|
}}
|
|
|
|
go func() {
|
|
|
|
time.Sleep(waitTime)
|
|
|
|
s.serverNoPort.port = 80
|
|
|
|
}()
|
|
|
|
|
|
|
|
s.testStart = time.Now()
|
|
|
|
}
|
|
|
|
|
|
|
|
func seedTestDBWithIdentityImagesForQRCodeTests(s *QROpsTestSuite, db *multiaccounts.Database, keyUID string) {
|
|
|
|
iis := images.SampleIdentityImageForQRCode()
|
|
|
|
err := db.StoreIdentityImages(keyUID, iis, false)
|
|
|
|
s.Require().NoError(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// TestQROpsCodeWithoutSuperImposingLogo tests the QR code generation logic, it also allows us to debug in case
|
|
|
|
// things go wrong, here we compare generate a new QR code and compare its bytes with an already generated one.
|
|
|
|
func (s *QROpsTestSuite) TestQROpsCodeWithoutSuperImposingLogo() {
|
|
|
|
|
|
|
|
var params = url.Values{}
|
|
|
|
params.Set("url", base64.StdEncoding.EncodeToString([]byte(qrURL)))
|
|
|
|
params.Set("allowProfileImage", "false")
|
|
|
|
params.Set("level", "2")
|
|
|
|
params.Set("size", "200")
|
|
|
|
params.Set("imageName", "")
|
|
|
|
|
|
|
|
payload := generateQRBytes(params, s.Logger, s.multiaccountsDB)
|
|
|
|
expectedPayload, err := images.Asset("_assets/tests/qr/defaultQR.png")
|
|
|
|
|
|
|
|
s.Require().NoError(err)
|
|
|
|
s.Require().NotEmpty(payload)
|
|
|
|
require.Equal(s.T(), payload, expectedPayload)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *QROpsTestSuite) TestQROpsCodeWithSuperImposingLogo() {
|
|
|
|
|
|
|
|
tmpfile, err := ioutil.TempFile("", "accounts-tests-")
|
|
|
|
s.Require().NoError(err)
|
|
|
|
|
|
|
|
db, err := multiaccounts.InitializeDB(tmpfile.Name())
|
|
|
|
s.Require().NoError(err)
|
|
|
|
|
|
|
|
seedTestDBWithIdentityImagesForQRCodeTests(s, db, keyUID)
|
|
|
|
|
|
|
|
var params = url.Values{}
|
|
|
|
params.Set("url", base64.StdEncoding.EncodeToString([]byte(qrURL)))
|
|
|
|
params.Set("allowProfileImage", "true")
|
|
|
|
params.Set("level", "2")
|
|
|
|
params.Set("size", "200")
|
|
|
|
params.Set("keyUid", keyUID)
|
|
|
|
params.Set("imageName", "large")
|
|
|
|
|
|
|
|
payload := generateQRBytes(params, s.Logger, db)
|
|
|
|
s.Require().NotEmpty(payload)
|
2023-06-01 08:11:01 +00:00
|
|
|
|
2023-03-01 11:53:17 +00:00
|
|
|
expectedPayload, err := images.Asset("_assets/tests/qr/QRWithLogo.png")
|
|
|
|
require.Equal(s.T(), payload, expectedPayload)
|
|
|
|
s.Require().NoError(err)
|
|
|
|
|
|
|
|
err = db.Close()
|
|
|
|
s.Require().NoError(err)
|
|
|
|
|
|
|
|
err = os.Remove(tmpfile.Name())
|
|
|
|
s.Require().NoError(err)
|
|
|
|
}
|