summaryrefslogtreecommitdiff
path: root/tools/generate_token.py
diff options
context:
space:
mode:
authorCyril Jouve <jv.cyril@gmail.com>2019-10-06 16:19:28 +0200
committerCyril Jouve <jv.cyril@gmail.com>2019-10-06 16:39:33 +0200
commiteefceace2c2094ef41d3da2bf3c46a58a450dcba (patch)
treeb9cc5f5f320d764107e937aac86703a51cadb46d /tools/generate_token.py
parentf5b4a113a298d33cb72f80c94d85bdfec3c4e149 (diff)
downloadgitlab-eefceace2c2094ef41d3da2bf3c46a58a450dcba.tar.gz
feat(ci): improve functionnal tests
Diffstat (limited to 'tools/generate_token.py')
-rwxr-xr-xtools/generate_token.py98
1 files changed, 42 insertions, 56 deletions
diff --git a/tools/generate_token.py b/tools/generate_token.py
index 9fa2ff2..10ca891 100755
--- a/tools/generate_token.py
+++ b/tools/generate_token.py
@@ -1,64 +1,50 @@
#!/usr/bin/env python
-import sys
-
-try:
- from urllib.parse import urljoin
-except ImportError:
- from urlparse import urljoin
-
-from bs4 import BeautifulSoup
-import requests
-
-endpoint = "http://localhost:8080"
-root_route = urljoin(endpoint, "/")
-sign_in_route = urljoin(endpoint, "/users/sign_in")
-pat_route = urljoin(endpoint, "/profile/personal_access_tokens")
-
-login = "root"
-password = "5iveL!fe"
-
-
-def find_csrf_token(text):
- soup = BeautifulSoup(text, "lxml")
- token = soup.find(attrs={"name": "csrf-token"})
- param = soup.find(attrs={"name": "csrf-param"})
- data = {param.get("content"): token.get("content")}
- return data
-
-
-def obtain_csrf_token():
- r = requests.get(root_route)
- token = find_csrf_token(r.text)
- return token, r.cookies
-
-
-def sign_in(csrf, cookies):
- data = {"user[login]": login, "user[password]": password}
- data.update(csrf)
- r = requests.post(sign_in_route, data=data, cookies=cookies)
- token = find_csrf_token(r.text)
- return token, r.history[0].cookies
-
-
-def obtain_personal_access_token(name, csrf, cookies):
- data = {
- "personal_access_token[name]": name,
- "personal_access_token[scopes][]": ["api", "sudo"],
- }
- data.update(csrf)
- r = requests.post(pat_route, data=data, cookies=cookies)
- soup = BeautifulSoup(r.text, "lxml")
- token = soup.find("input", id="created-personal-access-token").get("value")
- return token
+from six.moves.urllib.parse import urljoin
+from requests_html import HTMLSession
+
+ENDPOINT = "http://localhost:8080"
+LOGIN = "root"
+PASSWORD = "5iveL!fe"
+
+
+class GitlabSession(HTMLSession):
+ def __init__(self, endpoint, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.endpoint = endpoint
+ self.csrf = None
+
+ def find_csrf_token(self, html):
+ param = html.find("meta[name=csrf-param]")[0].attrs["content"]
+ token = html.find("meta[name=csrf-token]")[0].attrs["content"]
+ self.csrf = {param: token}
+
+ def obtain_csrf_token(self):
+ r = self.get(urljoin(self.endpoint, "/"))
+ self.find_csrf_token(r.html)
+
+ def sign_in(self, login, password):
+ data = {"user[login]": login, "user[password]": password, **self.csrf}
+ r = self.post(urljoin(self.endpoint, "/users/sign_in"), data=data)
+ self.find_csrf_token(r.html)
+
+ def obtain_personal_access_token(self, name):
+ data = {
+ "personal_access_token[name]": name,
+ "personal_access_token[scopes][]": ["api", "sudo"],
+ **self.csrf,
+ }
+ r = self.post(
+ urljoin(self.endpoint, "/profile/personal_access_tokens"), data=data
+ )
+ return r.html.find("#created-personal-access-token")[0].attrs["value"]
def main():
- csrf1, cookies1 = obtain_csrf_token()
- csrf2, cookies2 = sign_in(csrf1, cookies1)
-
- token = obtain_personal_access_token("default", csrf2, cookies2)
- print(token)
+ with GitlabSession(ENDPOINT) as s:
+ s.obtain_csrf_token()
+ s.sign_in(LOGIN, PASSWORD)
+ print(s.obtain_personal_access_token("default"))
if __name__ == "__main__":