| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- package cli_test
-
- import (
- "net/http"
- "testing"
-
- "github.com/9seconds/mtg/v2/config"
- "github.com/9seconds/mtg/v2/mtglib"
- "github.com/jarcoal/httpmock"
- "github.com/stretchr/testify/suite"
- "github.com/xeipuuv/gojsonschema"
- )
-
- var accressResponseJSONSchema = func() *gojsonschema.Schema {
- schema, err := gojsonschema.NewSchema(gojsonschema.NewStringLoader(`
- {
- "type": "object",
- "required": ["secret"],
- "additionalProperties": true,
- "properties": {
- "secret": {
- "type": "object",
- "required": [
- "hex",
- "base64"
- ],
- "additionalProperties": false,
- "properties": {
- "hex": {
- "type": "string",
- "minLength": 34
- },
- "base64": {
- "type": "string",
- "minLength": 10
- }
- }
- },
- "ipv4": {
- "$ref": "#/definitions/ip"
- },
- "ipv6": {
- "$ref": "#/definitions/ip"
- }
- },
- "definitions": {
- "ip": {
- "type": "object",
- "required": [
- "ip",
- "port",
- "tg_url",
- "tg_qrcode",
- "tme_url",
- "tme_qrcode"
- ],
- "additionalProperties": false,
- "properties": {
- "ip": {
- "type": "string",
- "minLength": 1,
- "anyOf": [
- {
- "format": "ipv4"
- },
- {
- "format": "ipv6"
- }
- ]
- },
- "port": {
- "type": "integer",
- "multipleOf": 1.0,
- "exclusiveMinimum": 0,
- "exclusiveMaximum": 65536
- },
- "tg_url": {
- "type": "string",
- "minLength": 1,
- "format": "uri"
- },
- "tg_qrcode": {
- "type": "string",
- "minLength": 1,
- "format": "uri"
- },
- "tme_url": {
- "type": "string",
- "minLength": 1,
- "format": "uri"
- },
- "tme_qrcode": {
- "type": "string",
- "minLength": 1,
- "format": "uri"
- }
- }
- }
- }
- }
- `))
-
- if err != nil {
- panic(err)
- }
-
- return schema
- }()
-
- type AccessTestSuite struct {
- CommonTestSuite
- }
-
- func (suite *AccessTestSuite) SetupTest() {
- suite.CommonTestSuite.SetupTest()
-
- suite.cli.Access.Config = &config.Config{}
- suite.cli.Access.Config.Secret = mtglib.GenerateSecret("google.com")
- suite.cli.Access.Network = suite.networkMock
-
- suite.NoError(
- suite.cli.Access.Config.BindTo.UnmarshalText([]byte("0.0.0.0:80")))
- }
-
- func (suite *AccessTestSuite) TestGenerateNoCalls() {
- suite.NoError(
- suite.cli.Access.Config.Network.PublicIP.IPv4.UnmarshalText(
- []byte("10.0.0.10")))
- suite.NoError(
- suite.cli.Access.Config.Network.PublicIP.IPv6.UnmarshalText(
- []byte("2001:0db8:85a3:0000:0000:8a2e:0370:7334")))
-
- output := suite.CaptureStdout(func() {
- suite.NoError(suite.cli.Access.Execute(suite.cli))
- })
-
- validated, err := accressResponseJSONSchema.Validate(
- gojsonschema.NewStringLoader(output))
- suite.NoError(err)
- suite.Empty(validated.Errors())
- suite.True(validated.Valid())
-
- suite.Contains(output, "10.0.0.10")
- suite.Contains(output, "2001:db8:85a3::8a2e:370:7334")
- suite.Contains(output, "ipv4")
- suite.Contains(output, "ipv6")
- suite.Contains(output, suite.cli.Access.Config.Secret.Base64())
- suite.Contains(output, suite.cli.Access.Config.Secret.Hex())
- }
-
- func (suite *AccessTestSuite) TestGenerateIPv4Call() {
- suite.NoError(
- suite.cli.Access.Config.Network.PublicIP.IPv6.UnmarshalText(
- []byte("2001:0db8:85a3:0000:0000:8a2e:0370:7334")))
-
- httpmock.RegisterResponder(http.MethodGet, "https://ifconfig.co",
- httpmock.NewStringResponder(http.StatusOK, "10.11.12.13"))
-
- output := suite.CaptureStdout(func() {
- suite.NoError(suite.cli.Access.Execute(suite.cli))
- })
-
- validated, err := accressResponseJSONSchema.Validate(
- gojsonschema.NewStringLoader(output))
- suite.NoError(err)
- suite.Empty(validated.Errors())
- suite.True(validated.Valid())
-
- suite.Contains(output, "10.11.12.13")
- suite.Contains(output, "2001:db8:85a3::8a2e:370:7334")
- suite.Contains(output, "ipv4")
- suite.Contains(output, "ipv6")
- suite.Contains(output, suite.cli.Access.Config.Secret.Base64())
- suite.Contains(output, suite.cli.Access.Config.Secret.Hex())
- }
-
- func (suite *AccessTestSuite) TestIPv4CallFail() {
- suite.NoError(
- suite.cli.Access.Config.Network.PublicIP.IPv6.UnmarshalText(
- []byte("2001:0db8:85a3:0000:0000:8a2e:0370:7334")))
-
- httpmock.RegisterResponder(http.MethodGet, "https://ifconfig.co",
- httpmock.NewStringResponder(http.StatusForbidden, ""))
-
- output := suite.CaptureStdout(func() {
- suite.NoError(suite.cli.Access.Execute(suite.cli))
- })
-
- validated, err := accressResponseJSONSchema.Validate(
- gojsonschema.NewStringLoader(output))
- suite.NoError(err)
- suite.Empty(validated.Errors())
- suite.True(validated.Valid())
-
- suite.Contains(output, "2001:db8:85a3::8a2e:370:7334")
- suite.NotContains(output, "ipv4")
- suite.Contains(output, "ipv6")
- suite.Contains(output, suite.cli.Access.Config.Secret.Base64())
- suite.Contains(output, suite.cli.Access.Config.Secret.Hex())
- }
-
- func TestAccess(t *testing.T) {
- t.Parallel()
- suite.Run(t, &AccessTestSuite{})
- }
|