diff options
author | Cyril Jouve <jv.cyril@gmail.com> | 2019-10-06 16:19:28 +0200 |
---|---|---|
committer | Cyril Jouve <jv.cyril@gmail.com> | 2019-10-06 16:39:33 +0200 |
commit | eefceace2c2094ef41d3da2bf3c46a58a450dcba (patch) | |
tree | b9cc5f5f320d764107e937aac86703a51cadb46d /tools/generate_token.py | |
parent | f5b4a113a298d33cb72f80c94d85bdfec3c4e149 (diff) | |
download | gitlab-eefceace2c2094ef41d3da2bf3c46a58a450dcba.tar.gz |
feat(ci): improve functionnal tests
Diffstat (limited to 'tools/generate_token.py')
-rwxr-xr-x | tools/generate_token.py | 98 |
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__": |