github.com/twilio/twilio-go@v1.20.1/client/jwt/taskrouter/capability_token_test.go (about)

     1  package taskrouter
     2  
     3  import (
     4  	"os"
     5  	"reflect"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  var AccountSid string
    13  var AuthToken string
    14  var WorkspaceSid string
    15  var TaskqueueSid string
    16  var Params CapabilityTokenParams
    17  
    18  func TestMain(m *testing.M) {
    19  	AccountSid = "AC123"
    20  	AuthToken = "foobar"
    21  	WorkspaceSid = "WS123"
    22  	TaskqueueSid = "WQ123"
    23  	Params = CapabilityTokenParams{
    24  		AccountSid:   AccountSid,
    25  		AuthToken:    AuthToken,
    26  		WorkspaceSid: WorkspaceSid,
    27  		ChannelID:    TaskqueueSid,
    28  	}
    29  	ret := m.Run()
    30  	os.Exit(ret)
    31  }
    32  
    33  func TestCapabilityTokenGenerate(t *testing.T) {
    34  	capabilityToken := CreateCapabilityToken(Params)
    35  
    36  	token, _ := capabilityToken.ToJwt()
    37  	assert.NotNil(t, token)
    38  
    39  	decodedToken, err := capabilityToken.FromJwt(token, AuthToken)
    40  	assert.Nil(t, err)
    41  	assert.NotNil(t, decodedToken)
    42  	payload := decodedToken.Payload()
    43  
    44  	assert.Equal(t, AccountSid, payload["iss"])
    45  	assert.Len(t, payload["policies"], 2)
    46  	assert.Equal(t, AccountSid, payload["iss"])
    47  	assert.Equal(t, TaskqueueSid, payload["channel"])
    48  	assert.Equal(t, WorkspaceSid, payload["workspace_sid"])
    49  	assert.Equal(t, "v1", payload["version"])
    50  	assert.Equal(t, TaskqueueSid, payload["friendly_name"])
    51  }
    52  
    53  func TestHeaders(t *testing.T) {
    54  	capabilityToken := CreateCapabilityToken(Params)
    55  	token, _ := capabilityToken.ToJwt()
    56  	decodedToken, err := capabilityToken.FromJwt(token, AuthToken)
    57  	assert.Nil(t, err)
    58  	headers := decodedToken.Headers()
    59  	assert.Equal(t, "HS256", headers["alg"])
    60  	assert.Equal(t, "JWT", headers["typ"])
    61  }
    62  
    63  func TestToString(t *testing.T) {
    64  	capabilityToken := CreateCapabilityToken(Params)
    65  	tokenStr := capabilityToken.ToString()
    66  	assert.True(t, strings.HasPrefix(tokenStr, "<TaskRouterCapabilityToken"))
    67  }
    68  
    69  func checkPolicy(t *testing.T, policy interface{}, index int, method string, url string, postFilters map[string]interface{}, queryFilters map[string]interface{}) {
    70  	switch reflect.TypeOf(policy).Kind() {
    71  	case reflect.Slice:
    72  		s := reflect.ValueOf(policy)
    73  		policyToTest := s.Index(index).Interface().(map[string]interface{})
    74  		assert.Equal(t, policyToTest["url"].(string), url)
    75  		assert.Equal(t, policyToTest["method"].(string), method)
    76  		assert.Len(t, policyToTest["post_filter"], 0)
    77  		assert.Len(t, policyToTest["query_filter"], 0)
    78  	}
    79  }
    80  
    81  func TestAddingPolicyToToken(t *testing.T) {
    82  	capabilityToken := CreateCapabilityToken(Params)
    83  
    84  	policy := GeneratePolicy(Workspace(WorkspaceSid), "GET", true, nil, nil)
    85  	capabilityToken.AddPolicy(policy)
    86  	token, _ := capabilityToken.ToJwt()
    87  	assert.NotNil(t, token)
    88  
    89  	decodedToken, err := capabilityToken.FromJwt(token, AuthToken)
    90  	assert.Nil(t, err)
    91  	assert.NotNil(t, decodedToken)
    92  
    93  	assert.Len(t, decodedToken.Policies, 3)
    94  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123", decodedToken.Policies[0].Url)
    95  	assert.Equal(t, "https://event-bridge.twilio.com/v1/wschannels/AC123/WQ123", decodedToken.Policies[1].Url)
    96  	assert.Equal(t, "https://event-bridge.twilio.com/v1/wschannels/AC123/WQ123", decodedToken.Policies[2].Url)
    97  	assert.Equal(t, "GET", decodedToken.Policies[0].Method)
    98  	assert.Equal(t, "GET", decodedToken.Policies[1].Method)
    99  	assert.Equal(t, "POST", decodedToken.Policies[2].Method)
   100  
   101  	payload := decodedToken.Payload()
   102  	assert.GreaterOrEqual(t, len(payload), 1)
   103  	assert.NotNil(t, payload["policies"])
   104  	assert.Len(t, payload["policies"], 3)
   105  
   106  	checkPolicy(t, payload["policies"], 0, "GET", "https://taskrouter.twilio.com/v1/Workspaces/WS123", nil, nil)
   107  	checkPolicy(t, payload["policies"], 1, "GET", "https://event-bridge.twilio.com/v1/wschannels/AC123/WQ123", nil, nil)
   108  	checkPolicy(t, payload["policies"], 2, "POST", "https://event-bridge.twilio.com/v1/wschannels/AC123/WQ123", nil, nil)
   109  }
   110  
   111  func TestPolicyFilter(t *testing.T) {
   112  	postFilter := map[string]interface{}{
   113  		"test-post-key": "test-post-value",
   114  		"activity-sid": map[string]interface{}{
   115  			"required": true,
   116  		},
   117  	}
   118  	queryFilter := map[string]interface{}{
   119  		"test-query-key": "test-query-value",
   120  	}
   121  
   122  	policy := GeneratePolicy(Workspace(WorkspaceSid), "GET", true, postFilter, queryFilter)
   123  	payload := policy.Payload()
   124  	assert.Equal(t, "test-post-value", payload["post_filter"].(map[string]interface{})["test-post-key"])
   125  	assert.Equal(t, "test-query-value", payload["query_filter"].(map[string]interface{})["test-query-key"])
   126  	assert.Equal(t, true, payload["post_filter"].(map[string]interface{})["activity-sid"].(map[string]interface{})["required"])
   127  
   128  	capabilityToken := CreateCapabilityToken(Params)
   129  	capabilityToken.AddPolicy(policy)
   130  	token, _ := capabilityToken.ToJwt()
   131  	assert.NotNil(t, token)
   132  	decodedToken, err := capabilityToken.FromJwt(token, AuthToken)
   133  	assert.Nil(t, err)
   134  	assert.NotNil(t, decodedToken)
   135  
   136  	assert.Len(t, decodedToken.Policies, 3)
   137  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123", decodedToken.Policies[0].Url)
   138  	assert.Equal(t, "GET", decodedToken.Policies[0].Method)
   139  	assert.Equal(t, postFilter, decodedToken.Policies[0].PostFilter)
   140  }
   141  
   142  func TestWithNoFilters(t *testing.T) {
   143  	policy := GeneratePolicy(Workspace(WorkspaceSid), "GET", true, nil, nil)
   144  	payload := policy.Payload()
   145  	assert.Len(t, payload["post_filter"], 0)
   146  	assert.Len(t, payload["query_filter"], 0)
   147  
   148  	params := CapabilityTokenParams{
   149  		AccountSid:   "AC123",
   150  		AuthToken:    "XXX",
   151  		WorkspaceSid: "WS123",
   152  		ChannelID:    "CH123",
   153  	}
   154  
   155  	capabilityToken := CreateCapabilityToken(params)
   156  	capabilityToken.AddPolicy(policy)
   157  
   158  	jwt, _ := capabilityToken.ToJwt()
   159  	assert.NotNil(t, jwt)
   160  }
   161  
   162  func TestPolicyWithPostFilter(t *testing.T) {
   163  	params := CapabilityTokenParams{
   164  		AccountSid:   AccountSid,
   165  		AuthToken:    AuthToken,
   166  		WorkspaceSid: WorkspaceSid,
   167  		ChannelID:    "CH123",
   168  	}
   169  	capabilityToken := CreateCapabilityToken(params)
   170  	postFilter := map[string]interface{}{
   171  		"ActivitySid": map[string]interface{}{
   172  			"required": true,
   173  		},
   174  	}
   175  	workerPolicy := GeneratePolicy(Worker(WorkspaceSid, "WorkerSid"), "POST", true, postFilter, nil)
   176  	capabilityToken.AddPolicy(workerPolicy)
   177  
   178  	workerToken, err := capabilityToken.ToJwt()
   179  	assert.Nil(t, err)
   180  	assert.NotNil(t, workerToken)
   181  
   182  	decodedToken, errDecode := capabilityToken.FromJwt(workerToken, AuthToken)
   183  	assert.Nil(t, errDecode)
   184  	assert.NotNil(t, decodedToken)
   185  	assert.Equal(t, true, decodedToken.Policies[0].PostFilter["ActivitySid"].(map[string]interface{})["required"])
   186  }
   187  
   188  func TestUrls(t *testing.T) {
   189  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces", Workspaces())
   190  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WK123", Workspace("WK123"))
   191  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/**", AllWorkspaces())
   192  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WK123/Tasks", Tasks("WK123"))
   193  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WK123/Tasks/TK123", Task("WK123", "TK123"))
   194  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WK123/Tasks/**", AllTasks("WK123"))
   195  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WK123/TaskQueues", TaskQueues("WK123"))
   196  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WK123/TaskQueues/WQ123", TaskQueue("WK123", "WQ123"))
   197  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WK123/TaskQueues/**", AllTaskQueues("WK123"))
   198  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Activities", Activities("WS123"))
   199  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Activities/AT123", Activity("WS123", "AT123"))
   200  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Activities/**", AllActivities("WS123"))
   201  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Workers", Workers("WS123"))
   202  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Workers/WK123", Worker("WS123", "WK123"))
   203  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Workers/**", AllWorkers("WS123"))
   204  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Workers/WK123/Reservations", Reservations("WS123", "WK123"))
   205  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Workers/WK123/Reservations/RS123", Reservation("WS123", "WK123", "RS123"))
   206  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Workers/WK123/Reservations/**", AllReservations("WS123", "WK123"))
   207  }
   208  
   209  func TestDefaultWorkerPolicies(t *testing.T) {
   210  	workerPolicies := WorkerPolicies("WS123", "WK123")
   211  	assert.Equal(t, "GET", workerPolicies[0].Method)
   212  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Activities", workerPolicies[0].Url)
   213  	assert.Equal(t, "GET", workerPolicies[1].Method)
   214  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Tasks/**", workerPolicies[1].Url)
   215  	assert.Equal(t, "GET", workerPolicies[2].Method)
   216  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Workers/WK123/Reservations/**", workerPolicies[2].Url)
   217  	assert.Equal(t, "GET", workerPolicies[3].Method)
   218  	assert.Equal(t, "https://taskrouter.twilio.com/v1/Workspaces/WS123/Workers/WK123", workerPolicies[3].Url)
   219  }
   220  
   221  func TestDefaultWebSocketPolicies(t *testing.T) {
   222  	webSocketPolicies := WebSocketPolicies("AC123", "CI123")
   223  	assert.Equal(t, "GET", webSocketPolicies[0].Method)
   224  	assert.Equal(t, "https://event-bridge.twilio.com/v1/wschannels/AC123/CI123", webSocketPolicies[0].Url)
   225  	assert.Equal(t, "POST", webSocketPolicies[1].Method)
   226  	assert.Equal(t, "https://event-bridge.twilio.com/v1/wschannels/AC123/CI123", webSocketPolicies[1].Url)
   227  }