github-issue-tower-defence-management 1.60.2 → 1.64.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/.github/workflows/publish.yml +13 -0
  2. package/.github/workflows/test.yml +0 -4
  3. package/CHANGELOG.md +14 -0
  4. package/README.md +53 -10
  5. package/bin/adapter/entry-points/cli/index.js +11 -11
  6. package/bin/adapter/entry-points/cli/index.js.map +1 -1
  7. package/bin/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.js +3 -22
  8. package/bin/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.js.map +1 -1
  9. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +8 -22
  10. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  11. package/bin/adapter/entry-points/handlers/rotationOrderFileWriter.js +56 -0
  12. package/bin/adapter/entry-points/handlers/rotationOrderFileWriter.js.map +1 -0
  13. package/bin/adapter/entry-points/handlers/situationFileWriter.js +5 -0
  14. package/bin/adapter/entry-points/handlers/situationFileWriter.js.map +1 -1
  15. package/bin/adapter/proxy/TokenListLoader.js +21 -6
  16. package/bin/adapter/proxy/TokenListLoader.js.map +1 -1
  17. package/bin/adapter/proxy/proxyEntry.js +1 -0
  18. package/bin/adapter/proxy/proxyEntry.js.map +1 -1
  19. package/bin/adapter/repositories/BaseGitHubRepository.js +1 -113
  20. package/bin/adapter/repositories/BaseGitHubRepository.js.map +1 -1
  21. package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js +5 -3
  22. package/bin/adapter/repositories/ProxyClaudeTokenUsageRepository.js.map +1 -1
  23. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +8 -7
  24. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
  25. package/bin/domain/usecases/HandleScheduledEventUseCase.js +14 -3
  26. package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
  27. package/bin/domain/usecases/IssueRejectionEvaluator.js +8 -1
  28. package/bin/domain/usecases/IssueRejectionEvaluator.js.map +1 -1
  29. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +5 -1
  30. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
  31. package/bin/domain/usecases/RevertOrphanedPreparationUseCase.js +1 -1
  32. package/bin/domain/usecases/RevertOrphanedPreparationUseCase.js.map +1 -1
  33. package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js +32 -1
  34. package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js.map +1 -1
  35. package/bin/domain/usecases/StartPreparationUseCase.js +148 -28
  36. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  37. package/package.json +1 -4
  38. package/src/adapter/entry-points/cli/index.test.ts +16 -16
  39. package/src/adapter/entry-points/cli/index.ts +8 -11
  40. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.test.ts +2 -55
  41. package/src/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.ts +1 -11
  42. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +6 -56
  43. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +7 -11
  44. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.test.ts +177 -0
  45. package/src/adapter/entry-points/handlers/rotationOrderFileWriter.ts +20 -0
  46. package/src/adapter/entry-points/handlers/situationFileWriter.test.ts +36 -0
  47. package/src/adapter/entry-points/handlers/situationFileWriter.ts +8 -0
  48. package/src/adapter/proxy/TokenListLoader.test.ts +50 -1
  49. package/src/adapter/proxy/TokenListLoader.ts +25 -5
  50. package/src/adapter/proxy/proxyEntry.test.ts +270 -1
  51. package/src/adapter/proxy/proxyEntry.ts +2 -1
  52. package/src/adapter/repositories/BaseGitHubRepository.test.ts +1 -186
  53. package/src/adapter/repositories/BaseGitHubRepository.ts +1 -139
  54. package/src/adapter/repositories/GraphqlProjectRepository.errorHandling.test.ts +0 -1
  55. package/src/adapter/repositories/GraphqlProjectRepository.fetchProjectId.test.ts +4 -1
  56. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.test.ts +60 -19
  57. package/src/adapter/repositories/ProxyClaudeTokenUsageRepository.ts +6 -4
  58. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +23 -13
  59. package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +0 -1
  60. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +0 -8
  61. package/src/adapter/repositories/issue/RestIssueRepository.test.ts +0 -1
  62. package/src/domain/entities/ClaudeTokenUsage.ts +1 -0
  63. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +4 -0
  64. package/src/domain/usecases/HandleScheduledEventUseCase.ts +20 -5
  65. package/src/domain/usecases/IssueRejectionEvaluator.test.ts +153 -0
  66. package/src/domain/usecases/IssueRejectionEvaluator.ts +8 -0
  67. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +175 -31
  68. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +7 -1
  69. package/src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.test.ts +32 -0
  70. package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +39 -5
  71. package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +1 -1
  72. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.test.ts +139 -20
  73. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +62 -2
  74. package/src/domain/usecases/StartPreparationUseCase.test.ts +614 -23
  75. package/src/domain/usecases/StartPreparationUseCase.ts +226 -35
  76. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +16 -0
  77. package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
  78. package/types/adapter/entry-points/handlers/GetStoryObjectMapUseCaseHandler.d.ts.map +1 -1
  79. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  80. package/types/adapter/entry-points/handlers/rotationOrderFileWriter.d.ts +3 -0
  81. package/types/adapter/entry-points/handlers/rotationOrderFileWriter.d.ts.map +1 -0
  82. package/types/adapter/entry-points/handlers/situationFileWriter.d.ts +1 -0
  83. package/types/adapter/entry-points/handlers/situationFileWriter.d.ts.map +1 -1
  84. package/types/adapter/proxy/TokenListLoader.d.ts +5 -0
  85. package/types/adapter/proxy/TokenListLoader.d.ts.map +1 -1
  86. package/types/adapter/proxy/proxyEntry.d.ts +2 -1
  87. package/types/adapter/proxy/proxyEntry.d.ts.map +1 -1
  88. package/types/adapter/repositories/BaseGitHubRepository.d.ts +1 -23
  89. package/types/adapter/repositories/BaseGitHubRepository.d.ts.map +1 -1
  90. package/types/adapter/repositories/ProxyClaudeTokenUsageRepository.d.ts.map +1 -1
  91. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +14 -5
  92. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
  93. package/types/domain/entities/ClaudeTokenUsage.d.ts +1 -0
  94. package/types/domain/entities/ClaudeTokenUsage.d.ts.map +1 -1
  95. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +5 -2
  96. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
  97. package/types/domain/usecases/IssueRejectionEvaluator.d.ts +1 -1
  98. package/types/domain/usecases/IssueRejectionEvaluator.d.ts.map +1 -1
  99. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
  100. package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts +5 -2
  101. package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts.map +1 -1
  102. package/types/domain/usecases/StartPreparationUseCase.d.ts +18 -2
  103. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
  104. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +14 -0
  105. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
  106. package/bin/adapter/repositories/issue/CheerioIssueRepository.js +0 -136
  107. package/bin/adapter/repositories/issue/CheerioIssueRepository.js.map +0 -1
  108. package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js +0 -1606
  109. package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js.map +0 -1
  110. package/src/adapter/repositories/issue/CheerioIssueRepository.test.ts +0 -6552
  111. package/src/adapter/repositories/issue/CheerioIssueRepository.ts +0 -142
  112. package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.test.ts +0 -118
  113. package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts +0 -584
  114. package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts +0 -40
  115. package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts.map +0 -1
  116. package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts +0 -220
  117. package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts.map +0 -1
