github.com/status-im/status-go@v1.1.0/server/qrops_test.go (about) 1 package server 2 3 import ( 4 "encoding/base64" 5 "io/ioutil" 6 "net/url" 7 "os" 8 "testing" 9 "time" 10 11 "github.com/stretchr/testify/require" 12 "github.com/stretchr/testify/suite" 13 14 "github.com/status-im/status-go/images" 15 "github.com/status-im/status-go/multiaccounts" 16 "github.com/status-im/status-go/server/servertest" 17 ) 18 19 type QROpsTestSuite struct { 20 suite.Suite 21 servertest.TestKeyComponents 22 servertest.TestLoggerComponents 23 24 server *MediaServer 25 serverNoPort *MediaServer 26 testStart time.Time 27 multiaccountsDB *multiaccounts.Database 28 } 29 30 var ( 31 keyUID = "0xdeadbeef" 32 qrURL = "https://github.com/status-im/status-go/pull/3154" 33 ) 34 35 func TestQROpsTestSuite(t *testing.T) { 36 suite.Run(t, new(QROpsTestSuite)) 37 } 38 39 func (s *QROpsTestSuite) SetupTest() { 40 s.SetupKeyComponents(s.T()) 41 s.SetupLoggerComponents() 42 43 mediaServer, err := NewMediaServer(nil, nil, nil, nil) 44 s.Require().NoError(err) 45 46 s.server = mediaServer 47 err = s.server.SetPort(customPortForTests) 48 s.Require().NoError(err) 49 50 err = s.server.Start() 51 s.Require().NoError(err) 52 53 s.serverNoPort = &MediaServer{Server: Server{ 54 hostname: LocalHostIP.String(), 55 portManger: newPortManager(s.Logger, nil), 56 }} 57 go func() { 58 time.Sleep(waitTime) 59 s.serverNoPort.port = 80 60 }() 61 62 s.testStart = time.Now() 63 } 64 65 func seedTestDBWithIdentityImagesForQRCodeTests(s *QROpsTestSuite, db *multiaccounts.Database, keyUID string) { 66 iis := images.SampleIdentityImageForQRCode() 67 err := db.StoreIdentityImages(keyUID, iis, false) 68 s.Require().NoError(err) 69 } 70 71 // TestQROpsCodeWithoutSuperImposingLogo tests the QR code generation logic, it also allows us to debug in case 72 // things go wrong, here we compare generate a new QR code and compare its bytes with an already generated one. 73 func (s *QROpsTestSuite) TestQROpsCodeWithoutSuperImposingLogo() { 74 75 var params = url.Values{} 76 params.Set("url", base64.StdEncoding.EncodeToString([]byte(qrURL))) 77 params.Set("allowProfileImage", "false") 78 params.Set("level", "2") 79 params.Set("size", "200") 80 params.Set("imageName", "") 81 82 payload := generateQRBytes(params, s.Logger, s.multiaccountsDB) 83 expectedPayload, err := images.Asset("_assets/tests/qr/defaultQR.png") 84 85 s.Require().NoError(err) 86 s.Require().NotEmpty(payload) 87 require.Equal(s.T(), payload, expectedPayload) 88 } 89 90 func (s *QROpsTestSuite) TestQROpsCodeWithSuperImposingLogo() { 91 92 tmpfile, err := ioutil.TempFile("", "accounts-tests-") 93 s.Require().NoError(err) 94 95 db, err := multiaccounts.InitializeDB(tmpfile.Name()) 96 s.Require().NoError(err) 97 98 seedTestDBWithIdentityImagesForQRCodeTests(s, db, keyUID) 99 100 var params = url.Values{} 101 params.Set("url", base64.StdEncoding.EncodeToString([]byte(qrURL))) 102 params.Set("allowProfileImage", "true") 103 params.Set("level", "2") 104 params.Set("size", "200") 105 params.Set("keyUid", keyUID) 106 params.Set("imageName", "large") 107 108 payload := generateQRBytes(params, s.Logger, db) 109 s.Require().NotEmpty(payload) 110 111 expectedPayload, err := images.Asset("_assets/tests/qr/QRWithLogo.png") 112 require.Equal(s.T(), payload, expectedPayload) 113 s.Require().NoError(err) 114 115 err = db.Close() 116 s.Require().NoError(err) 117 118 err = os.Remove(tmpfile.Name()) 119 s.Require().NoError(err) 120 }