github.com/kongr45gpen/mattermost-server@v5.11.1+incompatible/model/integration_action_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package model
     5  
     6  import (
     7  	"bytes"
     8  	"crypto/ecdsa"
     9  	"crypto/elliptic"
    10  	"crypto/rand"
    11  	"encoding/base64"
    12  	"strings"
    13  	"testing"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func TestTriggerIdDecodeAndVerification(t *testing.T) {
    20  
    21  	key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    22  	require.Nil(t, err)
    23  
    24  	t.Run("should succeed decoding and validation", func(t *testing.T) {
    25  		userId := NewId()
    26  		clientTriggerId, triggerId, err := GenerateTriggerId(userId, key)
    27  		decodedClientTriggerId, decodedUserId, err := DecodeAndVerifyTriggerId(triggerId, key)
    28  		assert.Nil(t, err)
    29  		assert.Equal(t, clientTriggerId, decodedClientTriggerId)
    30  		assert.Equal(t, userId, decodedUserId)
    31  	})
    32  
    33  	t.Run("should succeed decoding and validation through request structs", func(t *testing.T) {
    34  		actionReq := &PostActionIntegrationRequest{
    35  			UserId: NewId(),
    36  		}
    37  		clientTriggerId, triggerId, err := actionReq.GenerateTriggerId(key)
    38  		dialogReq := &OpenDialogRequest{TriggerId: triggerId}
    39  		decodedClientTriggerId, decodedUserId, err := dialogReq.DecodeAndVerifyTriggerId(key)
    40  		assert.Nil(t, err)
    41  		assert.Equal(t, clientTriggerId, decodedClientTriggerId)
    42  		assert.Equal(t, actionReq.UserId, decodedUserId)
    43  	})
    44  
    45  	t.Run("should fail on base64 decode", func(t *testing.T) {
    46  		_, _, err := DecodeAndVerifyTriggerId("junk!", key)
    47  		require.NotNil(t, err)
    48  		assert.Equal(t, "interactive_message.decode_trigger_id.base64_decode_failed", err.Id)
    49  	})
    50  
    51  	t.Run("should fail on trigger parsing", func(t *testing.T) {
    52  		_, _, err := DecodeAndVerifyTriggerId(base64.StdEncoding.EncodeToString([]byte("junk!")), key)
    53  		require.NotNil(t, err)
    54  		assert.Equal(t, "interactive_message.decode_trigger_id.missing_data", err.Id)
    55  	})
    56  
    57  	t.Run("should fail on expired timestamp", func(t *testing.T) {
    58  		_, _, err := DecodeAndVerifyTriggerId(base64.StdEncoding.EncodeToString([]byte("some-trigger-id:some-user-id:1234567890:junksignature")), key)
    59  		require.NotNil(t, err)
    60  		assert.Equal(t, "interactive_message.decode_trigger_id.expired", err.Id)
    61  	})
    62  
    63  	t.Run("should fail on base64 decoding signature", func(t *testing.T) {
    64  		_, _, err := DecodeAndVerifyTriggerId(base64.StdEncoding.EncodeToString([]byte("some-trigger-id:some-user-id:12345678900000:junk!")), key)
    65  		require.NotNil(t, err)
    66  		assert.Equal(t, "interactive_message.decode_trigger_id.base64_decode_failed_signature", err.Id)
    67  	})
    68  
    69  	t.Run("should fail on bad signature", func(t *testing.T) {
    70  		_, _, err := DecodeAndVerifyTriggerId(base64.StdEncoding.EncodeToString([]byte("some-trigger-id:some-user-id:12345678900000:junk")), key)
    71  		require.NotNil(t, err)
    72  		assert.Equal(t, "interactive_message.decode_trigger_id.signature_decode_failed", err.Id)
    73  	})
    74  
    75  	t.Run("should fail on bad key", func(t *testing.T) {
    76  		_, triggerId, err := GenerateTriggerId(NewId(), key)
    77  		newKey, keyErr := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
    78  		require.Nil(t, keyErr)
    79  		_, _, err = DecodeAndVerifyTriggerId(triggerId, newKey)
    80  		require.NotNil(t, err)
    81  		assert.Equal(t, "interactive_message.decode_trigger_id.verify_signature_failed", err.Id)
    82  	})
    83  }
    84  
    85  func TestPostActionIntegrationRequestToJson(t *testing.T) {
    86  	o := PostActionIntegrationRequest{UserId: NewId(), Context: StringInterface{"a": "abc"}}
    87  	j := o.ToJson()
    88  	ro := PostActionIntegrationRequestFromJson(bytes.NewReader(j))
    89  
    90  	assert.NotNil(t, ro)
    91  	assert.Equal(t, o, *ro)
    92  }
    93  
    94  func TestPostActionIntegrationRequestFromJsonError(t *testing.T) {
    95  	ro := PostActionIntegrationRequestFromJson(strings.NewReader(""))
    96  	assert.Nil(t, ro)
    97  }
    98  
    99  func TestPostActionIntegrationResponseToJson(t *testing.T) {
   100  	o := PostActionIntegrationResponse{Update: &Post{Id: NewId(), Message: NewId()}, EphemeralText: NewId()}
   101  	j := o.ToJson()
   102  	ro := PostActionIntegrationResponseFromJson(bytes.NewReader(j))
   103  
   104  	assert.NotNil(t, ro)
   105  	assert.Equal(t, o, *ro)
   106  }
   107  
   108  func TestPostActionIntegrationResponseFromJsonError(t *testing.T) {
   109  	ro := PostActionIntegrationResponseFromJson(strings.NewReader(""))
   110  	assert.Nil(t, ro)
   111  }
   112  
   113  func TestSubmitDialogRequestToJson(t *testing.T) {
   114  	t.Run("all fine", func(t *testing.T) {
   115  		request := SubmitDialogRequest{
   116  			URL:        "http://example.org",
   117  			CallbackId: NewId(),
   118  			State:      "some state",
   119  			UserId:     NewId(),
   120  			ChannelId:  NewId(),
   121  			TeamId:     NewId(),
   122  			Submission: map[string]interface{}{
   123  				"text":  "some text",
   124  				"float": 1.2,
   125  				"bool":  true,
   126  			},
   127  			Cancelled: true,
   128  		}
   129  		jsonRequest := request.ToJson()
   130  		r := SubmitDialogRequestFromJson(bytes.NewReader(jsonRequest))
   131  
   132  		require.NotNil(t, r)
   133  		assert.Equal(t, request, *r)
   134  	})
   135  	t.Run("error", func(t *testing.T) {
   136  		r := SubmitDialogRequestFromJson(strings.NewReader(""))
   137  		assert.Nil(t, r)
   138  	})
   139  }
   140  
   141  func TestSubmitDialogResponseToJson(t *testing.T) {
   142  	t.Run("all fine", func(t *testing.T) {
   143  		request := SubmitDialogResponse{
   144  			Errors: map[string]string{
   145  				"text":  "some text",
   146  				"float": "1.2",
   147  				"bool":  "true",
   148  			},
   149  		}
   150  		jsonRequest := request.ToJson()
   151  		r := SubmitDialogResponseFromJson(bytes.NewReader(jsonRequest))
   152  
   153  		require.NotNil(t, r)
   154  		assert.Equal(t, request, *r)
   155  	})
   156  	t.Run("error", func(t *testing.T) {
   157  		r := SubmitDialogResponseFromJson(strings.NewReader(""))
   158  		assert.Nil(t, r)
   159  	})
   160  }