Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
edcc02a
chore: update ui
andypols Apr 17, 2026
d85b75c
chore: update tooling
andypols Apr 17, 2026
852ac84
chore: update core types, context, utilities, auth
andypols Apr 17, 2026
58df513
chore: update API service layer
andypols Apr 17, 2026
f1a0205
chore: add TanStack React-Query data layer
andypols Apr 17, 2026
b73788f
chore: replace MUI shared components with Primer
andypols Apr 17, 2026
a8721b6
chore: replace MUI shared components with Primer
andypols Apr 17, 2026
c61ba1c
chore: update tests
andypols Apr 17, 2026
5a7c872
chore: upgrade @headlessui/react
andypols Apr 17, 2026
953e342
chore: upgrade logo to work in header
andypols Apr 17, 2026
e93e1e8
chore: migrate PushRequests and UserProfile to GitProxyUnderlineNav
andypols Apr 19, 2026
7123d9d
feat: add GET /users/:id/activity endpoint for user profile push history
andypols Apr 19, 2026
021f0d3
feat: add push activity rollups to repo and user list APIs
andypols Apr 19, 2026
0f30541
feat: missing file
andypols Apr 19, 2026
a2245d1
feat: add scm-metadata service
andypols Apr 19, 2026
f48c93a
feat: rm config
andypols Apr 20, 2026
e81f34a
feat: add cypress
andypols Apr 20, 2026
e30dc66
chore: fix tests
andypols Apr 20, 2026
57f1c13
chore: fix missing deps
andypols Apr 20, 2026
1d8f0ee
chore: fix missing deps
andypols Apr 20, 2026
9db3028
chore: fix test
andypols Apr 20, 2026
e1b2a79
chore: fix cypress test
andypols Apr 20, 2026
9715627
chore: fix incomplete URL substring sanitization
andypols Apr 20, 2026
9c35e3d
chore: add react-is as explicit dependency to satisfy @primer/react p…
andypols Jun 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/unused-dependencies.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
node-version: '24.x'
- name: 'Run depcheck'
run: |
npx depcheck --skip-missing --ignores="tsx,@babel/*,@commitlint/*,eslint,eslint-*,husky,ts-node,concurrently,nyc,prettier,typescript,tsconfig-paths,vite-tsconfig-paths,quicktype,history,@types/domutils,@vitest/coverage-v8,cross-env,c8"
npx depcheck --skip-missing --ignores="tsx,@babel/*,@commitlint/*,eslint,eslint-*,husky,ts-node,concurrently,nyc,prettier,typescript,tsconfig-paths,vite-tsconfig-paths,quicktype,history,@types/domutils,@vitest/coverage-v8,cross-env,c8,tailwindcss"
echo $?
if [[ $? == 1 ]]; then
echo "Unused dependencies or devDependencies found"
Expand Down
25 changes: 6 additions & 19 deletions cypress/e2e/autoApproved.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
* limitations under the License.
*/

import moment from 'moment';

describe('Auto-Approved Push Test', () => {
beforeEach(() => {
cy.login('admin', 'admin');
Expand Down Expand Up @@ -55,34 +53,23 @@ describe('Auto-Approved Push Test', () => {
},
],
attestation: {
timestamp: '2023-10-01T12:00:00Z',
autoApproved: true,
timestamp: 1696161600000,
reviewer: {
username: 'system',
displayName: '',
},
},
},
}).as('getPush');
});

it('should display auto-approved message and verify tooltip contains the expected timestamp', () => {
it('should display auto-approved message', () => {
cy.visit('/dashboard/push/123');

cy.wait('@getPush');

cy.contains('Auto-approved by system').should('be.visible');

cy.get('svg.MuiSvgIcon-root')
.filter((_, el) => getComputedStyle(el).fill === 'rgb(0, 128, 0)')
.invoke('attr', 'style')
.should('include', 'cursor: default')
.and('include', 'opacity: 0.5');

const expectedTooltipTimestamp = moment('2023-10-01T12:00:00Z')
.local()
.format('dddd, MMMM Do YYYY, h:mm:ss a');

cy.get('kbd').trigger('mouseover');

cy.get('.MuiTooltip-tooltip').should('contain', expectedTooltipTimestamp);

cy.contains('approved this contribution').should('not.exist');
});
});
4 changes: 2 additions & 2 deletions cypress/e2e/login.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,12 @@ describe('Login page', () => {
cy.url().should('include', '/dashboard/repo');
});