@@ -1,142 +0,0 @@
1
- import ky from 'ky';
2
- import * as cheerio from 'cheerio';
3
- import { BaseGitHubRepository } from '../BaseGitHubRepository';
4
- import { InternalGraphqlIssueRepository } from './InternalGraphqlIssueRepository';
5
- import { LocalStorageRepository } from '../LocalStorageRepository';
6
-
7
- export type IssueStatusTimeline = {
8
- time: string;
9
- author: string;
10
- from: string;
11
- to: string;
12
- };
13
-
14
- export type Issue = {
15
- url: string;
16
- title: string;
17
- status: string;
18
- assignees: string[];
19
- labels: string[];
20
- project: string;
21
- statusTimeline: IssueStatusTimeline[];
22
- createdAt: Date;
23
- };
24
-
25
- export class CheerioIssueRepository extends BaseGitHubRepository {
26
- constructor(
27
- readonly internalGraphqlIssueRepository: InternalGraphqlIssueRepository,
28
- readonly localStorageRepository: LocalStorageRepository,
29
- readonly jsonFilePath: string = './tmp/github.com.cookies.json',
30
- readonly ghToken: string = process.env.GH_TOKEN || 'dummy',
31
- readonly ghUserName: string | undefined = process.env.GH_USER_NAME,
32
- readonly ghUserPassword: string | undefined = process.env.GH_USER_PASSWORD,
33
- readonly ghAuthenticatorKey: string | undefined = process.env
34
- .GH_AUTHENTICATOR_KEY,
35
- ) {
36
- super(
37
- localStorageRepository,
38
- jsonFilePath,
39
- ghToken,
40
- ghUserName,
41
- ghUserPassword,
42
- ghAuthenticatorKey,
43
- );
44
- }
45
- getIssue = async (issueUrl: string): Promise<Issue> => {
46
- const headers = await this.createHeader();
47
- const html = await ky.get(issueUrl, { headers }).text();
48
- const $ = cheerio.load(html);
49
- if (html.includes('react-app.embeddedData')) {
50
- const issue =
51
- await this.internalGraphqlIssueRepository.getIssueFromBetaFeatureView(
52
- issueUrl,
53
- html,
54
- );
55
- return {
56
- ...issue,
57
- createdAt: new Date('2024-01-01'),
58
- };
59
- }
60
- return this.getIssueFromNormalView(issueUrl, $);
61
- };
62
- getIssueFromNormalView = async (
63
- issueUrl: string,
64
- $: cheerio.CheerioAPI,
65
- ): Promise<Issue> => {
66
- const title = this.getTitleFromCheerioObject($);
67
- const statusOrig = this.getStatusFromCheerioObject($);
68
- const assignees = this.getAssigneesFromCheerioObject($);
69
- const labels = this.getLabelsFromCheerioObject($);
70
- const project = this.getProjectFromCheerioObject($);
71
- const statusTimeline = await this.getStatusTimelineEvents($);
72
- const status =
73
- statusOrig !== ''
74
- ? statusOrig
75
- : statusTimeline.length > 0
76
- ? statusTimeline[statusTimeline.length - 1].to
77
- : '';
78
- return {
79
- url: issueUrl,
80
- title,
81
- status,
82
- assignees,
83
- labels,
84
- project,
85
- statusTimeline,
86
- createdAt: new Date('2024-01-01'),
87
- };
88
- };
89
- getStatusTimelineEvents = async (
90
- $: cheerio.CheerioAPI,
91
- ): Promise<IssueStatusTimeline[]> => {
92
- return this.getStatusTimelineEventsFromCheerioObject($);
93
- };
94
- protected getTitleFromCheerioObject = ($: cheerio.CheerioAPI): string => {
95
- return $('h1 > bdi').text();
96
- };
97
- protected getStatusFromCheerioObject = ($: cheerio.CheerioAPI): string => {
98
- return $('sidebar-memex-input > details > summary > span').text();
99
- };
100
- protected getAssigneesFromCheerioObject = (
101
- $: cheerio.CheerioAPI,
102
- ): string[] => {
103
- const assignees = $(
104
- 'div.sidebar-assignee > form > span > p > span > a.assignee > span',
105
- );
106
- return assignees.map((_, elem) => $(elem).text()).get();
107
- };
108
- protected getLabelsFromCheerioObject = ($: cheerio.CheerioAPI): string[] => {
109
- return $('div.js-issue-labels > a > span')
110
- .map((_, elem) => $(elem).text())
111
- .get();
112
- };
113
- protected getProjectFromCheerioObject = ($: cheerio.CheerioAPI): string => {
114
- return $('collapsible-sidebar-widget > div a > span').text();
115
- };
116
-
117
- protected getStatusTimelineEventsFromCheerioObject = (
118
- $: cheerio.CheerioAPI,
119
- ): IssueStatusTimeline[] => {
120
- const timelines = $('.TimelineItem-body');
121
- const res: IssueStatusTimeline[] = [];
122
- for (const timeline of timelines) {
123
- const author = $(timeline).find('a.author').text();
124
- if (!author) {
125
- continue;
126
- }
127
- const time = $(timeline).find('relative-time').attr('datetime');
128
- if (!time) {
129
- continue;
130
- }
131
- const eventText = $(timeline).find('strong');
132
- if (eventText.length != 2) {
133
- continue;
134
- }
135
- const from = $(eventText[0]).text();
136
- const to = $(eventText[1]).text();
137
- res.push({ time, author, from, to });
138
- }
139
-
140
- return res;
141
- };
142
- }
@@ -1,118 +0,0 @@
1
- import { InternalGraphqlIssueRepository } from './InternalGraphqlIssueRepository';
2
- import { LocalStorageRepository } from '../LocalStorageRepository';
3
-
4
- describe('InternalGraphqlIssueRepository', () => {
5
- jest.setTimeout(30 * 1000);
6
- const localStorageRepository = new LocalStorageRepository();
7
- const repository = new InternalGraphqlIssueRepository(localStorageRepository);
8
-
9
- const testIssueUrl =
10
- 'https://github.com/HiromiShikata/test-repository/issues/38';
11
- const testCursor = null;
12
- const testIssueId = 'I_kwDOCNXcUc6GaFia';
13
- const testCount = 10;
14
-
15
- beforeAll(async () => {
16
- await repository.getCookie();
17
- });
18
-
19
- test('getFrontTimelineItems returns timeline with proper types', async () => {
20
- const result = await repository.getFrontTimelineItems(
21
- testIssueUrl,
22
- testCursor,
23
- testIssueId,
24
- testCount,
25
- );
26
- expect(result).toBeDefined();
27
- expect(result.length).toEqual(testCount);
28
- });
29
-
30
- test('getIssueFromBetaFeatureView returns typed Issue object', async () => {
31
- const htmlContent = `
32
- <script type="application/json" data-target="react-app.embeddedData">{"payload":{"preloaded_records":{},"preloadedQueries":[{"queryId":"63ca9e7142c6d44786486b0e437a0152","queryName":"IssueViewerViewQuery","variables":{"id":"repository","number":38,"owner":"HiromiShikata","repo":"test-repository"},"result":{"data":{"repository":{"isOwnerEnterpriseManaged":false,"issue":{"id":"I_kwDOCNXcUc6GaFia","updatedAt":"2024-11-23T05:46:40Z","title":"In progress test title","number":38,"repository":{"nameWithOwner":"HiromiShikata/test-repository","id":"MDEwOlJlcG9zaXRvcnkxNDgyMzMyOTc=","name":"test-repository","owner":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","url":"https://github.com/HiromiShikata"},"isArchived":false,"isPrivate":false,"databaseId":148233297,"slashCommandsEnabled":true,"viewerCanInteract":true,"viewerInteractionLimitReasonHTML":"","planFeatures":{"maximumAssignees":10},"visibility":"PUBLIC","pinnedIssues":{"totalCount":0},"viewerCanPinIssues":true,"issueTypes":null},"titleHTML":"In progress test title","url":"https://github.com/HiromiShikata/test-repository/issues/38","viewerCanUpdateNext":true,"issueType":null,"state":"OPEN","stateReason":"REOPENED","duplicateOf":null,"linkedPullRequests":{"nodes":[]},"subIssuesSummary":{"total":0,"completed":0},"__isLabelable":"Issue","labels":{"edges":[{"node":{"id":"MDU6TGFiZWwxMDUyMzg2NjYy","color":"a2eeef","name":"enhancement","nameHTML":"enhancement","description":"New feature or request","url":"https://github.com/HiromiShikata/test-repository/labels/enhancement","__typename":"Label"},"cursor":"MQ"}],"pageInfo":{"endCursor":"MQ","hasNextPage":false}},"__isNode":"Issue","assignedActors":{"nodes":[{"__typename":"User","__isActor":"User","id":"MDQ6VXNlcjY0NDA4MTE=","login":"HiromiShikata","name":"Hiromi.s","profileResourcePath":"/HiromiShikata","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","__isNode":"User"}]},"milestone":null,"databaseId":2254985370,"viewerDidAuthor":true,"locked":false,"author":{"__typename":"User","__isActor":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","profileUrl":"https://github.com/HiromiShikata","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?v=4"},"__isComment":"Issue","body":"Test description\\r\\n- [ ] checkbox 1\\r\\n- list item 1\\r\\n- list item 2\\r\\n","bodyHTML":"\u003cp dir=\\"auto\\"\u003eTest description\u003c/p\u003e\\n\u003cul class=\\"contains-task-list\\"\u003e\\n\u003cli class=\\"task-list-item\\"\u003e\u003cinput type=\\"checkbox\\" id=\\"\\" disabled=\\"\\" class=\\"task-list-item-checkbox\\"\u003e checkbox 1\u003c/li\u003e\\n\u003cli\u003elist item 1\u003c/li\u003e\\n\u003cli\u003elist item 2\u003c/li\u003e\\n\u003c/ul\u003e","bodyVersion":"23fe03b4fb4e7439d0966bd8b0b852ff1d144be1bf2f9e626c9d1124066b0d3c","createdAt":"2024-04-21T09:26:54Z","__isReactable":"Issue","reactionGroups":[{"content":"THUMBS_UP","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"THUMBS_DOWN","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"LAUGH","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HOORAY","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"CONFUSED","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HEART","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"ROCKET","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"EYES","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}}],"viewerCanUpdateMetadata":true,"viewerCanComment":true,"viewerCanAssign":true,"viewerCanLabel":true,"__isIssueOrPullRequest":"Issue","projectItemsNext":{"edges":[{"node":{"id":"PVTI_lAHOAGJHa84AFhgFzgTKpJ8","isArchived":false,"project":{"id":"PVT_kwHOAGJHa84AFhgF","title":"V2 project on owner for testing","template":false,"viewerCanUpdate":true,"url":"https://github.com/users/HiromiShikata/projects/49","field":{"__typename":"ProjectV2SingleSelectField","id":"PVTSSF_lAHOAGJHa84AFhgFzgDLt0c","name":"Status","options":[{"id":"f75ad846","optionId":"f75ad846","name":"Todo","nameHTML":"Todo","color":"GRAY","descriptionHTML":"","description":""},{"id":"47fc9ee4","optionId":"47fc9ee4","name":"In Progress","nameHTML":"In Progress","color":"GRAY","descriptionHTML":"","description":""},{"id":"98236657","optionId":"98236657","name":"Done","nameHTML":"Done","color":"GRAY","descriptionHTML":"","description":""}],"__isNode":"ProjectV2SingleSelectField"},"closed":false,"number":49,"hasReachedItemsLimit":false,"__typename":"ProjectV2"},"fieldValueByName":{"__typename":"ProjectV2ItemFieldSingleSelectValue","id":"PVTFSV_lQHOAGJHa84AFhgFzgTKpJ_ODc6aFQ","optionId":"f75ad846","name":"Todo","nameHTML":"Todo","color":"GRAY","__isNode":"ProjectV2ItemFieldSingleSelectValue"},"__typename":"ProjectV2Item"},"cursor":"MQ"}],"pageInfo":{"endCursor":"MQ","hasNextPage":false}},"viewerCanSetMilestone":true,"isPinned":false,"viewerCanDelete":true,"viewerCanTransfer":true,"viewerCanConvertToDiscussion":false,"viewerCanLock":true,"viewerCanType":false,"frontTimelineItems":{"pageInfo":{"hasNextPage":true,"endCursor":"Y3Vyc29yOnYyOpPPAAABkgqXmAABqzE0Nzk0Njg2NjMw"},"totalCount":32,"edges":[{"node":{"__typename":"AssignedEvent","__isIssueTimelineItems":"AssignedEvent","__isTimelineEvent":"AssignedEvent","databaseId":12550358608,"createdAt":"2024-04-21T09:26:59Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"assignee":{"__typename":"User","id":"MDQ6VXNlcjY0NDA4MTE=","__isNode":"User","__isActor":"User","login":"HiromiShikata","resourcePath":"/HiromiShikata"},"__isNode":"AssignedEvent","id":"AE_lADOCNXcUc6GaFiazwAAAALsD0ZQ"},"cursor":"Y3Vyc29yOnYyOpPPAAABjv_67rgBqzEyNTUwMzU4NjA4"},{"node":{"__typename":"AddedToProjectV2Event","__isIssueTimelineItems":"AddedToProjectV2Event","__isTimelineEvent":"AddedToProjectV2Event","databaseId":14887473920,"createdAt":"2024-04-21T09:27:43Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"project":{"title":"V2 project on owner for testing","url":"https://github.com/users/HiromiShikata/projects/49","id":"PVT_kwHOAGJHa84AFhgF"},"__isNode":"AddedToProjectV2Event","id":"ATPVTE_lADOCNXcUc6GaFiazwAAAAN3XNMA"},"cursor":"Y3Vyc29yOnYyOpPPAAABjv_7mpgBqzE0ODg3NDczOTIw"},{"node":{"__typename":"RenamedTitleEvent","__isIssueTimelineItems":"RenamedTitleEvent","__isTimelineEvent":"RenamedTitleEvent","databaseId":12550362274,"createdAt":"2024-04-21T09:28:08Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"currentTitle":"In progress test title","previousTitle":"Test title","__isNode":"RenamedTitleEvent","id":"RTE_lADOCNXcUc6GaFiazwAAAALsD1Si"},"cursor":"Y3Vyc29yOnYyOpPPAAABjv_7_EABqzEyNTUwMzYyMjc0"},{"node":{"__typename":"ProjectV2ItemStatusChangedEvent","__isIssueTimelineItems":"ProjectV2ItemStatusChangedEvent","__isTimelineEvent":"ProjectV2ItemStatusChangedEvent","databaseId":15083737996,"createdAt":"2024-04-21T09:28:15Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"project":{"title":"V2 project on owner for testing","url":"https://github.com/users/HiromiShikata/projects/49","id":"PVT_kwHOAGJHa84AFhgF"},"previousStatus":"","status":"In Progress","__isNode":"ProjectV2ItemStatusChangedEvent","id":"PVTISC_lADOCNXcUc6GaFiazwAAAAODD5OM"},"cursor":"Y3Vyc29yOnYyOpPPAAABjv_8F5gBqzE1MDgzNzM3OTk2"},{"node":{"__typename":"IssueComment","__isIssueTimelineItems":"IssueComment","databaseId":2067976522,"viewerDidAuthor":true,"issue":{"author":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE="},"id":"I_kwDOCNXcUc6GaFia","number":38,"locked":false,"databaseId":2254985370},"author":{"__typename":"User","login":"HiromiShikata","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?v=4","profileUrl":"https://github.com/HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE="},"id":"IC_kwDOCNXcUc57QtFK","body":"first comment\\r\\n","bodyHTML":"\u003cp dir=\\"auto\\"\u003efirst comment\u003c/p\u003e","bodyVersion":"5488e9494e6e47fb5158f81fb4f27a786a0215e322a802c9a9fc9139fe4c20d1","viewerCanUpdate":true,"url":"https://github.com/HiromiShikata/test-repository/issues/38#issuecomment-2067976522","createdAt":"2024-04-21T09:28:24Z","authorAssociation":"OWNER","viewerCanDelete":true,"viewerCanMinimize":true,"viewerCanReport":true,"viewerCanReportToMaintainer":false,"viewerCanBlockFromOrg":false,"viewerCanUnblockFromOrg":false,"isHidden":false,"minimizedReason":null,"showSpammyBadge":false,"createdViaEmail":false,"authorToRepoOwnerSponsorship":null,"repository":{"id":"MDEwOlJlcG9zaXRvcnkxNDgyMzMyOTc=","name":"test-repository","owner":{"__typename":"User","id":"MDQ6VXNlcjY0NDA4MTE=","login":"HiromiShikata","url":"https://github.com/HiromiShikata"},"isPrivate":false,"slashCommandsEnabled":true,"nameWithOwner":"HiromiShikata/test-repository","databaseId":148233297},"__isComment":"IssueComment","viewerCanReadUserContentEdits":true,"lastEditedAt":null,"lastUserContentEdit":null,"__isReactable":"IssueComment","reactionGroups":[{"content":"THUMBS_UP","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"THUMBS_DOWN","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"LAUGH","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HOORAY","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"CONFUSED","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"HEART","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"ROCKET","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}},{"content":"EYES","viewerHasReacted":false,"reactors":{"totalCount":0,"nodes":[]}}],"__isNode":"IssueComment"},"cursor":"Y3Vyc29yOnYyOpPPAAABjv_8OsAAqjIwNjc5NzY1MjI="},{"node":{"__typename":"ProjectV2ItemStatusChangedEvent","__isIssueTimelineItems":"ProjectV2ItemStatusChangedEvent","__isTimelineEvent":"ProjectV2ItemStatusChangedEvent","databaseId":15034705899,"createdAt":"2024-04-21T09:31:46Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"project":{"title":"V2 project on owner for testing","url":"https://github.com/users/HiromiShikata/projects/49","id":"PVT_kwHOAGJHa84AFhgF"},"previousStatus":"In Progress","status":"Todo","__isNode":"ProjectV2ItemStatusChangedEvent","id":"PVTISC_lADOCNXcUc6GaFiazwAAAAOAI2fr"},"cursor":"Y3Vyc29yOnYyOpPPAAABjv__T9ABqzE1MDM0NzA1ODk5"},{"node":{"__typename":"ProjectV2ItemStatusChangedEvent","__isIssueTimelineItems":"ProjectV2ItemStatusChangedEvent","__isTimelineEvent":"ProjectV2ItemStatusChangedEvent","databaseId":14926683933,"createdAt":"2024-04-21T10:13:07Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"project":{"title":"V2 project on owner for testing","url":"https://github.com/users/HiromiShikata/projects/49","id":"PVT_kwHOAGJHa84AFhgF"},"previousStatus":"Todo","status":"In Progress","__isNode":"ProjectV2ItemStatusChangedEvent","id":"PVTISC_lADOCNXcUc6GaFiazwAAAAN5sx8d"},"cursor":"Y3Vyc29yOnYyOpPPAAABjwAlKzgBqzE0OTI2NjgzOTMz"},{"node":{"__typename":"LabeledEvent","__isIssueTimelineItems":"LabeledEvent","__isTimelineEvent":"LabeledEvent","databaseId":12550567813,"createdAt":"2024-04-21T10:38:04Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"label":{"id":"MDU6TGFiZWwxMDUyMzg2NjYy","nameHTML":"enhancement","name":"enhancement","color":"a2eeef","description":"New feature or request"},"__isNode":"LabeledEvent","id":"LE_lADOCNXcUc6GaFiazwAAAALsEneF"},"cursor":"Y3Vyc29yOnYyOpPPAAABjwA8AuABqzEyNTUwNTY3ODEz"},{"node":{"__typename":"ProjectV2ItemStatusChangedEvent","__isIssueTimelineItems":"ProjectV2ItemStatusChangedEvent","__isTimelineEvent":"ProjectV2ItemStatusChangedEvent","databaseId":14921360937,"createdAt":"2024-04-21T11:13:38Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"project":{"title":"V2 project on owner for testing","url":"https://github.com/users/HiromiShikata/projects/49","id":"PVT_kwHOAGJHa84AFhgF"},"previousStatus":"In Progress","status":"Todo","__isNode":"ProjectV2ItemStatusChangedEvent","id":"PVTISC_lADOCNXcUc6GaFiazwAAAAN5YeYp"},"cursor":"Y3Vyc29yOnYyOpPPAAABjwBcktABqzE0OTIxMzYwOTM3"},{"node":{"__typename":"LabeledEvent","__isIssueTimelineItems":"LabeledEvent","__isTimelineEvent":"LabeledEvent","databaseId":12550661821,"createdAt":"2024-04-21T11:28:26Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"label":{"id":"MDU6TGFiZWwxMDUyMzg2NjYw","nameHTML":"bug","name":"bug","color":"d73a4a","description":"Something isn't working"},"__isNode":"LabeledEvent","id":"LE_lADOCNXcUc6GaFiazwAAAALsE-a9"},"cursor":"Y3Vyc29yOnYyOpPPAAABjwBqH5ABqzEyNTUwNjYxODIx"},{"node":{"__typename":"UnlabeledEvent","__isIssueTimelineItems":"UnlabeledEvent","__isTimelineEvent":"UnlabeledEvent","databaseId":12550661973,"createdAt":"2024-04-21T11:28:32Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"label":{"id":"MDU6TGFiZWwxMDUyMzg2NjYw","nameHTML":"bug","name":"bug","color":"d73a4a","description":"Something isn't working"},"__isNode":"UnlabeledEvent","id":"UNLE_lADOCNXcUc6GaFiazwAAAALsE-dV"},"cursor":"Y3Vyc29yOnYyOpPPAAABjwBqNwABqzEyNTUwNjYxOTcz"},{"node":{"__typename":"RemovedFromProjectV2Event","__isIssueTimelineItems":"RemovedFromProjectV2Event","__isTimelineEvent":"RemovedFromProjectV2Event","databaseId":14803494036,"createdAt":"2024-08-27T05:39:11Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"project":{"title":"V2 project on owner for testing","url":"https://github.com/users/HiromiShikata/projects/49","id":"PVT_kwHOAGJHa84AFhgF"},"__isNode":"RemovedFromProjectV2Event","id":"RFPVTE_lADOCNXcUc6GaFiazwAAAANyW2SU"},"cursor":"Y3Vyc29yOnYyOpPPAAABkZJYYBgBqzE0ODAzNDk0MDM2"},{"node":{"__typename":"AddedToProjectV2Event","__isIssueTimelineItems":"AddedToProjectV2Event","__isTimelineEvent":"AddedToProjectV2Event","databaseId":14794432926,"createdAt":"2024-08-27T05:40:58Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"project":{"title":"V2 project on owner for testing","url":"https://github.com/users/HiromiShikata/projects/49","id":"PVT_kwHOAGJHa84AFhgF"},"__isNode":"AddedToProjectV2Event","id":"ATPVTE_lADOCNXcUc6GaFiazwAAAANx0SGe"},"cursor":"Y3Vyc29yOnYyOpPPAAABkZJaAhABqzE0Nzk0NDMyOTI2"},{"node":{"__typename":"RemovedFromProjectV2Event","__isIssueTimelineItems":"RemovedFromProjectV2Event","__isTimelineEvent":"RemovedFromProjectV2Event","databaseId":14806289828,"createdAt":"2024-09-19T13:30:52Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"project":{"title":"V2 project on owner for testing","url":"https://github.com/users/HiromiShikata/projects/49","id":"PVT_kwHOAGJHa84AFhgF"},"__isNode":"RemovedFromProjectV2Event","id":"RFPVTE_lADOCNXcUc6GaFiazwAAAANyhg2k"},"cursor":"Y3Vyc29yOnYyOpPPAAABkgp6euABqzE0ODA2Mjg5ODI4"},{"node":{"__typename":"AddedToProjectV2Event","__isIssueTimelineItems":"AddedToProjectV2Event","__isTimelineEvent":"AddedToProjectV2Event","databaseId":14794686630,"createdAt":"2024-09-19T14:02:40Z","actor":{"__typename":"User","login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","__isActor":"User","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","profileResourcePath":"/HiromiShikata"},"project":{"title":"V2 project on owner for testing","url":"https://github.com/users/HiromiShikata/projects/49","id":"PVT_kwHOAGJHa84AFhgF"},"__isNode":"AddedToProjectV2Event","id":"ATPVTE_lADOCNXcUc6GaFiazwAAAANx1QCm"},"cursor":"Y3Vyc29yOnYyOpPPAAABkgqXmAABqzE0Nzk0Njg2NjMw"}]},"backTimelineItems":{"pageInfo":{"hasPreviousPage":true,"startCursor":null},"totalCount":32,"edges":[]}},"id":"MDEwOlJlcG9zaXRvcnkxNDgyMzMyOTc="},"safeViewer":{"isEnterpriseManagedUser":false,"enterpriseManagedEnterpriseId":null,"login":"HiromiShikata","id":"MDQ6VXNlcjY0NDA4MTE=","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?s=64\u0026v=4","__isActor":"User","__typename":"User","name":"Hiromi.s","profileResourcePath":"/HiromiShikata"}}},"timestamp":1747310010}],"preloadedSubscriptions":{"969f1a1b54b7b31597d59da977e8234a":{"{\\"issueId\\":\\"I_kwDOCNXcUc6GaFia\\"}":{"response":{"data":{"issueUpdated":{"deletedCommentId":null,"issueBodyUpdated":null,"issueMetadataUpdated":null,"issueStateUpdated":null,"issueTimelineUpdated":null,"issueTitleUpdated":null,"issueReactionUpdated":null,"issueTransferStateUpdated":null,"issueTypeUpdated":null,"commentReactionUpdated":null,"commentUpdated":null,"subIssuesUpdated":null,"subIssuesSummaryUpdated":null,"parentIssueUpdated":null,"issueDependenciesSummaryUpdated":null}}},"subscriptionId":"eyJjIjoiZzp2Mzo6aXNzdWVVcGRhdGVkOmlkOklfa3dET0NOWGNVYzZHYUZpYTpnYUpwWkxKSlgydDNSRTlEVGxoalZXTTJSMkZHYVdFPSIsInQiOjE3NDczMTAwMTB9--3cca20c8da5c31aa7c7d1a68eba91946c989dbcf0ddf058573aa7607a3c314f6"}}}},"title":null,"appPayload":{"initial_view_content":{"team_id":null,"can_edit_view":true},"current_user":{"id":"MDQ6VXNlcjY0NDA4MTE=","login":"HiromiShikata","avatarUrl":"https://avatars.githubusercontent.com/u/6440811?v=4","is_staff":false,"is_emu":false},"current_user_settings":{"use_monospace_font":false,"use_single_key_shortcut":true,"preferred_emoji_skin_tone":0},"paste_url_link_as_plain_text":false,"base_avatar_url":"https://avatars.githubusercontent.com","help_url":"https://docs.github.com","sso_organizations":null,"multi_tenant":false,"tracing":false,"tracing_flamegraph":false,"catalog_service":"github/issues","scoped_repository":{"id":"MDEwOlJlcG9zaXRvcnkxNDgyMzMyOTc=","owner":"HiromiShikata","name":"test-repository","is_archived":false},"copilot_api_url":null,"enabled_features":{"use_pull_request_subscriptions_enabled":false,"pull_request_single_subscription":true,"disable_issues_react_ssr":false,"issues_react_dashboard_saved_views":false,"issue_dependencies":false,"copilot_natural_language_github_search":false,"private_avatars":false,"reserved_domain":true,"projects_classic_sunset_override":false,"issues_react_bypass_es_limits":true,"notifyd_issue_watch_activity_notify":false,"notifyd_enable_issue_thread_subscriptions":false,"timeline_best_effort_count_optimization":false,"copilot_auto_assign_metadata":false,"issues_react_create_milestone":true,"issues_react_preload_labels":true,"copilot_workspace_cross_repo_selection":false,"copilot_agent_mode":true,"issues_react_duplicate_issue":false,"issues_react_force_turbo_nav":false,"copilot_swe_agent":false,"issues_dashboard_no_redirects":true,"copilot_plan_brainstorm_with_blackbird":false,"copilot_find_relevant_files":false,"issues_react_dashboard_save_query_refresh":true,"copilot_find_relevant_files_debug":false,"use_dirty_query_in_issues_dashboard_filter_pickers":true,"issues_primer_portal":true,"copilot_workspace":true,"tasklist_block":false,"issues_react_perf_test":false,"elasticsearch_semantic_indexing_issues_show_dupes":false,"issues_semantic_search_preview_opt_in":false,"issues_semantic_search_preview_enabled":false}}}</script>
33
-
34
- `;
35
-
36
- const result = await repository.getIssueFromBetaFeatureView(
37
- testIssueUrl,
38
- htmlContent,
39
- );
40
- expect(result).toEqual({
41
- assignees: ['HiromiShikata'],
42
- createdAt: new Date('2024-04-21T09:26:54.000Z'),
43
- labels: ['enhancement'],
44
- project: 'V2 project on owner for testing',
45
- status: 'Todo',
46
- statusTimeline: [
47
- {
48
- author: 'HiromiShikata',
49
- from: '',
50
- time: '2024-04-21T09:28:15Z',
51
- to: 'In Progress',
52
- },
53
- {
54
- author: 'HiromiShikata',
55
- from: 'In Progress',
56
- time: '2024-04-21T09:31:46Z',
57
- to: 'Todo',
58
- },
59
- {
60
- author: 'HiromiShikata',
61
- from: 'Todo',
62
- time: '2024-04-21T10:13:07Z',
63
- to: 'In Progress',
64
- },
65
- {
66
- author: 'HiromiShikata',
67
- from: 'In Progress',
68
- time: '2024-04-21T11:13:38Z',
69
- to: 'Todo',
70
- },
71
- {
72
- author: 'HiromiShikata',
73
- from: '',
74
- time: '2024-09-19T14:03:05Z',
75
- to: 'Todo',
76
- },
77
- {
78
- author: 'HiromiShikata',
79
- from: 'Todo',
80
- time: '2024-11-23T05:44:07Z',
81
- to: 'In Progress',
82
- },
83
- {
84
- author: 'HiromiShikata',
85
- from: 'In Progress',
86
- time: '2024-11-23T05:44:10Z',
87
- to: 'Todo',
88
- },
89
- {
90
- author: 'github-project-automation',
91
- from: 'Todo',
92
- time: '2024-11-23T05:45:50Z',
93
- to: 'Done',
94
- },
95
- {
96
- author: 'HiromiShikata',
97
- from: 'Done',
98
- time: '2024-11-23T05:46:22Z',
99
- to: 'Todo',
100
- },
101
- {
102
- author: 'HiromiShikata',
103
- from: 'Todo',
104
- time: '2024-11-23T05:46:25Z',
105
- to: 'In Progress',
106
- },
107
- {
108
- author: 'HiromiShikata',
109
- from: 'In Progress',
110
- time: '2024-11-23T05:46:27Z',
111
- to: 'Todo',
112
- },
113
- ],
114
- title: 'In progress test title',
115
- url: 'https://github.com/HiromiShikata/test-repository/issues/38',
116
- });
117
- });
118
- });