2fas-server/tests/browser_extension/browser_extension_pairing_test.go

207 lines
8.7 KiB
Go
Raw Normal View History

2022-12-31 10:22:38 +01:00
package tests
import (
"encoding/json"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
2023-01-30 19:59:42 +01:00
"github.com/twofas/2fas-server/tests"
2022-12-31 10:22:38 +01:00
"testing"
)
func TestBrowserExtensionPairingTestSuite(t *testing.T) {
suite.Run(t, new(BrowserExtensionPairingTestSuite))
}
type BrowserExtensionPairingTestSuite struct {
suite.Suite
}
func (s *BrowserExtensionPairingTestSuite) SetupTest() {
tests.DoSuccessDelete(s.T(), "browser_extensions")
tests.DoSuccessDelete(s.T(), "browser_extensions/devices")
}
func (s *BrowserExtensionPairingTestSuite) TestPairBrowserExtensionWithMobileDevice() {
browserExt := tests.CreateBrowserExtension(s.T(), "go-test")
_, err := uuid.Parse(browserExt.Id)
require.NoError(s.T(), err)
device, devicePubKey := tests.CreateDevice(s.T(), "go-test-device", "some-device-id")
_, err = uuid.Parse(device.Id)
require.NoError(s.T(), err)
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey, browserExt, device)
var extensionDevice *tests.DevicePairedBrowserExtensionResponse
tests.DoSuccessGet(s.T(), "/browser_extensions/"+browserExt.Id+"/devices/"+device.Id, &extensionDevice)
assert.Equal(s.T(), extensionDevice.Id, device.Id)
}
func (s *BrowserExtensionPairingTestSuite) TestDoNotFindNotPairedBrowserExtensionMobileDevice() {
browserExt := tests.CreateBrowserExtension(s.T(), "go-test")
_, err := uuid.Parse(browserExt.Id)
require.NoError(s.T(), err)
device, _ := tests.CreateDevice(s.T(), "go-test-device", "some-device-id")
response := tests.DoGet("/browser_extensions/"+browserExt.Id+"/devices/"+device.Id, nil)
assert.Equal(s.T(), 404, response.StatusCode)
}
func (s *BrowserExtensionPairingTestSuite) TestPairBrowserExtensionWithMultipleDevices() {
browserExt := tests.CreateBrowserExtension(s.T(), "go-test")
_, err := uuid.Parse(browserExt.Id)
require.NoError(s.T(), err)
device1, devicePubKey1 := tests.CreateDevice(s.T(), "go-test-device-1", "some-device-id-1")
device2, devicePubKey2 := tests.CreateDevice(s.T(), "go-test-device-2", "some-device-id-2")
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey1, browserExt, device1)
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey2, browserExt, device2)
extensionDevices := tests.GetExtensionDevices(s.T(), browserExt.Id)
assert.Len(s.T(), extensionDevices, 2)
}
func (s *BrowserExtensionPairingTestSuite) TestRemoveBrowserExtensionPairedDevice() {
browserExt := tests.CreateBrowserExtension(s.T(), "go-test")
device1, devicePubKey1 := tests.CreateDevice(s.T(), "go-test-device-1", "some-device-id-1")
device2, devicePubKey2 := tests.CreateDevice(s.T(), "go-test-device-2", "some-device-id-2")
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey1, browserExt, device1)
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey2, browserExt, device2)
extensionDevices := getExtensionPairedDevices(s.T(), browserExt)
assert.Len(s.T(), extensionDevices, 2)
tests.DoSuccessDelete(s.T(), "/browser_extensions/"+browserExt.Id+"/devices/"+device1.Id)
extensionDevices = getExtensionPairedDevices(s.T(), browserExt)
assert.Len(s.T(), extensionDevices, 1)
assert.Equal(s.T(), device2.Id, extensionDevices[0].Id)
}
func (s *BrowserExtensionPairingTestSuite) TestRemoveBrowserExtensionPairedDeviceTwice() {
browserExt := tests.CreateBrowserExtension(s.T(), "go-test")
device, devicePubKey := tests.CreateDevice(s.T(), "go-test-device-1", "some-device-id-1")
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey, browserExt, device)
tests.DoSuccessDelete(s.T(), "/browser_extensions/"+browserExt.Id+"/devices/"+device.Id)
response := tests.DoDelete("/browser_extensions/" + browserExt.Id + "/devices/" + device.Id)
assert.Equal(s.T(), 404, response.StatusCode)
}
func (s *BrowserExtensionPairingTestSuite) TestRemoveAllBrowserExtensionPairedDevices() {
browserExt := tests.CreateBrowserExtension(s.T(), "go-test")
device1, devicePubKey1 := tests.CreateDevice(s.T(), "go-test-device-1", "some-device-id1")
device2, devicePubKey2 := tests.CreateDevice(s.T(), "go-test-device-2", "some-device-id2")
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey1, browserExt, device1)
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey2, browserExt, device2)
tests.DoSuccessDelete(s.T(), "/browser_extensions/"+browserExt.Id+"/devices")
extensionDevices := tests.GetExtensionDevices(s.T(), browserExt.Id)
assert.Len(s.T(), extensionDevices, 0)
}
func (s *BrowserExtensionPairingTestSuite) TestGetPairedDevicesWhichIDoNotOwn() {
browserExt1 := tests.CreateBrowserExtension(s.T(), "go-test-1")
browserExt2 := tests.CreateBrowserExtension(s.T(), "go-test-2")
device1, devicePubKey1 := tests.CreateDevice(s.T(), "go-test-device-1", "some-device-id-1")
device2, devicePubKey2 := tests.CreateDevice(s.T(), "go-test-device-2", "some-device-id-2")
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey1, browserExt1, device1)
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey2, browserExt2, device2)
firstExtensionDevices := getExtensionPairedDevices(s.T(), browserExt1)
assert.Len(s.T(), firstExtensionDevices, 1)
assert.Equal(s.T(), device1.Id, firstExtensionDevices[0].Id)
secondExtensionDevices := getExtensionPairedDevices(s.T(), browserExt2)
assert.Len(s.T(), secondExtensionDevices, 1)
assert.Equal(s.T(), device2.Id, secondExtensionDevices[0].Id)
}
func (s *BrowserExtensionPairingTestSuite) TestGetPairedDevicesByInvalidExtensionId() {
browserExt1 := tests.CreateBrowserExtension(s.T(), "go-test-1")
browserExt2 := tests.CreateBrowserExtension(s.T(), "go-test-2")
device1, devicePubKey1 := tests.CreateDevice(s.T(), "go-test-device-1", "some-device-id-1")
device2, devicePubKey2 := tests.CreateDevice(s.T(), "go-test-device-2", "some-device-id-2")
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey1, browserExt1, device1)
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey2, browserExt2, device2)
var firstExtensionDevices []*tests.ExtensionPairedDeviceResponse
response := tests.DoGet("/browser_extensions/some-invalid-id/devices/", &firstExtensionDevices)
assert.Len(s.T(), firstExtensionDevices, 0)
assert.Equal(s.T(), 400, response.StatusCode)
}
func (s *BrowserExtensionPairingTestSuite) TestGetPairedDevicesByNotExistingExtensionId() {
browserExt1 := tests.CreateBrowserExtension(s.T(), "go-test-1")
browserExt2 := tests.CreateBrowserExtension(s.T(), "go-test-2")
device1, devicePubKey1 := tests.CreateDevice(s.T(), "go-test-device-1", "some-device-id-1")
device2, devicePubKey2 := tests.CreateDevice(s.T(), "go-test-device-2", "some-device-id-2")
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey1, browserExt1, device1)
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey2, browserExt2, device2)
notExistingExtensionId := uuid.New()
var firstExtensionDevices []*tests.ExtensionPairedDeviceResponse
tests.DoSuccessGet(s.T(), "/browser_extensions/"+notExistingExtensionId.String()+"/devices/", &firstExtensionDevices)
assert.Len(s.T(), firstExtensionDevices, 0)
}
func (s *BrowserExtensionPairingTestSuite) TestShareExtensionPublicKeyWithMobileDevice() {
browserExt := tests.CreateBrowserExtensionWithPublicKey(s.T(), "go-test", "b64-rsa-pub-key")
_, err := uuid.Parse(browserExt.Id)
require.NoError(s.T(), err)
device, devicePubKey := tests.CreateDevice(s.T(), "go-test-device", "some-device-id")
_, err = uuid.Parse(device.Id)
require.NoError(s.T(), err)
result := tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey, browserExt, device)
assert.Equal(s.T(), "b64-rsa-pub-key", result.ExtensionPublicKey)
}
func (s *BrowserExtensionPairingTestSuite) TestCannotPairSameDeviceAndExtensionTwice() {
browserExtension := tests.CreateBrowserExtensionWithPublicKey(s.T(), "go-test", "b64-rsa-pub-key")
device, devicePubKey := tests.CreateDevice(s.T(), "go-test-device", "some-device-id")
tests.PairDeviceWithBrowserExtension(s.T(), devicePubKey, browserExtension, device)
payload := struct {
ExtensionId string `json:"extension_id"`
DeviceName string `json:"device_name"`
DevicePublicKey string `json:"device_public_key"`
}{
ExtensionId: browserExtension.Id,
DeviceName: device.Name,
DevicePublicKey: "device-pub-key",
}
pairingResult := new(tests.PairingResultResponse)
payloadJson, _ := json.Marshal(payload)
response := tests.DoPost("/mobile/devices/"+device.Id+"/browser_extensions", payloadJson, pairingResult)
assert.Equal(s.T(), 409, response.StatusCode)
}
func getExtensionPairedDevices(t *testing.T, browserExt *tests.BrowserExtensionResponse) []*tests.ExtensionPairedDeviceResponse {
var extensionDevices []*tests.ExtensionPairedDeviceResponse
tests.DoSuccessGet(t, "/browser_extensions/"+browserExt.Id+"/devices/", &extensionDevices)
return extensionDevices
}