{"action":"created","comment":{"url":"https://api.github.com/repos/hughsie/lvfs-website/pulls/comments/167660862","pull_request_review_id":95911772,"id":167660862,"diff_hunk":"@@ -0,0 +1,591 @@\n+#!/usr/bin/python2\n+# -*- coding: utf-8 -*-\n+#\n+# Copyright (C) 2018 Richard Hughes <richard@hughsie.com>\n+# Licensed under the GNU General Public License Version 2\n+#\n+# pylint: disable=fixme\n+\n+from __future__ import print_function\n+\n+import os\n+import unittest\n+import tempfile\n+\n+class LvfsTestCase(unittest.TestCase):\n+\n+    def setUp(self):\n+\n+        # create new database\n+        self.db_fd, self.db_filename = tempfile.mkstemp()\n+        self.db_uri = 'sqlite:///' + self.db_filename\n+\n+        # write out custom settings file\n+        self.cfg_filename = '/tmp/foo.cfg'\n+        cfgfile = open(self.cfg_filename, 'w')\n+        cfgfile.write('\\n'.join([\n+            \"DATABASE = '%s'\" % self.db_uri,\n+            \"DOWNLOAD_DIR = '/tmp'\",\n+            \"TESTING = True\",\n+            ]))\n+        cfgfile.close()\n+        os.environ['LVFS_CUSTOM_SETTINGS'] = self.cfg_filename\n+\n+        # create instance\n+        import app as lvfs\n+        from app import db\n+        self.app = lvfs.app.test_client()\n+        with lvfs.app.app_context():\n+            db.drop_db()\n+            db.init_db()\n+\n+        # ensure the plugins settings are set up\n+        self.login()\n+        self.app.get('/lvfs/settings_create')\n+        self.logout()\n+\n+    def tearDown(self):\n+        os.close(self.db_fd)\n+        os.unlink(self.db_filename)\n+        os.unlink(self.cfg_filename)\n+\n+    def _login(self, username, password):\n+        return self.app.post('/lvfs/login', data=dict(\n+            username=username,\n+            password=password\n+        ), follow_redirects=True)\n+\n+    def _logout(self):\n+        return self.app.get('/lvfs/logout', follow_redirects=True)\n+\n+    def login(self, username='admin', password='Pa$$w0rd'):\n+        rv = self._login(username, password)\n+        assert b'/lvfs/upload' in rv.data, rv.data\n+        assert b'Incorrect username or password' not in rv.data, rv.data\n+\n+    def logout(self):\n+        rv = self._logout()\n+        assert b'/lvfs/upload' not in rv.data, rv.data\n+\n+    def _add_user(self, username, group_id, password, email):\n+        return self.app.post('/lvfs/user/add', data=dict(\n+            password_new=password,\n+            username_new=username,\n+            group_id=group_id,\n+            name='Generic Name',\n+            email=email,\n+        ), follow_redirects=True)\n+\n+    def add_user(self, username='testuser', group_id='testgroup',\n+                 password='Pa$$w0rd', email='test@test.com'):\n+        rv = self._add_user(username, group_id, password, email)\n+        assert b'Added user' in rv.data, rv.data\n+\n+    def _upload(self, filename, target):\n+        fd = open(filename, 'rb')\n+        return self.app.post('/lvfs/upload', data={\n+            'target': target,\n+            'file': (fd, filename)\n+        }, follow_redirects=True)\n+\n+    def upload(self, target='private'):\n+        rv = self._upload('contrib/hughski-colorhug2-2.0.3.cab', target)\n+        assert b'com.hughski.ColorHug2.firmware' in rv.data, rv.data\n+        assert b'e133637179fa7c37d7a36657c7e302edce3d0fce' in rv.data, rv.data\n+\n+    def test_login_logout(self):\n+\n+        # test logging in and out\n+        rv = self._login('admin', 'Pa$$w0rd')\n+        assert b'/lvfs/upload' in rv.data, rv.data\n+        rv = self._logout()\n+        assert b'/lvfs/upload' not in rv.data, rv.data\n+        rv = self._login('adminx', 'default')\n+        assert b'Incorrect username or password' in rv.data, rv.data\n+        rv = self._login('admin', 'defaultx')\n+        assert b'Incorrect username or password' in rv.data, rv.data\n+\n+    def test_upload_invalid(self):\n+\n+        # upload something that isn't a cabinet archive\n+        self.login()\n+        rv = self._upload('contrib/Dockerfile', 'private')\n+        assert b'Failed to upload file' in rv.data, rv.data\n+        rv = self._upload('contrib/hughski-colorhug2-2.0.3.cab', 'NOTVALID')\n+        assert b'Target not valid' in rv.data, rv.data\n+\n+    def test_upload_valid(self):\n+\n+        # upload firmware\n+        self.login()\n+        rv = self._upload('contrib/hughski-colorhug2-2.0.3.cab', 'private')\n+        assert b'com.hughski.ColorHug2.firmware' in rv.data, rv.data\n+        assert b'e133637179fa7c37d7a36657c7e302edce3d0fce' in rv.data, rv.data\n+\n+        # check analytics works\n+        uris = ['/lvfs/firmware/e133637179fa7c37d7a36657c7e302edce3d0fce/analytics',\n+                '/lvfs/firmware/e133637179fa7c37d7a36657c7e302edce3d0fce/analytics/clients',\n+                '/lvfs/firmware/e133637179fa7c37d7a36657c7e302edce3d0fce/analytics/month',\n+                '/lvfs/firmware/e133637179fa7c37d7a36657c7e302edce3d0fce/analytics/reports',\n+                '/lvfs/firmware/e133637179fa7c37d7a36657c7e302edce3d0fce/analytics/year']\n+        for uri in uris:\n+            rv = self.app.get(uri)\n+            assert b'favicon.ico' in rv.data, rv.data\n+            assert b'LVFS: Error' not in rv.data, rv.data\n+\n+        # check component view shows GUID\n+        rv = self.app.get('/lvfs/component/1')\n+        assert b'2082b5e0-7a64-478a-b1b2-e3404fab6dad' in rv.data, rv.data\n+\n+        # check devices page shows private firmware as admin -- and hidden when anon\n+        rv = self.app.get('/lvfs/device')\n+        assert b'2082b5e0-7a64-478a-b1b2-e3404fab6dad' in rv.data, rv.data\n+        rv = self.app.get('/lvfs/device/2082b5e0-7a64-478a-b1b2-e3404fab6dad')\n+        assert b'MCDC04 errata' in rv.data, rv.data\n+        self.logout()\n+\n+        # check private firmware isn't visable when not logged in\n+        rv = self.app.get('/lvfs/device')\n+        assert b'2082b5e0-7a64-478a-b1b2-e3404fab6dad' not in rv.data, rv.data\n+        rv = self.app.get('/lvfs/device/2082b5e0-7a64-478a-b1b2-e3404fab6dad')\n+        # FIXME is it a bug that we show the device exists even though it's not got any mds?\n+        assert b'MCDC04 errata' not in rv.data, rv.data\n+        rv = self.app.get('/lvfs/devicelist')\n+        assert b'ColorHug' not in rv.data, rv.data\n+        self.login()\n+\n+        # promote the firmware to testing then stable\n+        rv = self.app.get('/lvfs/firmware/e133637179fa7c37d7a36657c7e302edce3d0fce/promote/testing',\n+                          follow_redirects=True)\n+        assert b'>testing<' in rv.data, rv.data\n+        assert b'>stable<' not in rv.data, rv.data\n+        rv = self.app.get('/lvfs/firmware/e133637179fa7c37d7a36657c7e302edce3d0fce/promote/stable',\n+                          follow_redirects=True)\n+        assert b'>stable<' in rv.data, rv.data\n+        assert b'>testing<' not in rv.data, rv.data","path":"lvfs_test.py","position":165,"original_position":165,"commit_id":"d9b71d9ccbbe9434a10c96d21a43e0fe3342c6b3","original_commit_id":"d9b71d9ccbbe9434a10c96d21a43e0fe3342c6b3","user":{"login":"hughsie","id":151380,"avatar_url":"https://avatars0.githubusercontent.com/u/151380?v=4","gravatar_id":"","url":"https://api.github.com/users/hughsie","html_url":"https://github.com/hughsie","followers_url":"https://api.github.com/users/hughsie/followers","following_url":"https://api.github.com/users/hughsie/following{/other_user}","gists_url":"https://api.github.com/users/hughsie/gists{/gist_id}","starred_url":"https://api.github.com/users/hughsie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hughsie/subscriptions","organizations_url":"https://api.github.com/users/hughsie/orgs","repos_url":"https://api.github.com/users/hughsie/repos","events_url":"https://api.github.com/users/hughsie/events{/privacy}","received_events_url":"https://api.github.com/users/hughsie/received_events","type":"User","site_admin":false},"body":"Just to clarify, is a non-qa users allowed to push firmware from `private` to `embargo`? At the moment they can't, but that doesn't make sense as we allow non-qa users to upload to either private or embargo.","created_at":"2018-02-12T19:27:42Z","updated_at":"2018-02-12T19:27:42Z","html_url":"https://github.com/hughsie/lvfs-website/pull/55#discussion_r167660862","pull_request_url":"https://api.github.com/repos/hughsie/lvfs-website/pulls/55","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/hughsie/lvfs-website/pulls/comments/167660862"},"html":{"href":"https://github.com/hughsie/lvfs-website/pull/55#discussion_r167660862"},"pull_request":{"href":"https://api.github.com/repos/hughsie/lvfs-website/pulls/55"}},"in_reply_to_id":167606607},"pull_request":{"url":"https://api.github.com/repos/hughsie/lvfs-website/pulls/55","id":168478916,"html_url":"https://github.com/hughsie/lvfs-website/pull/55","diff_url":"https://github.com/hughsie/lvfs-website/pull/55.diff","patch_url":"https://github.com/hughsie/lvfs-website/pull/55.patch","issue_url":"https://api.github.com/repos/hughsie/lvfs-website/issues/55","number":55,"state":"open","locked":false,"title":"Wip/hughsie/orm","user":{"login":"hughsie","id":151380,"avatar_url":"https://avatars0.githubusercontent.com/u/151380?v=4","gravatar_id":"","url":"https://api.github.com/users/hughsie","html_url":"https://github.com/hughsie","followers_url":"https://api.github.com/users/hughsie/followers","following_url":"https://api.github.com/users/hughsie/following{/other_user}","gists_url":"https://api.github.com/users/hughsie/gists{/gist_id}","starred_url":"https://api.github.com/users/hughsie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hughsie/subscriptions","organizations_url":"https://api.github.com/users/hughsie/orgs","repos_url":"https://api.github.com/users/hughsie/repos","events_url":"https://api.github.com/users/hughsie/events{/privacy}","received_events_url":"https://api.github.com/users/hughsie/received_events","type":"User","site_admin":false},"body":"Reviewing this in detail isn't really what I expect; it's a pretty huge change to the back-end of the LVFS webservice. What I do need is some review of the tests we're doing and the general approach; other ideas very welcome.","created_at":"2018-02-11T22:40:44Z","updated_at":"2018-02-12T19:27:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2e6352957c508521f5e6dae26e1a7d8d8aa1f36e","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/hughsie/lvfs-website/pulls/55/commits","review_comments_url":"https://api.github.com/repos/hughsie/lvfs-website/pulls/55/comments","review_comment_url":"https://api.github.com/repos/hughsie/lvfs-website/pulls/comments{/number}","comments_url":"https://api.github.com/repos/hughsie/lvfs-website/issues/55/comments","statuses_url":"https://api.github.com/repos/hughsie/lvfs-website/statuses/d9b71d9ccbbe9434a10c96d21a43e0fe3342c6b3","head":{"label":"hughsie:wip/hughsie/orm","ref":"wip/hughsie/orm","sha":"d9b71d9ccbbe9434a10c96d21a43e0fe3342c6b3","user":{"login":"hughsie","id":151380,"avatar_url":"https://avatars0.githubusercontent.com/u/151380?v=4","gravatar_id":"","url":"https://api.github.com/users/hughsie","html_url":"https://github.com/hughsie","followers_url":"https://api.github.com/users/hughsie/followers","following_url":"https://api.github.com/users/hughsie/following{/other_user}","gists_url":"https://api.github.com/users/hughsie/gists{/gist_id}","starred_url":"https://api.github.com/users/hughsie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hughsie/subscriptions","organizations_url":"https://api.github.com/users/hughsie/orgs","repos_url":"https://api.github.com/users/hughsie/repos","events_url":"https://api.github.com/users/hughsie/events{/privacy}","received_events_url":"https://api.github.com/users/hughsie/received_events","type":"User","site_admin":false},"repo":{"id":47995721,"name":"lvfs-website","full_name":"hughsie/lvfs-website","owner":{"login":"hughsie","id":151380,"avatar_url":"https://avatars0.githubusercontent.com/u/151380?v=4","gravatar_id":"","url":"https://api.github.com/users/hughsie","html_url":"https://github.com/hughsie","followers_url":"https://api.github.com/users/hughsie/followers","following_url":"https://api.github.com/users/hughsie/following{/other_user}","gists_url":"https://api.github.com/users/hughsie/gists{/gist_id}","starred_url":"https://api.github.com/users/hughsie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hughsie/subscriptions","organizations_url":"https://api.github.com/users/hughsie/orgs","repos_url":"https://api.github.com/users/hughsie/repos","events_url":"https://api.github.com/users/hughsie/events{/privacy}","received_events_url":"https://api.github.com/users/hughsie/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/hughsie/lvfs-website","description":"The LVFS website","fork":false,"url":"https://api.github.com/repos/hughsie/lvfs-website","forks_url":"https://api.github.com/repos/hughsie/lvfs-website/forks","keys_url":"https://api.github.com/repos/hughsie/lvfs-website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hughsie/lvfs-website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hughsie/lvfs-website/teams","hooks_url":"https://api.github.com/repos/hughsie/lvfs-website/hooks","issue_events_url":"https://api.github.com/repos/hughsie/lvfs-website/issues/events{/number}","events_url":"https://api.github.com/repos/hughsie/lvfs-website/events","assignees_url":"https://api.github.com/repos/hughsie/lvfs-website/assignees{/user}","branches_url":"https://api.github.com/repos/hughsie/lvfs-website/branches{/branch}","tags_url":"https://api.github.com/repos/hughsie/lvfs-website/tags","blobs_url":"https://api.github.com/repos/hughsie/lvfs-website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hughsie/lvfs-website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hughsie/lvfs-website/git/refs{/sha}","trees_url":"https://api.github.com/repos/hughsie/lvfs-website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hughsie/lvfs-website/statuses/{sha}","languages_url":"https://api.github.com/repos/hughsie/lvfs-website/languages","stargazers_url":"https://api.github.com/repos/hughsie/lvfs-website/stargazers","contributors_url":"https://api.github.com/repos/hughsie/lvfs-website/contributors","subscribers_url":"https://api.github.com/repos/hughsie/lvfs-website/subscribers","subscription_url":"https://api.github.com/repos/hughsie/lvfs-website/subscription","commits_url":"https://api.github.com/repos/hughsie/lvfs-website/commits{/sha}","git_commits_url":"https://api.github.com/repos/hughsie/lvfs-website/git/commits{/sha}","comments_url":"https://api.github.com/repos/hughsie/lvfs-website/comments{/number}","issue_comment_url":"https://api.github.com/repos/hughsie/lvfs-website/issues/comments{/number}","contents_url":"https://api.github.com/repos/hughsie/lvfs-website/contents/{+path}","compare_url":"https://api.github.com/repos/hughsie/lvfs-website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hughsie/lvfs-website/merges","archive_url":"https://api.github.com/repos/hughsie/lvfs-website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hughsie/lvfs-website/downloads","issues_url":"https://api.github.com/repos/hughsie/lvfs-website/issues{/number}","pulls_url":"https://api.github.com/repos/hughsie/lvfs-website/pulls{/number}","milestones_url":"https://api.github.com/repos/hughsie/lvfs-website/milestones{/number}","notifications_url":"https://api.github.com/repos/hughsie/lvfs-website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hughsie/lvfs-website/labels{/name}","releases_url":"https://api.github.com/repos/hughsie/lvfs-website/releases{/id}","deployments_url":"https://api.github.com/repos/hughsie/lvfs-website/deployments","created_at":"2015-12-14T19:13:26Z","updated_at":"2017-02-27T01:29:00Z","pushed_at":"2018-02-12T16:01:08Z","git_url":"git://github.com/hughsie/lvfs-website.git","ssh_url":"git@github.com:hughsie/lvfs-website.git","clone_url":"https://github.com/hughsie/lvfs-website.git","svn_url":"https://github.com/hughsie/lvfs-website","homepage":null,"size":1654,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"archived":false,"open_issues_count":14,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":4,"open_issues":14,"watchers":1,"default_branch":"master"}},"base":{"label":"hughsie:master","ref":"master","sha":"de0bccf973027a4af0dcd8e784aff5d51758716e","user":{"login":"hughsie","id":151380,"avatar_url":"https://avatars0.githubusercontent.com/u/151380?v=4","gravatar_id":"","url":"https://api.github.com/users/hughsie","html_url":"https://github.com/hughsie","followers_url":"https://api.github.com/users/hughsie/followers","following_url":"https://api.github.com/users/hughsie/following{/other_user}","gists_url":"https://api.github.com/users/hughsie/gists{/gist_id}","starred_url":"https://api.github.com/users/hughsie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hughsie/subscriptions","organizations_url":"https://api.github.com/users/hughsie/orgs","repos_url":"https://api.github.com/users/hughsie/repos","events_url":"https://api.github.com/users/hughsie/events{/privacy}","received_events_url":"https://api.github.com/users/hughsie/received_events","type":"User","site_admin":false},"repo":{"id":47995721,"name":"lvfs-website","full_name":"hughsie/lvfs-website","owner":{"login":"hughsie","id":151380,"avatar_url":"https://avatars0.githubusercontent.com/u/151380?v=4","gravatar_id":"","url":"https://api.github.com/users/hughsie","html_url":"https://github.com/hughsie","followers_url":"https://api.github.com/users/hughsie/followers","following_url":"https://api.github.com/users/hughsie/following{/other_user}","gists_url":"https://api.github.com/users/hughsie/gists{/gist_id}","starred_url":"https://api.github.com/users/hughsie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hughsie/subscriptions","organizations_url":"https://api.github.com/users/hughsie/orgs","repos_url":"https://api.github.com/users/hughsie/repos","events_url":"https://api.github.com/users/hughsie/events{/privacy}","received_events_url":"https://api.github.com/users/hughsie/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/hughsie/lvfs-website","description":"The LVFS website","fork":false,"url":"https://api.github.com/repos/hughsie/lvfs-website","forks_url":"https://api.github.com/repos/hughsie/lvfs-website/forks","keys_url":"https://api.github.com/repos/hughsie/lvfs-website/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hughsie/lvfs-website/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hughsie/lvfs-website/teams","hooks_url":"https://api.github.com/repos/hughsie/lvfs-website/hooks","issue_events_url":"https://api.github.com/repos/hughsie/lvfs-website/issues/events{/number}","events_url":"https://api.github.com/repos/hughsie/lvfs-website/events","assignees_url":"https://api.github.com/repos/hughsie/lvfs-website/assignees{/user}","branches_url":"https://api.github.com/repos/hughsie/lvfs-website/branches{/branch}","tags_url":"https://api.github.com/repos/hughsie/lvfs-website/tags","blobs_url":"https://api.github.com/repos/hughsie/lvfs-website/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hughsie/lvfs-website/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hughsie/lvfs-website/git/refs{/sha}","trees_url":"https://api.github.com/repos/hughsie/lvfs-website/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hughsie/lvfs-website/statuses/{sha}","languages_url":"https://api.github.com/repos/hughsie/lvfs-website/languages","stargazers_url":"https://api.github.com/repos/hughsie/lvfs-website/stargazers","contributors_url":"https://api.github.com/repos/hughsie/lvfs-website/contributors","subscribers_url":"https://api.github.com/repos/hughsie/lvfs-website/subscribers","subscription_url":"https://api.github.com/repos/hughsie/lvfs-website/subscription","commits_url":"https://api.github.com/repos/hughsie/lvfs-website/commits{/sha}","git_commits_url":"https://api.github.com/repos/hughsie/lvfs-website/git/commits{/sha}","comments_url":"https://api.github.com/repos/hughsie/lvfs-website/comments{/number}","issue_comment_url":"https://api.github.com/repos/hughsie/lvfs-website/issues/comments{/number}","contents_url":"https://api.github.com/repos/hughsie/lvfs-website/contents/{+path}","compare_url":"https://api.github.com/repos/hughsie/lvfs-website/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hughsie/lvfs-website/merges","archive_url":"https://api.github.com/repos/hughsie/lvfs-website/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hughsie/lvfs-website/downloads","issues_url":"https://api.github.com/repos/hughsie/lvfs-website/issues{/number}","pulls_url":"https://api.github.com/repos/hughsie/lvfs-website/pulls{/number}","milestones_url":"https://api.github.com/repos/hughsie/lvfs-website/milestones{/number}","notifications_url":"https://api.github.com/repos/hughsie/lvfs-website/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hughsie/lvfs-website/labels{/name}","releases_url":"https://api.github.com/repos/hughsie/lvfs-website/releases{/id}","deployments_url":"https://api.github.com/repos/hughsie/lvfs-website/deployments","created_at":"2015-12-14T19:13:26Z","updated_at":"2017-02-27T01:29:00Z","pushed_at":"2018-02-12T16:01:08Z","git_url":"git://github.com/hughsie/lvfs-website.git","ssh_url":"git@github.com:hughsie/lvfs-website.git","clone_url":"https://github.com/hughsie/lvfs-website.git","svn_url":"https://github.com/hughsie/lvfs-website","homepage":null,"size":1654,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"archived":false,"open_issues_count":14,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":4,"open_issues":14,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/hughsie/lvfs-website/pulls/55"},"html":{"href":"https://github.com/hughsie/lvfs-website/pull/55"},"issue":{"href":"https://api.github.com/repos/hughsie/lvfs-website/issues/55"},"comments":{"href":"https://api.github.com/repos/hughsie/lvfs-website/issues/55/comments"},"review_comments":{"href":"https://api.github.com/repos/hughsie/lvfs-website/pulls/55/comments"},"review_comment":{"href":"https://api.github.com/repos/hughsie/lvfs-website/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/hughsie/lvfs-website/pulls/55/commits"},"statuses":{"href":"https://api.github.com/repos/hughsie/lvfs-website/statuses/d9b71d9ccbbe9434a10c96d21a43e0fe3342c6b3"}},"author_association":"OWNER"}}
{"actor":{"display_login":"hughsie"}}