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 }