test_plugin.py 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. from __future__ import absolute_import
  2. import responses
  3. from exam import fixture
  4. from django.contrib.auth.models import AnonymousUser
  5. from django.test import RequestFactory
  6. from sentry.exceptions import PluginError
  7. from sentry.models import GroupMeta
  8. from sentry.testutils import PluginTestCase
  9. from sentry.utils import json
  10. from social_auth.models import UserSocialAuth
  11. from sentry_plugins.vsts.plugin import VstsPlugin
  12. WORK_ITEM_RESPONSE = """{
  13. "id": 309,
  14. "rev": 1,
  15. "fields": {
  16. "System.AreaPath": "Fabrikam-Fiber-Git",
  17. "System.TeamProject": "Fabrikam-Fiber-Git",
  18. "System.IterationPath": "Fabrikam-Fiber-Git",
  19. "System.WorkItemType": "Product Backlog Item",
  20. "System.State": "New",
  21. "System.Reason": "New backlog item",
  22. "System.CreatedDate": "2015-01-07T18:13:01.807Z",
  23. "System.CreatedBy": "Jamal Hartnett <fabrikamfiber4@hotmail.com>",
  24. "System.ChangedDate": "2015-01-07T18:13:01.807Z",
  25. "System.ChangedBy": "Jamal Hartnett <fabrikamfiber4@hotmail.com>",
  26. "System.Title": "Customer can sign in using their Microsoft Account",
  27. "Microsoft.VSTS.Scheduling.Effort": 8,
  28. "WEF_6CB513B6E70E43499D9FC94E5BBFB784_Kanban.Column": "New",
  29. "System.Description": "Our authorization logic needs to allow for users with Microsoft accounts (formerly Live Ids) - http://msdn.microsoft.com/en-us/library/live/hh826547.aspx"
  30. },
  31. "_links": {
  32. "self": {
  33. "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/309"
  34. },
  35. "workItemUpdates": {
  36. "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/309/updates"
  37. },
  38. "workItemRevisions": {
  39. "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/309/revisions"
  40. },
  41. "workItemHistory": {
  42. "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/309/history"
  43. },
  44. "html": {
  45. "href": "https://fabrikam-fiber-inc.visualstudio.com/web/wi.aspx?pcguid=d81542e4-cdfa-4333-b082-1ae2d6c3ad16&id=309"
  46. },
  47. "workItemType": {
  48. "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/6ce954b1-ce1f-45d1-b94d-e6bf2464ba2c/_apis/wit/workItemTypes/Product%20Backlog%20Item"
  49. },
  50. "fields": {
  51. "href": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/fields"
  52. }
  53. },
  54. "url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/309"
  55. }"""
  56. class VstsPluginTest(PluginTestCase):
  57. @fixture
  58. def plugin(self):
  59. return VstsPlugin()
  60. @fixture
  61. def request(self):
  62. return RequestFactory()
  63. def test_conf_key(self):
  64. assert self.plugin.conf_key == "vsts"
  65. def test_entry_point(self):
  66. self.assertPluginInstalled("vsts", self.plugin)
  67. def test_get_issue_label(self):
  68. group = self.create_group(message="Hello world", culprit="foo.bar")
  69. assert self.plugin.get_issue_label(group, {"id": 309}) == "Bug 309"
  70. def test_get_issue_url(self):
  71. self.plugin.set_option("instance", "fabrikam-fiber-inc.visualstudio.com", self.project)
  72. group = self.create_group(message="Hello world", culprit="foo.bar")
  73. assert (
  74. self.plugin.get_issue_url(
  75. group,
  76. {
  77. "id": 309,
  78. "url": "https://fabrikam-fiber-inc.visualstudio.com/DefaultProject/_workitems?id=309",
  79. },
  80. )
  81. == "https://fabrikam-fiber-inc.visualstudio.com/DefaultProject/_workitems?id=309"
  82. )
  83. def test_is_configured(self):
  84. assert self.plugin.is_configured(None, self.project) is False
  85. self.plugin.set_option("instance", "fabrikam-fiber-inc.visualstudio.com", self.project)
  86. assert self.plugin.is_configured(None, self.project) is True
  87. @responses.activate
  88. def test_create_issue(self):
  89. responses.add(
  90. responses.PATCH,
  91. "https://fabrikam-fiber-inc.visualstudio.com/DefaultProject/_apis/wit/workitems/$Bug",
  92. body=WORK_ITEM_RESPONSE,
  93. content_type="application/json",
  94. )
  95. self.plugin.set_option("instance", "fabrikam-fiber-inc.visualstudio.com", self.project)
  96. self.plugin.set_option("default_project", "DefaultProject", self.project)
  97. group = self.create_group(message="Hello world", culprit="foo.bar")
  98. request = self.request.get("/")
  99. request.user = AnonymousUser()
  100. form_data = {"title": "Hello", "description": "Fix this."}
  101. with self.assertRaises(PluginError):
  102. self.plugin.create_issue(request, group, form_data)
  103. request.user = self.user
  104. self.login_as(self.user)
  105. UserSocialAuth.objects.create(
  106. user=self.user,
  107. provider=self.plugin.auth_provider,
  108. uid="a89e7204-9ca0-4680-ba7a-cfcf6b3c7445",
  109. extra_data={"access_token": "foo", "refresh_token": "bar"},
  110. )
  111. assert self.plugin.create_issue(request, group, form_data) == {
  112. "id": 309,
  113. "url": "https://fabrikam-fiber-inc.visualstudio.com/web/wi.aspx?pcguid=d81542e4-cdfa-4333-b082-1ae2d6c3ad16&id=309",
  114. "title": "Hello",
  115. }
  116. request = responses.calls[-1].request
  117. assert request.headers["Content-Type"] == "application/json-patch+json"
  118. payload = json.loads(request.body)
  119. assert payload == [
  120. {"op": "add", "path": "/fields/System.Title", "value": "Hello"},
  121. {"op": "add", "path": "/fields/System.History", "value": "<p>Fix this.</p>\n"},
  122. # {
  123. # "op": "add",
  124. # "path": "/relations/-",
  125. # "value": {
  126. # "rel": "Hyperlink",
  127. # "url": 'http://testserver/baz/bar/issues/1/',
  128. # }
  129. # }
  130. ]
  131. @responses.activate
  132. def test_link_issue_without_comment(self):
  133. responses.add(
  134. responses.GET,
  135. "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workitems/309",
  136. body=WORK_ITEM_RESPONSE,
  137. content_type="application/json",
  138. )
  139. self.plugin.set_option("instance", "fabrikam-fiber-inc.visualstudio.com", self.project)
  140. group = self.create_group(message="Hello world", culprit="foo.bar")
  141. request = self.request.get("/")
  142. request.user = AnonymousUser()
  143. form_data = {"item_id": "309"}
  144. with self.assertRaises(PluginError):
  145. self.plugin.link_issue(request, group, form_data)
  146. request.user = self.user
  147. self.login_as(self.user)
  148. UserSocialAuth.objects.create(
  149. user=self.user,
  150. provider=self.plugin.auth_provider,
  151. uid="a89e7204-9ca0-4680-ba7a-cfcf6b3c7445",
  152. extra_data={"access_token": "foo", "refresh_token": "bar"},
  153. )
  154. assert self.plugin.link_issue(request, group, form_data) == {
  155. "id": 309,
  156. "title": "Customer can sign in using their Microsoft Account",
  157. "url": "https://fabrikam-fiber-inc.visualstudio.com/web/wi.aspx?pcguid=d81542e4-cdfa-4333-b082-1ae2d6c3ad16&id=309",
  158. }
  159. @responses.activate
  160. def test_link_issue_with_comment(self):
  161. responses.add(
  162. responses.PATCH,
  163. "https://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workitems/309",
  164. body=WORK_ITEM_RESPONSE,
  165. content_type="application/json",
  166. )
  167. self.plugin.set_option("instance", "fabrikam-fiber-inc.visualstudio.com", self.project)
  168. group = self.create_group(message="Hello world", culprit="foo.bar")
  169. request = self.request.get("/")
  170. request.user = AnonymousUser()
  171. form_data = {"item_id": "309", "comment": "Fix this."}
  172. with self.assertRaises(PluginError):
  173. self.plugin.link_issue(request, group, form_data)
  174. request.user = self.user
  175. self.login_as(self.user)
  176. UserSocialAuth.objects.create(
  177. user=self.user,
  178. provider=self.plugin.auth_provider,
  179. uid="a89e7204-9ca0-4680-ba7a-cfcf6b3c7445",
  180. extra_data={"access_token": "foo", "refresh_token": "bar"},
  181. )
  182. assert self.plugin.link_issue(request, group, form_data) == {
  183. "id": 309,
  184. "title": "Customer can sign in using their Microsoft Account",
  185. "url": "https://fabrikam-fiber-inc.visualstudio.com/web/wi.aspx?pcguid=d81542e4-cdfa-4333-b082-1ae2d6c3ad16&id=309",
  186. }
  187. request = responses.calls[-1].request
  188. assert request.headers["Content-Type"] == "application/json-patch+json"
  189. payload = json.loads(request.body)
  190. assert payload == [
  191. {"op": "add", "path": "/fields/System.History", "value": "<p>Fix this.</p>\n"},
  192. # {
  193. # "op": "add",
  194. # "path": "/relations/-",
  195. # "value": {
  196. # "rel": "Hyperlink",
  197. # "url": 'http://testserver/baz/bar/issues/1/',
  198. # }
  199. # }
  200. ]
  201. @responses.activate
  202. def test_unlink_issue(self):
  203. self.plugin.set_option("instance", "fabrikam-fiber-inc.visualstudio.com", self.project)
  204. group = self.create_group(message="Hello world", culprit="foo.bar")
  205. GroupMeta.objects.create(group=group, key="vsts:issue_id", value="309")
  206. request = self.request.get("/")
  207. request.user = self.user
  208. self.login_as(self.user)
  209. UserSocialAuth.objects.create(
  210. user=self.user,
  211. provider=self.plugin.auth_provider,
  212. uid="a89e7204-9ca0-4680-ba7a-cfcf6b3c7445",
  213. extra_data={"access_token": "foo", "refresh_token": "bar"},
  214. )
  215. assert self.plugin.unlink_issue(
  216. request,
  217. group,
  218. {
  219. "id": 309,
  220. "title": "Customer can sign in using their Microsoft Account",
  221. "url": "https://fabrikam-fiber-inc.visualstudio.com/web/wi.aspx?pcguid=d81542e4-cdfa-4333-b082-1ae2d6c3ad16&id=309",
  222. },
  223. )