11 from ui
.app
import app
12 from ui
.models
import Build
, Runner
, db
14 class UsesApp(flask_testing
.TestCase
):
18 class UsesModels(UsesApp
):
20 with
open(os
.devnull
, "w") as f
, contextlib
.redirect_stderr(f
):
21 flask_migrate
.upgrade(revision
="head")
24 with
open(os
.devnull
, "w") as f
, contextlib
.redirect_stderr(f
):
25 flask_migrate
.downgrade(revision
="base")
27 class TestModels(UsesModels
):
30 build
= Build(build_id
=1)
34 assert build
in db
.session
36 def test_get_or_create_build_by_id(self
):
37 build
= Build(build_id
=1)
41 assert Build
.get_or_create_by_id(1).build_id
== 1
42 assert Build
.get_or_create_by_id(2).build_id
== 2
44 def test_runner(self
):
45 runner
= Runner(runner_id
="foobar")
46 db
.session
.add(runner
)
49 assert runner
in db
.session
51 def test_get_or_create_runner_by_id(self
):
52 runner
= Runner(runner_id
="foobar", runner_name
="foobar")
53 db
.session
.add(runner
)
56 assert Runner
.get_or_create_by_id('foobar').runner_name
== "foobar"
57 assert Runner
.get_or_create_by_id("foobaz").runner_name
== None
59 def test_runner_build_rel(self
):
60 runner
= Runner(runner_id
="foobar", runner_name
="foobar")
61 build
= Build(build_id
=1, build_runner
=runner
)
62 db
.session
.add(runner
)
66 assert build
.build_runner
== runner
67 assert build
in runner
.builds
69 class TestWebhooks(UsesModels
):
71 def test_invalid_token(self
):
72 with
open("tests/pipeline_webhook.json", "r") as f
:
73 response
= self
.client
.post("/webhook", headers
={'X-Gitlab-Event': 'Pipeline Hook', 'X-Gitlab-Token': 'invalidsecret'}, data
=f
.read(), content_type
='application/json')
74 assert response
.status_code
== 403
76 def test_pipeline_webhook(self
):
77 with
open("tests/pipeline_webhook.json", "r") as f
:
78 response
= self
.client
.post("/webhook", headers
={'X-Gitlab-Event': 'Pipeline Hook', 'X-Gitlab-Token': 'secret'}, data
=f
.read(), content_type
='application/json')
79 assert response
.status_code
== 200
80 build
= Build
.query
.filter_by(build_id
=1).first()
81 assert build
.build_id
== 1
82 assert build
.build_runner_id
== None
84 def test_success(self
):
85 with
open("tests/pipeline_success.json") as f
:
86 response
= self
.client
.post("/webhook", headers
={'X-Gitlab-Event': 'Pipeline Hook', 'X-Gitlab-Token': 'secret'}, data
=f
.read(), content_type
='application/json')
87 assert response
.status_code
== 200
88 runner
= Runner
.query
.filter_by(runner_id
="530365").first()
89 build
= Build
.query
.filter_by(build_id
=34618162).first()
90 assert build
.build_runner
.runner_name
== "phenom-test"
91 assert build
.build_version
== "lineage-15.1"
92 assert build
.build_device
== "FAKE_TEST"
93 assert build
.build_status
== "success"
94 assert build
.build_duration
== 81
98 with
open("tests/pipeline_start.json") as f
:
99 response
= self
.client
.post("/webhook", headers
={'X-Gitlab-Event': 'Pipeline Hook', 'X-Gitlab-Token': 'secret'}, data
=f
.read(), content_type
='application/json')
100 assert response
.status_code
== 200
103 class TestWeb(UsesModels
):
106 build1
= Build(build_id
=1, build_date
=datetime
.datetime
.strptime("2018-01-01", "%Y-%m-%d"), build_status
="pending", build_version
="cm-14.1")
107 runner
= Runner(runner_name
="foobar", runner_id
="foobar", runner_sponsor
="Me", runner_sponsor_url
="You")
108 build2
= Build(build_id
=2, build_status
="success", build_device
="mako", build_version
="cm-14.1", build_type
="userdebug", build_date
=datetime
.datetime
.strptime("2018-01-01", "%Y-%m-%d"), build_runner
=runner
, build_duration
=2)
109 db
.session
.add(build1
)
110 db
.session
.add(runner
)
111 db
.session
.add(build2
)
113 response
= self
.client
.get("/")
114 assert response
.status_code
== 200
116 response
= self
.client
.get("/runners/")
117 assert response
.status_code
== 200
119 response
= self
.client
.get("/runners/foobar")
120 assert response
.status_code
== 200
122 response
= self
.client
.get("/?status=success&device=mako")
123 assert response
.status_code
== 200
125 response
= self
.client
.get("/api/v1/runners")
126 assert response
.status_code
== 200
128 response
= self
.client
.get("/api/v1/builds")
129 assert response
.status_code
== 200
131 response
= self
.client
.get("/api/v1/stats")
132 assert response
.status_code
== 200
134 response
= self
.client
.get("/stats")
135 assert response
.status_code
== 200
137 if __name__
== "__main__":