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