it('should show an error snackbar on invalid login', () => {
it('should show an error flash on invalid login', () => {
cy.get('[data-test="username"]').type('wronguser');
cy.get('[data-test="password"]').type('wrongpass');
cy.get('[data-test="login"]').click();

cy.get('.MuiSnackbarContent-message')
cy.get('[data-test="login-error"]')
.should('be.visible')
.and('contain', 'You entered an invalid username or password.');
});
Expand Down
38 changes: 14 additions & 24 deletions cypress/e2e/repo.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,13 @@ describe('Repo', () => {

cy.get('[data-testid="repo-list-view"]').find('[data-testid="add-repo-button"]').click();

cy.get('[data-testid="add-repo-dialog"]').within(() => {
cy.get('[role="dialog"]').within(() => {
cy.get('[data-testid="repo-project-input"]').type('cypress-test');
cy.get('[data-testid="repo-name-input"]').type(repoName);
cy.get('[data-testid="repo-url-input"]').type(
`https://github.com/cypress-test/${repoName}.git`,
);
cy.get('[data-testid="add-repo-button"]').click();
cy.get('[data-testid="add-repo-submit"]').click();
});

cy.contains('a', `cypress-test/${repoName}`, { timeout: 10000 }).click();
Expand All @@ -81,11 +81,11 @@ describe('Repo', () => {
it('Displays an error when adding an existing repo', () => {
cy.get('[data-testid="repo-list-view"]').find('[data-testid="add-repo-button"]').click();

cy.get('[data-testid="add-repo-dialog"]').within(() => {
cy.get('[role="dialog"]').within(() => {
cy.get('[data-testid="repo-project-input"]').type('finos');
cy.get('[data-testid="repo-name-input"]').type('git-proxy');
cy.get('[data-testid="repo-url-input"]').type('https://github.com/finos/git-proxy.git');
cy.get('[data-testid="add-repo-button"]').click();
cy.get('[data-testid="add-repo-submit"]').click();
});

cy.get('[data-testid="repo-error"]')
Expand Down Expand Up @@ -127,38 +127,28 @@ describe('Repo', () => {
});
});

it('Opens tooltip with correct content and can copy', () => {
it('Opens Code overlay with correct content and can copy', () => {
cy.visit('/dashboard/repo');
cy.on('uncaught:exception', () => false);

const tooltipQuery = 'div[role="tooltip"]';

// Check the tooltip isn't open to start with
cy.get(tooltipQuery).should('not.exist');
// Overlay should not be visible initially
cy.contains('span', cloneURL).should('not.exist');

// Find the repo's Code button and click it
cy.get(`a[href="/dashboard/repo/${repoId}"]`)
.closest('tr')
.find('span')
.contains('Code')
.contains('button', 'Code')
.should('exist')
.click();

// Check tooltip is open and contains the correct clone URL
cy.get(tooltipQuery)
.should('exist')
.find('span')
.contains(cloneURL)
.should('exist')
.parent()
.find('span')
.next()
.get('svg.octicon-copy')
.should('exist')
.click();
// Verify overlay shows correct clone URL
cy.contains('span', cloneURL).should('be.visible');

cy.get('svg.octicon-copy').should('not.exist');
// Click the copy to clipboard button (sibling of the clone URL span)
cy.contains('span', cloneURL).parent().find('button').click();

// Verify icon changes from copy to check (confirming clipboard copy)
cy.get('svg.octicon-copy').should('not.exist');
cy.get('svg.octicon-check').should('exist');
});

Expand Down
Loading
Loading