5
5
package org .scalaexercises .evaluator
6
6
7
7
import org .scalatest ._
8
- import org .http4s ._ , org .http4s .dsl ._ , org .http4s .server ._
8
+ import org .http4s ._
9
+ import org .http4s .headers ._
10
+ import org .http4s .dsl ._
11
+ import org .http4s .server ._
9
12
10
13
import io .circe .syntax ._
11
14
import io .circe .generic .auto ._
12
15
import scalaz .stream .Process .emit
13
16
import java .nio .charset .StandardCharsets
14
17
import scodec .bits .ByteVector
18
+ import pdi .jwt .{Jwt , JwtAlgorithm , JwtHeader , JwtClaim , JwtOptions }
15
19
16
20
import org .http4s .{Status => HttpStatus }
17
21
18
22
class EvalEndpointSpec extends FunSpec with Matchers {
19
23
20
24
import services ._
21
25
import codecs ._
26
+ import auth ._
22
27
import EvalResponse .messages ._
23
28
24
29
val sonatypeReleases = " https://oss.sonatype.org/content/repositories/releases/" :: Nil
25
30
26
- def serve (evalRequest : EvalRequest ) =
27
- service.run(Request (
31
+ val validToken = Jwt .encode(""" {"user": "scala-exercises"}""" , auth.secretKey, JwtAlgorithm .HS256 )
32
+
33
+ val invalidToken = java.util.UUID .randomUUID.toString
34
+
35
+ def serve (evalRequest : EvalRequest , authHeader : Header ) =
36
+ evalService.run(Request (
28
37
POST ,
29
38
Uri (path = " /eval" ),
30
39
body = emit(
31
40
ByteVector .view(
32
41
evalRequest.asJson.noSpaces.getBytes(StandardCharsets .UTF_8 )
33
42
)
34
43
)
35
- )).run
44
+ ).putHeaders(authHeader) ).run
36
45
37
46
def verifyEvalResponse (
38
47
response : Response ,
@@ -50,7 +59,7 @@ class EvalEndpointSpec extends FunSpec with Matchers {
50
59
describe(" evaluation" ) {
51
60
it(" can evaluate simple expressions" ) {
52
61
verifyEvalResponse(
53
- response = serve(EvalRequest (code = " { 41 + 1 }" )),
62
+ response = serve(EvalRequest (code = " { 41 + 1 }" ), `X-Scala-Eval-Api-Token`(validToken) ),
54
63
expectedStatus = HttpStatus .Ok ,
55
64
expectedValue = Some (" 42" ),
56
65
expectedMessage = `ok`
@@ -59,7 +68,7 @@ class EvalEndpointSpec extends FunSpec with Matchers {
59
68
60
69
it(" fails with a timeout when takes longer than the configured timeout" ) {
61
70
verifyEvalResponse(
62
- response = serve(EvalRequest (code = " { while(true) {}; 123 }" )),
71
+ response = serve(EvalRequest (code = " { while(true) {}; 123 }" ), `X-Scala-Eval-Api-Token`(validToken) ),
63
72
expectedStatus = HttpStatus .Ok ,
64
73
expectedValue = None ,
65
74
expectedMessage = `Timeout Exceded`
@@ -72,7 +81,7 @@ class EvalEndpointSpec extends FunSpec with Matchers {
72
81
code = " {import cats._; Eval.now(42).value}" ,
73
82
resolvers = sonatypeReleases,
74
83
dependencies = Dependency (" org.typelevel" , " cats_2.11" , " 0.6.0" ) :: Nil
75
- )),
84
+ ), `X-Scala-Eval-Api-Token`(validToken) ),
76
85
expectedStatus = HttpStatus .Ok ,
77
86
expectedValue = Some (" 42" ),
78
87
expectedMessage = `ok`
@@ -89,7 +98,7 @@ class EvalEndpointSpec extends FunSpec with Matchers {
89
98
code = code,
90
99
resolvers = resolvers,
91
100
dependencies = Dependency (" org.typelevel" , " cats_2.11" , version) :: Nil
92
- )),
101
+ ), `X-Scala-Eval-Api-Token`(validToken) ),
93
102
expectedStatus = HttpStatus .Ok ,
94
103
expectedValue = Some (" 42" ),
95
104
expectedMessage = `ok`
@@ -104,7 +113,7 @@ class EvalEndpointSpec extends FunSpec with Matchers {
104
113
code = " {import stdlib._; Asserts.scalaTestAsserts(true)}" ,
105
114
resolvers = sonatypeReleases,
106
115
dependencies = Dependency (" org.scala-exercises" , " exercises-stdlib_2.11" , " 0.2.0" ) :: Nil
107
- )),
116
+ ), `X-Scala-Eval-Api-Token`(validToken) ),
108
117
expectedStatus = HttpStatus .Ok ,
109
118
expectedValue = Some (" ()" ),
110
119
expectedMessage = `ok`
@@ -117,13 +126,29 @@ class EvalEndpointSpec extends FunSpec with Matchers {
117
126
code = " {import stdlib._; Asserts.scalaTestAsserts(false)}" ,
118
127
resolvers = sonatypeReleases,
119
128
dependencies = Dependency (" org.scala-exercises" , " exercises-stdlib_2.11" , " 0.2.0" ) :: Nil
120
- )),
129
+ ), `X-Scala-Eval-Api-Token`(validToken) ),
121
130
expectedStatus = HttpStatus .Ok ,
122
131
expectedValue = None ,
123
132
expectedMessage = `Runtime Error`
124
133
)
125
134
}
126
135
136
+ it(" rejects requests with invalid tokens" ) {
137
+ serve(EvalRequest (
138
+ code = " 1" ,
139
+ resolvers = Nil ,
140
+ dependencies = Nil
141
+ ), `X-Scala-Eval-Api-Token`(invalidToken)).status should be (HttpStatus .Unauthorized )
142
+ }
143
+
144
+ it(" rejects requests with missing tokens" ) {
145
+ serve(EvalRequest (
146
+ code = " 1" ,
147
+ resolvers = Nil ,
148
+ dependencies = Nil
149
+ ), `Accept-Ranges`(Nil )).status should be (HttpStatus .Unauthorized )
150
+ }
151
+
127
152
}
128
153
}
129
154
0 commit comments