factories.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. # Copyright (C) 2014 Andrey Antukh <niwi@niwi.be>
  2. # Copyright (C) 2014 Jesús Espino <jespinog@gmail.com>
  3. # Copyright (C) 2014 David Barragán <bameda@dbarragan.com>
  4. # Copyright (C) 2014 Anler Hernández <hello@anler.me>
  5. # This program is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU Affero General Public License as
  7. # published by the Free Software Foundation, either version 3 of the
  8. # License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU Affero General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU Affero General Public License
  16. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. import uuid
  18. import threading
  19. from datetime import date, timedelta
  20. from django.conf import settings
  21. import factory
  22. class Factory(factory.DjangoModelFactory):
  23. class Meta:
  24. strategy = factory.CREATE_STRATEGY
  25. model = None
  26. abstract = True
  27. _SEQUENCE = 1
  28. _SEQUENCE_LOCK = threading.Lock()
  29. @classmethod
  30. def _setup_next_sequence(cls):
  31. with cls._SEQUENCE_LOCK:
  32. cls._SEQUENCE += 1
  33. return cls._SEQUENCE
  34. class ProjectTemplateFactory(Factory):
  35. class Meta:
  36. strategy = factory.CREATE_STRATEGY
  37. model = "projects.ProjectTemplate"
  38. django_get_or_create = ("slug",)
  39. name = "Template name"
  40. slug = settings.DEFAULT_PROJECT_TEMPLATE
  41. description = factory.Sequence(lambda n: "Description {}".format(n))
  42. us_statuses = []
  43. points = []
  44. task_statuses = []
  45. issue_statuses = []
  46. issue_types = []
  47. priorities = []
  48. severities = []
  49. roles = []
  50. default_owner_role = "tester"
  51. class ProjectFactory(Factory):
  52. class Meta:
  53. model = "projects.Project"
  54. strategy = factory.CREATE_STRATEGY
  55. name = factory.Sequence(lambda n: "Project {}".format(n))
  56. slug = factory.Sequence(lambda n: "project-{}-slug".format(n))
  57. description = "Project description"
  58. owner = factory.SubFactory("tests.factories.UserFactory")
  59. creation_template = factory.SubFactory("tests.factories.ProjectTemplateFactory")
  60. class ProjectModulesConfigFactory(Factory):
  61. class Meta:
  62. model = "projects.ProjectModulesConfig"
  63. strategy = factory.CREATE_STRATEGY
  64. project = factory.SubFactory("tests.factories.ProjectFactory")
  65. class RoleFactory(Factory):
  66. class Meta:
  67. model = "users.Role"
  68. strategy = factory.CREATE_STRATEGY
  69. name = factory.Sequence(lambda n: "Role {}".format(n))
  70. slug = factory.Sequence(lambda n: "test-role-{}".format(n))
  71. project = factory.SubFactory("tests.factories.ProjectFactory")
  72. class PointsFactory(Factory):
  73. class Meta:
  74. model = "projects.Points"
  75. strategy = factory.CREATE_STRATEGY
  76. name = factory.Sequence(lambda n: "Points {}".format(n))
  77. value = 2
  78. project = factory.SubFactory("tests.factories.ProjectFactory")
  79. class RolePointsFactory(Factory):
  80. class Meta:
  81. model = "userstories.RolePoints"
  82. strategy = factory.CREATE_STRATEGY
  83. user_story = factory.SubFactory("tests.factories.UserStoryFactory")
  84. role = factory.SubFactory("tests.factories.RoleFactory")
  85. points = factory.SubFactory("tests.factories.PointsFactory")
  86. class UserStoryAttachmentFactory(Factory):
  87. project = factory.SubFactory("tests.factories.ProjectFactory")
  88. owner = factory.SubFactory("tests.factories.UserFactory")
  89. content_object = factory.SubFactory("tests.factories.UserStoryFactory")
  90. attached_file = factory.django.FileField(data=b"File contents")
  91. class Meta:
  92. model = "attachments.Attachment"
  93. strategy = factory.CREATE_STRATEGY
  94. class TaskAttachmentFactory(Factory):
  95. project = factory.SubFactory("tests.factories.ProjectFactory")
  96. owner = factory.SubFactory("tests.factories.UserFactory")
  97. content_object = factory.SubFactory("tests.factories.TaskFactory")
  98. attached_file = factory.django.FileField(data=b"File contents")
  99. class Meta:
  100. model = "attachments.Attachment"
  101. strategy = factory.CREATE_STRATEGY
  102. class IssueAttachmentFactory(Factory):
  103. project = factory.SubFactory("tests.factories.ProjectFactory")
  104. owner = factory.SubFactory("tests.factories.UserFactory")
  105. content_object = factory.SubFactory("tests.factories.IssueFactory")
  106. attached_file = factory.django.FileField(data=b"File contents")
  107. class Meta:
  108. model = "attachments.Attachment"
  109. strategy = factory.CREATE_STRATEGY
  110. class WikiAttachmentFactory(Factory):
  111. project = factory.SubFactory("tests.factories.ProjectFactory")
  112. owner = factory.SubFactory("tests.factories.UserFactory")
  113. content_object = factory.SubFactory("tests.factories.WikiFactory")
  114. attached_file = factory.django.FileField(data=b"File contents")
  115. class Meta:
  116. model = "attachments.Attachment"
  117. strategy = factory.CREATE_STRATEGY
  118. class UserFactory(Factory):
  119. class Meta:
  120. model = "users.User"
  121. strategy = factory.CREATE_STRATEGY
  122. username = factory.Sequence(lambda n: "user{}".format(n))
  123. email = factory.LazyAttribute(lambda obj: '%s@email.com' % obj.username)
  124. password = factory.PostGeneration(lambda obj, *args, **kwargs: obj.set_password(obj.username))
  125. class MembershipFactory(Factory):
  126. class Meta:
  127. model = "projects.Membership"
  128. strategy = factory.CREATE_STRATEGY
  129. token = factory.LazyAttribute(lambda obj: str(uuid.uuid1()))
  130. project = factory.SubFactory("tests.factories.ProjectFactory")
  131. role = factory.SubFactory("tests.factories.RoleFactory")
  132. user = factory.SubFactory("tests.factories.UserFactory")
  133. class InvitationFactory(Factory):
  134. class Meta:
  135. model = "projects.Membership"
  136. strategy = factory.CREATE_STRATEGY
  137. token = factory.LazyAttribute(lambda obj: str(uuid.uuid1()))
  138. project = factory.SubFactory("tests.factories.ProjectFactory")
  139. role = factory.SubFactory("tests.factories.RoleFactory")
  140. email = factory.Sequence(lambda n: "user{}@email.com".format(n))
  141. class WebhookFactory(Factory):
  142. class Meta:
  143. model = "webhooks.Webhook"
  144. strategy = factory.CREATE_STRATEGY
  145. project = factory.SubFactory("tests.factories.ProjectFactory")
  146. url = "http://localhost:8080/test"
  147. key = "factory-key"
  148. name = "Factory-name"
  149. class WebhookLogFactory(Factory):
  150. class Meta:
  151. model = "webhooks.WebhookLog"
  152. strategy = factory.CREATE_STRATEGY
  153. webhook = factory.SubFactory("tests.factories.WebhookFactory")
  154. url = "http://localhost:8080/test"
  155. status = "200"
  156. request_data = {"text": "test-request-data"}
  157. response_data = {"text": "test-response-data"}
  158. class StorageEntryFactory(Factory):
  159. class Meta:
  160. model = "userstorage.StorageEntry"
  161. strategy = factory.CREATE_STRATEGY
  162. owner = factory.SubFactory("tests.factories.UserFactory")
  163. key = factory.Sequence(lambda n: "key-{}".format(n))
  164. value = factory.Sequence(lambda n: {"value": "value-{}".format(n)})
  165. class UserStoryFactory(Factory):
  166. class Meta:
  167. model = "userstories.UserStory"
  168. strategy = factory.CREATE_STRATEGY
  169. ref = factory.Sequence(lambda n: n)
  170. project = factory.SubFactory("tests.factories.ProjectFactory")
  171. owner = factory.SubFactory("tests.factories.UserFactory")
  172. subject = factory.Sequence(lambda n: "User Story {}".format(n))
  173. description = factory.Sequence(lambda n: "User Story {} description".format(n))
  174. status = factory.SubFactory("tests.factories.UserStoryStatusFactory")
  175. milestone = factory.SubFactory("tests.factories.MilestoneFactory")
  176. class UserStoryStatusFactory(Factory):
  177. class Meta:
  178. model = "projects.UserStoryStatus"
  179. strategy = factory.CREATE_STRATEGY
  180. name = factory.Sequence(lambda n: "User Story status {}".format(n))
  181. project = factory.SubFactory("tests.factories.ProjectFactory")
  182. class TaskStatusFactory(Factory):
  183. class Meta:
  184. model = "projects.TaskStatus"
  185. strategy = factory.CREATE_STRATEGY
  186. name = factory.Sequence(lambda n: "Task status {}".format(n))
  187. project = factory.SubFactory("tests.factories.ProjectFactory")
  188. class MilestoneFactory(Factory):
  189. class Meta:
  190. model = "milestones.Milestone"
  191. strategy = factory.CREATE_STRATEGY
  192. name = factory.Sequence(lambda n: "Milestone {}".format(n))
  193. owner = factory.SubFactory("tests.factories.UserFactory")
  194. project = factory.SubFactory("tests.factories.ProjectFactory")
  195. estimated_start = factory.LazyAttribute(lambda o: date.today())
  196. estimated_finish = factory.LazyAttribute(lambda o: o.estimated_start + timedelta(days=7))
  197. class IssueFactory(Factory):
  198. class Meta:
  199. model = "issues.Issue"
  200. strategy = factory.CREATE_STRATEGY
  201. ref = factory.Sequence(lambda n: n)
  202. subject = factory.Sequence(lambda n: "Issue {}".format(n))
  203. description = factory.Sequence(lambda n: "Issue {} description".format(n))
  204. owner = factory.SubFactory("tests.factories.UserFactory")
  205. project = factory.SubFactory("tests.factories.ProjectFactory")
  206. status = factory.SubFactory("tests.factories.IssueStatusFactory")
  207. severity = factory.SubFactory("tests.factories.SeverityFactory")
  208. priority = factory.SubFactory("tests.factories.PriorityFactory")
  209. type = factory.SubFactory("tests.factories.IssueTypeFactory")
  210. milestone = factory.SubFactory("tests.factories.MilestoneFactory")
  211. class TaskFactory(Factory):
  212. class Meta:
  213. model = "tasks.Task"
  214. strategy = factory.CREATE_STRATEGY
  215. ref = factory.Sequence(lambda n: n)
  216. subject = factory.Sequence(lambda n: "Task {}".format(n))
  217. description = factory.Sequence(lambda n: "Task {} description".format(n))
  218. owner = factory.SubFactory("tests.factories.UserFactory")
  219. project = factory.SubFactory("tests.factories.ProjectFactory")
  220. status = factory.SubFactory("tests.factories.TaskStatusFactory")
  221. milestone = factory.SubFactory("tests.factories.MilestoneFactory")
  222. user_story = factory.SubFactory("tests.factories.UserStoryFactory")
  223. tags = []
  224. class WikiPageFactory(Factory):
  225. class Meta:
  226. model = "wiki.WikiPage"
  227. strategy = factory.CREATE_STRATEGY
  228. project = factory.SubFactory("tests.factories.ProjectFactory")
  229. owner = factory.SubFactory("tests.factories.UserFactory")
  230. slug = factory.Sequence(lambda n: "wiki-page-{}".format(n))
  231. content = factory.Sequence(lambda n: "Wiki Page {} content".format(n))
  232. class WikiLinkFactory(Factory):
  233. class Meta:
  234. model = "wiki.WikiLink"
  235. strategy = factory.CREATE_STRATEGY
  236. project = factory.SubFactory("tests.factories.ProjectFactory")
  237. title = factory.Sequence(lambda n: "Wiki Link {} title".format(n))
  238. href = factory.Sequence(lambda n: "link-{}".format(n))
  239. order = factory.Sequence(lambda n: n)
  240. class IssueStatusFactory(Factory):
  241. class Meta:
  242. model = "projects.IssueStatus"
  243. strategy = factory.CREATE_STRATEGY
  244. name = factory.Sequence(lambda n: "Issue Status {}".format(n))
  245. project = factory.SubFactory("tests.factories.ProjectFactory")
  246. class SeverityFactory(Factory):
  247. class Meta:
  248. model = "projects.Severity"
  249. strategy = factory.CREATE_STRATEGY
  250. name = factory.Sequence(lambda n: "Severity {}".format(n))
  251. project = factory.SubFactory("tests.factories.ProjectFactory")
  252. class PriorityFactory(Factory):
  253. class Meta:
  254. model = "projects.Priority"
  255. strategy = factory.CREATE_STRATEGY
  256. name = factory.Sequence(lambda n: "Priority {}".format(n))
  257. project = factory.SubFactory("tests.factories.ProjectFactory")
  258. class IssueTypeFactory(Factory):
  259. class Meta:
  260. model = "projects.IssueType"
  261. strategy = factory.CREATE_STRATEGY
  262. name = factory.Sequence(lambda n: "Issue Type {}".format(n))
  263. project = factory.SubFactory("tests.factories.ProjectFactory")
  264. class UserStoryCustomAttributeFactory(Factory):
  265. class Meta:
  266. model = "custom_attributes.UserStoryCustomAttribute"
  267. strategy = factory.CREATE_STRATEGY
  268. name = factory.Sequence(lambda n: "UserStory Custom Attribute {}".format(n))
  269. description = factory.Sequence(lambda n: "Description for UserStory Custom Attribute {}".format(n))
  270. project = factory.SubFactory("tests.factories.ProjectFactory")
  271. class TaskCustomAttributeFactory(Factory):
  272. class Meta:
  273. model = "custom_attributes.TaskCustomAttribute"
  274. strategy = factory.CREATE_STRATEGY
  275. name = factory.Sequence(lambda n: "Task Custom Attribute {}".format(n))
  276. description = factory.Sequence(lambda n: "Description for Task Custom Attribute {}".format(n))
  277. project = factory.SubFactory("tests.factories.ProjectFactory")
  278. class IssueCustomAttributeFactory(Factory):
  279. class Meta:
  280. model = "custom_attributes.IssueCustomAttribute"
  281. strategy = factory.CREATE_STRATEGY
  282. name = factory.Sequence(lambda n: "Issue Custom Attribute {}".format(n))
  283. description = factory.Sequence(lambda n: "Description for Issue Custom Attribute {}".format(n))
  284. project = factory.SubFactory("tests.factories.ProjectFactory")
  285. class UserStoryCustomAttributesValuesFactory(Factory):
  286. class Meta:
  287. model = "custom_attributes.UserStoryCustomAttributesValues"
  288. strategy = factory.CREATE_STRATEGY
  289. attributes_values = {}
  290. user_story = factory.SubFactory("tests.factories.UserStoryFactory")
  291. class TaskCustomAttributesValuesFactory(Factory):
  292. class Meta:
  293. model = "custom_attributes.TaskCustomAttributesValues"
  294. strategy = factory.CREATE_STRATEGY
  295. attributes_values = {}
  296. task = factory.SubFactory("tests.factories.TaskFactory")
  297. class IssueCustomAttributesValuesFactory(Factory):
  298. class Meta:
  299. model = "custom_attributes.IssueCustomAttributesValues"
  300. strategy = factory.CREATE_STRATEGY
  301. attributes_values = {}
  302. issue = factory.SubFactory("tests.factories.IssueFactory")
  303. # class FanFactory(Factory):
  304. # project = factory.SubFactory("tests.factories.ProjectFactory")
  305. # user = factory.SubFactory("tests.factories.UserFactory")
  306. # class StarsFactory(Factory):
  307. # project = factory.SubFactory("tests.factories.ProjectFactory")
  308. # count = 0
  309. class VoteFactory(Factory):
  310. class Meta:
  311. model = "votes.Vote"
  312. strategy = factory.CREATE_STRATEGY
  313. content_type = factory.SubFactory("tests.factories.ContentTypeFactory")
  314. object_id = factory.Sequence(lambda n: n)
  315. user = factory.SubFactory("tests.factories.UserFactory")
  316. class VotesFactory(Factory):
  317. class Meta:
  318. model = "votes.Votes"
  319. strategy = factory.CREATE_STRATEGY
  320. content_type = factory.SubFactory("tests.factories.ContentTypeFactory")
  321. object_id = factory.Sequence(lambda n: n)
  322. class WatchedFactory(Factory):
  323. class Meta:
  324. model = "notifications.Watched"
  325. strategy = factory.CREATE_STRATEGY
  326. content_type = factory.SubFactory("tests.factories.ContentTypeFactory")
  327. object_id = factory.Sequence(lambda n: n)
  328. user = factory.SubFactory("tests.factories.UserFactory")
  329. project = factory.SubFactory("tests.factories.ProjectFactory")
  330. class ContentTypeFactory(Factory):
  331. class Meta:
  332. model = "contenttypes.ContentType"
  333. strategy = factory.CREATE_STRATEGY
  334. django_get_or_create = ("app_label", "model")
  335. app_label = factory.LazyAttribute(lambda obj: "issues")
  336. model = factory.LazyAttribute(lambda obj: "Issue")
  337. class AttachmentFactory(Factory):
  338. class Meta:
  339. model = "attachments.Attachment"
  340. strategy = factory.CREATE_STRATEGY
  341. owner = factory.SubFactory("tests.factories.UserFactory")
  342. project = factory.SubFactory("tests.factories.ProjectFactory")
  343. content_type = factory.SubFactory("tests.factories.ContentTypeFactory")
  344. object_id = factory.Sequence(lambda n: n)
  345. attached_file = factory.django.FileField(data=b"File contents")
  346. class HistoryEntryFactory(Factory):
  347. class Meta:
  348. model = "history.HistoryEntry"
  349. strategy = factory.CREATE_STRATEGY
  350. type = 1
  351. def create_issue(**kwargs):
  352. "Create an issue and along with its dependencies."
  353. owner = kwargs.pop("owner", None)
  354. if owner is None:
  355. owner = UserFactory.create()
  356. project = kwargs.pop("project", None)
  357. if project is None:
  358. project = ProjectFactory.create(owner=owner)
  359. defaults = {
  360. "project": project,
  361. "owner": owner,
  362. "status": IssueStatusFactory.create(project=project),
  363. "milestone": MilestoneFactory.create(project=project),
  364. "priority": PriorityFactory.create(project=project),
  365. "severity": SeverityFactory.create(project=project),
  366. "type": IssueTypeFactory.create(project=project),
  367. }
  368. defaults.update(kwargs)
  369. return IssueFactory.create(**defaults)
  370. def create_task(**kwargs):
  371. "Create a task and along with its dependencies."
  372. owner = kwargs.pop("owner", None)
  373. if not owner:
  374. owner = UserFactory.create()
  375. project = kwargs.pop("project", None)
  376. if project is None:
  377. project = ProjectFactory.create(owner=owner)
  378. defaults = {
  379. "project": project,
  380. "owner": owner,
  381. "status": TaskStatusFactory.create(project=project),
  382. "milestone": MilestoneFactory.create(project=project),
  383. "user_story": UserStoryFactory.create(project=project, owner=owner),
  384. }
  385. defaults.update(kwargs)
  386. return TaskFactory.create(**defaults)
  387. def create_membership(**kwargs):
  388. "Create a membership along with its dependencies"
  389. project = kwargs.pop("project", ProjectFactory())
  390. project.points.add(PointsFactory.create(project=project, value=None))
  391. defaults = {
  392. "project": project,
  393. "user": project.owner,
  394. "role": RoleFactory.create(project=project)
  395. }
  396. defaults.update(kwargs)
  397. return MembershipFactory.create(**defaults)
  398. def create_invitation(**kwargs):
  399. "Create an invitation along with its dependencies"
  400. project = kwargs.pop("project", ProjectFactory())
  401. project.points.add(PointsFactory.create(project=project, value=None))
  402. defaults = {
  403. "project": project,
  404. "role": RoleFactory.create(project=project),
  405. "email": "invited-user@email.com",
  406. "token": "tokenvalue",
  407. "invited_by_id": project.owner.id
  408. }
  409. defaults.update(kwargs)
  410. return MembershipFactory.create(**defaults)
  411. def create_userstory(**kwargs):
  412. "Create an user story along with its dependencies"
  413. owner = kwargs.pop("owner", None)
  414. if not owner:
  415. owner = UserFactory.create()
  416. project = kwargs.pop("project", None)
  417. if project is None:
  418. project = ProjectFactory.create(owner=owner)
  419. defaults = {
  420. "project": project,
  421. "owner": owner,
  422. "milestone": MilestoneFactory.create(project=project, owner=owner)
  423. }
  424. defaults.update(kwargs)
  425. return UserStoryFactory(**defaults)
  426. def create_project(**kwargs):
  427. "Create a project along with its dependencies"
  428. defaults = {}
  429. defaults.update(kwargs)
  430. ProjectTemplateFactory.create(slug=settings.DEFAULT_PROJECT_TEMPLATE)
  431. project = ProjectFactory.create(**defaults)
  432. project.default_issue_status = IssueStatusFactory.create(project=project)
  433. project.default_severity = SeverityFactory.create(project=project)
  434. project.default_priority = PriorityFactory.create(project=project)
  435. project.default_issue_type = IssueTypeFactory.create(project=project)
  436. project.default_us_status = UserStoryStatusFactory.create(project=project)
  437. project.default_task_status = TaskStatusFactory.create(project=project)
  438. project.save()
  439. return project
  440. def create_user(**kwargs):
  441. "Create an user along with her dependencies"
  442. ProjectTemplateFactory.create(slug=settings.DEFAULT_PROJECT_TEMPLATE)
  443. RoleFactory.create()
  444. return UserFactory.create(**kwargs)