@@ -3,148 +3,141 @@ package io.github.typesafegithub.workflows.shared.internal.model
3
3
import arrow.core.left
4
4
import arrow.core.right
5
5
import io.github.typesafegithub.workflows.shared.internal.fetchAvailableVersions
6
+ import io.kotest.core.extensions.install
6
7
import io.kotest.core.spec.style.FunSpec
8
+ import io.kotest.extensions.mockserver.MockServerExtension
7
9
import io.kotest.matchers.shouldBe
8
- import io.ktor.client.engine.HttpClientEngineFactory
9
- import io.ktor.client.engine.mock.MockEngine
10
- import io.ktor.client.engine.mock.MockEngineConfig
11
- import io.ktor.client.engine.mock.respond
12
- import io.ktor.http.HttpHeaders
13
- import io.ktor.http.HttpStatusCode
14
- import io.ktor.http.fullPath
15
- import io.ktor.http.headersOf
16
- import io.ktor.utils.io.ByteReadChannel
10
+ import org.mockserver.model.HttpRequest.request
11
+ import org.mockserver.model.HttpResponse.response
17
12
18
13
class GithubApiTest :
19
- FunSpec ({
20
- test(" branches with major versions and tags with other versions" ) {
21
- // Given
22
- val tagsResponse =
23
- """
24
- [
25
- {
26
- "ref":"refs/tags/v1.0.0",
27
- "node_id":"MDM6UmVmMTk3ODE0NjI5OnJlZnMvdGFncy92MQ==",
28
- "url":"https://api.github.com/repos/some-owner/some-name/git/refs/tags/v1",
29
- "object": {
30
- "sha":"544eadc6bf3d226fd7a7a9f0dc5b5bf7ca0675b9",
31
- "type":"tag",
32
- "url":"https://api.github.com/repos/actions/some-name/git/tags/544eadc6bf3d226fd7a7a9f0dc5b5bf7ca0675b9"
33
- }
34
- },
35
- {
36
- "ref":"refs/tags/v1.0.1",
37
- "node_id":"MDM6UmVmMTk3ODE0NjI5OnJlZnMvdGFncy92MQ==",
38
- "url":"https://api.github.com/repos/some-owner/some-name/git/refs/tags/v1.0.1",
39
- "object": {
40
- "sha":"af513c7a016048ae468971c52ed77d9562c7c819",
41
- "type":"tag",
42
- "url":"https://api.github.com/repos/actions/some-name/git/tags/af513c7a016048ae468971c52ed77d9562c7c819"
43
- }
44
- }
45
- ]
46
- """ .trimIndent()
47
- val headsResponse =
48
- """
49
- [
50
- {
51
- "ref":"refs/heads/v1",
52
- "node_id":"MDM6UmVmMTk3ODE0NjI5OnJlZnMvaGVhZHMvdm1qb3NlcGgvc2lsZW50LXJldi1wYXJzZQ==",
53
- "url":"https://api.github.com/repos/some-owner/some-name/git/refs/heads/v1",
54
- "object": {
55
- "sha":"af5130cb8882054eda385840657dcbd1e19ab8f4",
56
- "type":"commit",
57
- "url":"https://api.github.com/repos/some-owner/some-name/git/commits/af5130cb8882054eda385840657dcbd1e19ab8f4"
58
- }
59
- },
60
- {
61
- "ref":"refs/heads/v2",
62
- "node_id":"MDM6UmVmMTk3ODE0NjI5OnJlZnMvaGVhZHMvdm1qb3NlcGgvdG9vbGtpdC13aW5kb3dzLWV4ZWM=",
63
- "url":"https://api.github.com/repos/some-owner/some-name/git/refs/heads/v2",
64
- "object": {
65
- "sha":"c22ccee38a13e34cb01a103c324adb1db665821e",
66
- "type":"commit",
67
- "url":"https://api.github.com/repos/some-owner/some-name/git/commits/c22ccee38a13e34cb01a103c324adb1db665821e"
14
+ FunSpec (
15
+ {
16
+ val mockServer = install(MockServerExtension ())
17
+
18
+ beforeTest {
19
+ mockServer.reset()
20
+ }
21
+
22
+ val owner = " some-owner"
23
+ val name = " some-name"
24
+
25
+ test(" branches with major versions and tags with other versions" ) {
26
+ // Given
27
+ val tagsResponse =
28
+ """
29
+ [
30
+ {
31
+ "ref":"refs/tags/v1.0.0",
32
+ "node_id":"MDM6UmVmMTk3ODE0NjI5OnJlZnMvdGFncy92MQ==",
33
+ "url":"https://api.github.com/repos/some-owner/some-name/git/refs/tags/v1",
34
+ "object": {
35
+ "sha":"544eadc6bf3d226fd7a7a9f0dc5b5bf7ca0675b9",
36
+ "type":"tag",
37
+ "url":"https://api.github.com/repos/actions/some-name/git/tags/544eadc6bf3d226fd7a7a9f0dc5b5bf7ca0675b9"
38
+ }
39
+ },
40
+ {
41
+ "ref":"refs/tags/v1.0.1",
42
+ "node_id":"MDM6UmVmMTk3ODE0NjI5OnJlZnMvdGFncy92MQ==",
43
+ "url":"https://api.github.com/repos/some-owner/some-name/git/refs/tags/v1.0.1",
44
+ "object": {
45
+ "sha":"af513c7a016048ae468971c52ed77d9562c7c819",
46
+ "type":"tag",
47
+ "url":"https://api.github.com/repos/actions/some-name/git/tags/af513c7a016048ae468971c52ed77d9562c7c819"
48
+ }
68
49
}
69
- }
70
- ]
71
- """ .trimIndent()
72
- val mockEngineFactory =
73
- object : HttpClientEngineFactory <MockEngineConfig > {
74
- override fun create (block : MockEngineConfig .() -> Unit ) =
75
- MockEngine { request ->
76
- if (" matching-refs/tags" in request.url.fullPath) {
77
- respond(
78
- // language=json
79
- content = ByteReadChannel (tagsResponse),
80
- status = HttpStatusCode .OK ,
81
- headers = headersOf(HttpHeaders .ContentType , " application/json" ),
82
- )
83
- } else if (" matching-refs/heads" in request.url.fullPath) {
84
- respond(
85
- // language=json
86
- content = ByteReadChannel (headsResponse),
87
- status = HttpStatusCode .OK ,
88
- headers = headersOf(HttpHeaders .ContentType , " application/json" ),
89
- )
90
- } else {
91
- respond(
92
- content = ByteReadChannel (" The mock client wasn't prepared for this request" ),
93
- status = HttpStatusCode .NotFound ,
94
- )
50
+ ]
51
+ """ .trimIndent()
52
+ val headsResponse =
53
+ """
54
+ [
55
+ {
56
+ "ref":"refs/heads/v1",
57
+ "node_id":"MDM6UmVmMTk3ODE0NjI5OnJlZnMvaGVhZHMvdm1qb3NlcGgvc2lsZW50LXJldi1wYXJzZQ==",
58
+ "url":"https://api.github.com/repos/some-owner/some-name/git/refs/heads/v1",
59
+ "object": {
60
+ "sha":"af5130cb8882054eda385840657dcbd1e19ab8f4",
61
+ "type":"commit",
62
+ "url":"https://api.github.com/repos/some-owner/some-name/git/commits/af5130cb8882054eda385840657dcbd1e19ab8f4"
63
+ }
64
+ },
65
+ {
66
+ "ref":"refs/heads/v2",
67
+ "node_id":"MDM6UmVmMTk3ODE0NjI5OnJlZnMvaGVhZHMvdm1qb3NlcGgvdG9vbGtpdC13aW5kb3dzLWV4ZWM=",
68
+ "url":"https://api.github.com/repos/some-owner/some-name/git/refs/heads/v2",
69
+ "object": {
70
+ "sha":"c22ccee38a13e34cb01a103c324adb1db665821e",
71
+ "type":"commit",
72
+ "url":"https://api.github.com/repos/some-owner/some-name/git/commits/c22ccee38a13e34cb01a103c324adb1db665821e"
95
73
}
96
74
}
97
- }
75
+ ]
76
+ """ .trimIndent()
77
+ mockServer
78
+ .`when `(request().withPath(" /repos/$owner /$name /git/matching-refs/tags/v" ))
79
+ .respond(
80
+ response()
81
+ .withStatusCode(200 )
82
+ .withHeader(" Content-Type" , " application/json" )
83
+ .withBody(tagsResponse),
84
+ )
85
+ mockServer
86
+ .`when `(request().withPath(" /repos/$owner /$name /git/matching-refs/heads/v" ))
87
+ .respond(
88
+ response()
89
+ .withStatusCode(200 )
90
+ .withHeader(" Content-Type" , " application/json" )
91
+ .withBody(headsResponse),
92
+ )
98
93
99
- // When
100
- val versionsOrError =
101
- fetchAvailableVersions(
102
- owner = " some- owner" ,
103
- name = " some- name" ,
104
- githubAuthToken = " token" ,
105
- httpClientEngineFactory = mockEngineFactory ,
106
- )
94
+ // When
95
+ val versionsOrError =
96
+ fetchAvailableVersions(
97
+ owner = owner,
98
+ name = name,
99
+ githubAuthToken = " token" ,
100
+ githubEndpoint = " http://localhost: ${mockServer.port} " ,
101
+ )
107
102
108
- // Then
109
- versionsOrError shouldBe
110
- listOf (
111
- Version (" v1.0.0" ),
112
- Version (" v1.0.1" ),
113
- Version (" v1" ),
114
- Version (" v2" ),
115
- ).right()
116
- }
103
+ // Then
104
+ versionsOrError shouldBe
105
+ listOf (
106
+ Version (" v1.0.0" ),
107
+ Version (" v1.0.1" ),
108
+ Version (" v1" ),
109
+ Version (" v2" ),
110
+ ).right()
111
+ }
117
112
118
- test(" error occurs when fetching branches and tags" ) {
119
- // Given
120
- val mockEngineFactory =
121
- object : HttpClientEngineFactory <MockEngineConfig > {
122
- override fun create (block : MockEngineConfig .() -> Unit ) =
123
- MockEngine { request ->
124
- respond(
125
- // language=json
126
- content = ByteReadChannel (""" {"message": "There was a problem!"}""" ),
127
- status = HttpStatusCode .Forbidden ,
128
- headers = headersOf(HttpHeaders .ContentType , " application/json" ),
129
- )
130
- }
131
- }
113
+ test(" error occurs when fetching branches and tags" ) {
114
+ // Given
115
+ mockServer
116
+ .`when `(request())
117
+ .respond(
118
+ response()
119
+ .withStatusCode(403 )
120
+ .withHeader(" Content-Type" , " application/json" )
121
+ .withBody(""" {"message": "There was a problem!"}""" ),
122
+ )
132
123
133
- // When
134
- val versionsOrError =
135
- fetchAvailableVersions(
136
- owner = " some- owner" ,
137
- name = " some- name" ,
138
- githubAuthToken = " token" ,
139
- httpClientEngineFactory = mockEngineFactory ,
140
- )
124
+ // When
125
+ val versionOrError =
126
+ fetchAvailableVersions(
127
+ owner = owner,
128
+ name = name,
129
+ githubAuthToken = " token" ,
130
+ githubEndpoint = " http://localhost: ${mockServer.port} " ,
131
+ )
141
132
142
- // Then
143
- versionsOrError shouldBe
144
- (
145
- " Unexpected response when fetching refs from " +
146
- " https://api.github.com/repos/some-owner/some-name/git/matching-refs/tags/v. " +
147
- " Status: 403 Forbidden, response: {\" message\" : \" There was a problem!\" }"
148
- ).left()
149
- }
150
- })
133
+ // Then
134
+ versionOrError shouldBe
135
+ (
136
+ " Unexpected response when fetching refs from " +
137
+ " http://localhost:${mockServer.port} /" +
138
+ " repos/some-owner/some-name/git/matching-refs/tags/v. " +
139
+ " Status: 403 Forbidden, response: {\" message\" : \" There was a problem!\" }"
140
+ ).left()
141
+ }
142
+ },
143
+ )
0 commit comments