{"action":"created","comment":{"url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/comments/53759661","id":53759661,"diff_hunk":"@@ -64,46 +80,91 @@ def test_positive_create_with_gpg(self):\n         #\n         # product -----------↘\n         #       `-→ gpg_key → organization\n-        #\n-        # Re-using an organization speeds up the test.\n-        org = entities.Organization().create()\n         gpg_key = entities.GPGKey(\n             content=read_data_file(VALID_GPG_KEY_FILE),\n-            organization=org,\n+            organization=self.org,\n         ).create()\n-        product = entities.Product(gpg_key=gpg_key, organization=org).create()\n+        product = entities.Product(\n+            gpg_key=gpg_key, organization=self.org).create()\n         self.assertEqual(product.gpg_key.id, gpg_key.id)\n \n+    @run_only_on('sat')\n+    @tier1\n+    def test_negative_create_with_name(self):\n+        \"\"\"Create a product providing invalid names only\n \n-class ProductUpdateTestCase(APITestCase):\n-    \"\"\"Tests for updating a product.\"\"\"\n+        @Assert: A product is not created\n \n-    @classmethod\n-    def setUpClass(cls):  # noqa\n-        \"\"\"Create a product.\"\"\"\n-        super(ProductUpdateTestCase, cls).setUpClass()\n-        cls.product = entities.Product().create()\n+        @Feature: Product\n+        \"\"\"\n+        for name in invalid_values_list():\n+            with self.subTest(name):\n+                with self.assertRaises(HTTPError):\n+                    entities.Product(name=name).create()\n+\n+    @run_only_on('sat')\n+    @tier1\n+    def test_negative_create_with_same_name(self):\n+        \"\"\"Create a product providing a name of already existent entity\n+\n+        @Assert: A product is not created\n+\n+        @Feature: Product\n+        \"\"\"\n+        name = gen_string('alphanumeric')\n+        entities.Product(name=name, organization=self.org).create()\n+        with self.assertRaises(HTTPError):\n+            entities.Product(name=name, organization=self.org).create()\n \n+    @run_only_on('sat')\n     @tier1\n+    def test_negative_create_with_label(self):\n+        \"\"\"Create a product providing invalid label\n+\n+        @Assert: A product is not created\n+\n+        @Feature: Product\n+        \"\"\"\n+        with self.assertRaises(HTTPError):\n+            entities.Product(label=gen_string('utf8')).create()\n+\n     @run_only_on('sat')\n-    def test_positive_update_name_and_description(self):\n-        \"\"\"Update a product with a new name or description.\n+    @tier1\n+    def test_positive_update_name(self):\n+        \"\"\"Update product name to another valid name.\n \n-        @Assert: The given attributes are used.\n+        @Assert: Product name can be updated.\n \n         @Feature: Product\n         \"\"\"\n-        for attrs in valid_name_desc_list():\n-            with self.subTest(attrs):\n-                setattr(self.product, attrs.keys()[0], attrs.values()[0])\n-                self.product = self.product.update()\n-                self.assertEqual(\n-                    getattr(self.product, attrs.keys()[0]),\n-                    attrs.values()[0]\n-                )\n+        product = entities.Product(organization=self.org).create()\n+        for new_name in valid_data_list():\n+            with self.subTest(new_name):\n+                entities.Product(id=product.id, name=new_name).update(['name'])\n+                updated = entities.Product(id=product.id).read()\n+                self.assertEqual(new_name, updated.name)\n \n+    @run_only_on('sat')\n     @tier1\n+    def test_positive_update_description(self):\n+        \"\"\"Update product description to another valid one.\n+\n+        @Assert: Product description can be updated.\n+\n+        @Feature: Product\n+        \"\"\"\n+        product = entities.Product(organization=self.org).create()\n+        for new_desc in valid_data_list():\n+            with self.subTest(new_desc):\n+                entities.Product(\n+                    id=product.id,\n+                    description=new_desc,\n+                ).update(['description'])\n+                updated = entities.Product(id=product.id).read()\n+                self.assertEqual(new_desc, updated.description)","path":"tests/foreman/api/test_product.py","position":213,"original_position":213,"commit_id":"b46b81b09a9db0e0a303e81a857ab8d98b2db4da","original_commit_id":"b46b81b09a9db0e0a303e81a857ab8d98b2db4da","user":{"login":"abalakh","id":11719030,"avatar_url":"https://avatars.githubusercontent.com/u/11719030?v=3","gravatar_id":"","url":"https://api.github.com/users/abalakh","html_url":"https://github.com/abalakh","followers_url":"https://api.github.com/users/abalakh/followers","following_url":"https://api.github.com/users/abalakh/following{/other_user}","gists_url":"https://api.github.com/users/abalakh/gists{/gist_id}","starred_url":"https://api.github.com/users/abalakh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/abalakh/subscriptions","organizations_url":"https://api.github.com/users/abalakh/orgs","repos_url":"https://api.github.com/users/abalakh/repos","events_url":"https://api.github.com/users/abalakh/events{/privacy}","received_events_url":"https://api.github.com/users/abalakh/received_events","type":"User","site_admin":false},"body":"Same here","created_at":"2016-02-23T10:09:36Z","updated_at":"2016-02-23T10:09:36Z","html_url":"https://github.com/SatelliteQE/robottelo/pull/3307#discussion_r53759661","pull_request_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/3307","_links":{"self":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/comments/53759661"},"html":{"href":"https://github.com/SatelliteQE/robottelo/pull/3307#discussion_r53759661"},"pull_request":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/3307"}}},"pull_request":{"url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/3307","id":60160107,"html_url":"https://github.com/SatelliteQE/robottelo/pull/3307","diff_url":"https://github.com/SatelliteQE/robottelo/pull/3307.diff","patch_url":"https://github.com/SatelliteQE/robottelo/pull/3307.patch","issue_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues/3307","number":3307,"state":"open","locked":false,"title":"Increase test coverage for Product entity in API","user":{"login":"oshtaier","id":10895065,"avatar_url":"https://avatars.githubusercontent.com/u/10895065?v=3","gravatar_id":"","url":"https://api.github.com/users/oshtaier","html_url":"https://github.com/oshtaier","followers_url":"https://api.github.com/users/oshtaier/followers","following_url":"https://api.github.com/users/oshtaier/following{/other_user}","gists_url":"https://api.github.com/users/oshtaier/gists{/gist_id}","starred_url":"https://api.github.com/users/oshtaier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oshtaier/subscriptions","organizations_url":"https://api.github.com/users/oshtaier/orgs","repos_url":"https://api.github.com/users/oshtaier/repos","events_url":"https://api.github.com/users/oshtaier/events{/privacy}","received_events_url":"https://api.github.com/users/oshtaier/received_events","type":"User","site_admin":false},"body":"Closes #3303\r\n```\r\nnosetests tests/foreman/api/test_product.py\r\n..............S\r\n----------------------------------------------------------------------\r\nRan 15 tests in 353.803s\r\n\r\nOK (SKIP=1)\r\n```","created_at":"2016-02-22T11:35:58Z","updated_at":"2016-02-23T10:09:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d9f06c354ad4191c9c13d5a1cc1e377971fd401c","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/3307/commits","review_comments_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/3307/comments","review_comment_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues/3307/comments","statuses_url":"https://api.github.com/repos/SatelliteQE/robottelo/statuses/b46b81b09a9db0e0a303e81a857ab8d98b2db4da","head":{"label":"oshtaier:product_api","ref":"product_api","sha":"b46b81b09a9db0e0a303e81a857ab8d98b2db4da","user":{"login":"oshtaier","id":10895065,"avatar_url":"https://avatars.githubusercontent.com/u/10895065?v=3","gravatar_id":"","url":"https://api.github.com/users/oshtaier","html_url":"https://github.com/oshtaier","followers_url":"https://api.github.com/users/oshtaier/followers","following_url":"https://api.github.com/users/oshtaier/following{/other_user}","gists_url":"https://api.github.com/users/oshtaier/gists{/gist_id}","starred_url":"https://api.github.com/users/oshtaier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oshtaier/subscriptions","organizations_url":"https://api.github.com/users/oshtaier/orgs","repos_url":"https://api.github.com/users/oshtaier/repos","events_url":"https://api.github.com/users/oshtaier/events{/privacy}","received_events_url":"https://api.github.com/users/oshtaier/received_events","type":"User","site_admin":false},"repo":{"id":33350829,"name":"robottelo","full_name":"oshtaier/robottelo","owner":{"login":"oshtaier","id":10895065,"avatar_url":"https://avatars.githubusercontent.com/u/10895065?v=3","gravatar_id":"","url":"https://api.github.com/users/oshtaier","html_url":"https://github.com/oshtaier","followers_url":"https://api.github.com/users/oshtaier/followers","following_url":"https://api.github.com/users/oshtaier/following{/other_user}","gists_url":"https://api.github.com/users/oshtaier/gists{/gist_id}","starred_url":"https://api.github.com/users/oshtaier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oshtaier/subscriptions","organizations_url":"https://api.github.com/users/oshtaier/orgs","repos_url":"https://api.github.com/users/oshtaier/repos","events_url":"https://api.github.com/users/oshtaier/events{/privacy}","received_events_url":"https://api.github.com/users/oshtaier/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/oshtaier/robottelo","description":"Robottelo is a test suite which exercises The Foreman.","fork":true,"url":"https://api.github.com/repos/oshtaier/robottelo","forks_url":"https://api.github.com/repos/oshtaier/robottelo/forks","keys_url":"https://api.github.com/repos/oshtaier/robottelo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/oshtaier/robottelo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/oshtaier/robottelo/teams","hooks_url":"https://api.github.com/repos/oshtaier/robottelo/hooks","issue_events_url":"https://api.github.com/repos/oshtaier/robottelo/issues/events{/number}","events_url":"https://api.github.com/repos/oshtaier/robottelo/events","assignees_url":"https://api.github.com/repos/oshtaier/robottelo/assignees{/user}","branches_url":"https://api.github.com/repos/oshtaier/robottelo/branches{/branch}","tags_url":"https://api.github.com/repos/oshtaier/robottelo/tags","blobs_url":"https://api.github.com/repos/oshtaier/robottelo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/oshtaier/robottelo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/oshtaier/robottelo/git/refs{/sha}","trees_url":"https://api.github.com/repos/oshtaier/robottelo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/oshtaier/robottelo/statuses/{sha}","languages_url":"https://api.github.com/repos/oshtaier/robottelo/languages","stargazers_url":"https://api.github.com/repos/oshtaier/robottelo/stargazers","contributors_url":"https://api.github.com/repos/oshtaier/robottelo/contributors","subscribers_url":"https://api.github.com/repos/oshtaier/robottelo/subscribers","subscription_url":"https://api.github.com/repos/oshtaier/robottelo/subscription","commits_url":"https://api.github.com/repos/oshtaier/robottelo/commits{/sha}","git_commits_url":"https://api.github.com/repos/oshtaier/robottelo/git/commits{/sha}","comments_url":"https://api.github.com/repos/oshtaier/robottelo/comments{/number}","issue_comment_url":"https://api.github.com/repos/oshtaier/robottelo/issues/comments{/number}","contents_url":"https://api.github.com/repos/oshtaier/robottelo/contents/{+path}","compare_url":"https://api.github.com/repos/oshtaier/robottelo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/oshtaier/robottelo/merges","archive_url":"https://api.github.com/repos/oshtaier/robottelo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/oshtaier/robottelo/downloads","issues_url":"https://api.github.com/repos/oshtaier/robottelo/issues{/number}","pulls_url":"https://api.github.com/repos/oshtaier/robottelo/pulls{/number}","milestones_url":"https://api.github.com/repos/oshtaier/robottelo/milestones{/number}","notifications_url":"https://api.github.com/repos/oshtaier/robottelo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/oshtaier/robottelo/labels{/name}","releases_url":"https://api.github.com/repos/oshtaier/robottelo/releases{/id}","deployments_url":"https://api.github.com/repos/oshtaier/robottelo/deployments","created_at":"2015-04-03T06:48:07Z","updated_at":"2015-04-06T12:49:17Z","pushed_at":"2016-02-23T08:47:53Z","git_url":"git://github.com/oshtaier/robottelo.git","ssh_url":"git@github.com:oshtaier/robottelo.git","clone_url":"https://github.com/oshtaier/robottelo.git","svn_url":"https://github.com/oshtaier/robottelo","homepage":"","size":11060,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"SatelliteQE:master","ref":"master","sha":"cdb94bc61db0aeb059b8ca210fdecc51ccc25d89","user":{"login":"SatelliteQE","id":8754276,"avatar_url":"https://avatars.githubusercontent.com/u/8754276?v=3","gravatar_id":"","url":"https://api.github.com/users/SatelliteQE","html_url":"https://github.com/SatelliteQE","followers_url":"https://api.github.com/users/SatelliteQE/followers","following_url":"https://api.github.com/users/SatelliteQE/following{/other_user}","gists_url":"https://api.github.com/users/SatelliteQE/gists{/gist_id}","starred_url":"https://api.github.com/users/SatelliteQE/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SatelliteQE/subscriptions","organizations_url":"https://api.github.com/users/SatelliteQE/orgs","repos_url":"https://api.github.com/users/SatelliteQE/repos","events_url":"https://api.github.com/users/SatelliteQE/events{/privacy}","received_events_url":"https://api.github.com/users/SatelliteQE/received_events","type":"Organization","site_admin":false},"repo":{"id":4000279,"name":"robottelo","full_name":"SatelliteQE/robottelo","owner":{"login":"SatelliteQE","id":8754276,"avatar_url":"https://avatars.githubusercontent.com/u/8754276?v=3","gravatar_id":"","url":"https://api.github.com/users/SatelliteQE","html_url":"https://github.com/SatelliteQE","followers_url":"https://api.github.com/users/SatelliteQE/followers","following_url":"https://api.github.com/users/SatelliteQE/following{/other_user}","gists_url":"https://api.github.com/users/SatelliteQE/gists{/gist_id}","starred_url":"https://api.github.com/users/SatelliteQE/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SatelliteQE/subscriptions","organizations_url":"https://api.github.com/users/SatelliteQE/orgs","repos_url":"https://api.github.com/users/SatelliteQE/repos","events_url":"https://api.github.com/users/SatelliteQE/events{/privacy}","received_events_url":"https://api.github.com/users/SatelliteQE/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SatelliteQE/robottelo","description":"Robottelo is a test suite which exercises The Foreman.","fork":false,"url":"https://api.github.com/repos/SatelliteQE/robottelo","forks_url":"https://api.github.com/repos/SatelliteQE/robottelo/forks","keys_url":"https://api.github.com/repos/SatelliteQE/robottelo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SatelliteQE/robottelo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SatelliteQE/robottelo/teams","hooks_url":"https://api.github.com/repos/SatelliteQE/robottelo/hooks","issue_events_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues/events{/number}","events_url":"https://api.github.com/repos/SatelliteQE/robottelo/events","assignees_url":"https://api.github.com/repos/SatelliteQE/robottelo/assignees{/user}","branches_url":"https://api.github.com/repos/SatelliteQE/robottelo/branches{/branch}","tags_url":"https://api.github.com/repos/SatelliteQE/robottelo/tags","blobs_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/refs{/sha}","trees_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SatelliteQE/robottelo/statuses/{sha}","languages_url":"https://api.github.com/repos/SatelliteQE/robottelo/languages","stargazers_url":"https://api.github.com/repos/SatelliteQE/robottelo/stargazers","contributors_url":"https://api.github.com/repos/SatelliteQE/robottelo/contributors","subscribers_url":"https://api.github.com/repos/SatelliteQE/robottelo/subscribers","subscription_url":"https://api.github.com/repos/SatelliteQE/robottelo/subscription","commits_url":"https://api.github.com/repos/SatelliteQE/robottelo/commits{/sha}","git_commits_url":"https://api.github.com/repos/SatelliteQE/robottelo/git/commits{/sha}","comments_url":"https://api.github.com/repos/SatelliteQE/robottelo/comments{/number}","issue_comment_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues/comments{/number}","contents_url":"https://api.github.com/repos/SatelliteQE/robottelo/contents/{+path}","compare_url":"https://api.github.com/repos/SatelliteQE/robottelo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SatelliteQE/robottelo/merges","archive_url":"https://api.github.com/repos/SatelliteQE/robottelo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SatelliteQE/robottelo/downloads","issues_url":"https://api.github.com/repos/SatelliteQE/robottelo/issues{/number}","pulls_url":"https://api.github.com/repos/SatelliteQE/robottelo/pulls{/number}","milestones_url":"https://api.github.com/repos/SatelliteQE/robottelo/milestones{/number}","notifications_url":"https://api.github.com/repos/SatelliteQE/robottelo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SatelliteQE/robottelo/labels{/name}","releases_url":"https://api.github.com/repos/SatelliteQE/robottelo/releases{/id}","deployments_url":"https://api.github.com/repos/SatelliteQE/robottelo/deployments","created_at":"2012-04-12T01:36:39Z","updated_at":"2016-01-08T15:06:33Z","pushed_at":"2016-02-23T09:56:30Z","git_url":"git://github.com/SatelliteQE/robottelo.git","ssh_url":"git@github.com:SatelliteQE/robottelo.git","clone_url":"https://github.com/SatelliteQE/robottelo.git","svn_url":"https://github.com/SatelliteQE/robottelo","homepage":"","size":12068,"stargazers_count":23,"watchers_count":23,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":36,"mirror_url":null,"open_issues_count":141,"forks":36,"open_issues":141,"watchers":23,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/3307"},"html":{"href":"https://github.com/SatelliteQE/robottelo/pull/3307"},"issue":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/issues/3307"},"comments":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/issues/3307/comments"},"review_comments":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/3307/comments"},"review_comment":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/pulls/3307/commits"},"statuses":{"href":"https://api.github.com/repos/SatelliteQE/robottelo/statuses/b46b81b09a9db0e0a303e81a857ab8d98b2db4da"}}}}