Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2022-02-02 03:17:34 +00:00
parent e4503e5d77
commit 93f2849ea5
9 changed files with 79 additions and 17 deletions

View File

@ -139,6 +139,8 @@ proper-names:
"unicorn-worker-killer",
"URL",
"WebdriverIO",
"Workload Identity Pool",
"Workload Identity Provider",
"YAML",
"YouTrack"
]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 870 B

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -33,20 +33,51 @@ export const fetchAwards = async ({ commit, dispatch, state }, page = '1') => {
}
};
/**
* Creates an intermediary award, used for display
* until the real award is loaded from the backend.
*/
const newOptimisticAward = (name, state) => {
const freeId = Math.min(...state.awards.map((a) => a.id), Number.MAX_SAFE_INTEGER) - 1;
return {
id: freeId,
name,
user: {
id: window.gon.current_user_id,
name: window.gon.current_user_fullname,
username: window.gon.current_username,
},
};
};
export const toggleAward = async ({ commit, state }, name) => {
const award = state.awards.find((a) => a.name === name && a.user.id === state.currentUserId);
try {
if (award) {
await axios.delete(joinPaths(gon.relative_url_root || '', `${state.path}/${award.id}`));
commit(REMOVE_AWARD, award.id);
await axios
.delete(joinPaths(gon.relative_url_root || '', `${state.path}/${award.id}`))
.catch((err) => {
commit(ADD_NEW_AWARD, award);
throw err;
});
showToast(__('Award removed'));
} else {
const { data } = await axios.post(joinPaths(gon.relative_url_root || '', state.path), {
name,
});
const optimisticAward = newOptimisticAward(name, state);
commit(ADD_NEW_AWARD, optimisticAward);
const { data } = await axios
.post(joinPaths(gon.relative_url_root || '', state.path), {
name,
})
.finally(() => {
commit(REMOVE_AWARD, optimisticAward.id);
});
commit(ADD_NEW_AWARD, data);

View File

@ -31,7 +31,7 @@ GET /projects/:id/merge_requests/:merge_request_iid/status_checks
"id": 2,
"name": "Rule 1",
"external_url": "https://gitlab.com/test-endpoint",
"status": "approved"
"status": "pass"
},
{
"id": 1,
@ -60,6 +60,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/status_check_responses
| `merge_request_iid` | integer | yes | IID of a merge request |
| `sha` | string | yes | SHA at `HEAD` of the source branch |
| `external_status_check_id` | integer | yes | ID of an external status check |
| `status` | string | no | Set to `pass` to pass the check |
NOTE:
`sha` must be the SHA at the `HEAD` of the merge request's source branch.

View File

@ -105,6 +105,8 @@ Existing:
**Expire access tokens** to enable them.
- Tokens must be [revoked](../api/oauth2.md#revoke-a-token) or they don't expire.
When applications are deleted, all grants and tokens associated with the application are also deleted.
## Authorized applications
Every application you authorize with your GitLab credentials is shown

View File

@ -13,10 +13,10 @@ module QA
let(:package_version) { '1.3.7' }
let(:package_type) { 'maven_gradle' }
where(:authentication_token_type, :maven_header_name, :testcase) do
:personal_access_token | 'Private-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347601'
:ci_job_token | 'Job-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347603'
:project_deploy_token | 'Deploy-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347602'
where(:case_name, :authentication_token_type, :maven_header_name, :testcase) do
'using personal access token' | :personal_access_token | 'Private-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347601'
'using ci job token' | :ci_job_token | 'Job-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347603'
'using project deploy token' | :project_deploy_token | 'Deploy-Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347602'
end
with_them do
@ -31,7 +31,7 @@ module QA
end
end
it "pushes and pulls a maven package via gradle using #{params[:authentication_token_type]}", testcase: params[:testcase] do
it 'pushes and pulls a maven package via gradle', testcase: params[:testcase] do
Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
Resource::Repository::Commit.fabricate_via_api! do |commit|
gradle_upload_yaml = ERB.new(read_fixture('package_managers/maven', 'gradle_upload_package.yaml.erb')).result(binding)

View File

@ -27,6 +27,7 @@ RSpec.describe 'Merge request > User awards emoji', :js do
it 'removes award from merge request' do
first('[data-testid="award-button"]').click
expect(first('[data-testid="award-button"]')).to have_content '1'
find('[data-testid="award-button"].selected').click
expect(first('[data-testid="award-button"]')).to have_content '0'

View File

@ -87,6 +87,26 @@ describe('Awards app actions', () => {
describe('toggleAward', () => {
let mock;
const optimisticAwardId = Number.MAX_SAFE_INTEGER - 1;
const makeOptimisticAddMutation = (
id = optimisticAwardId,
name = null,
userId = window.gon.current_user_id,
) => ({
type: 'ADD_NEW_AWARD',
payload: {
id,
name,
user: {
id: userId,
},
},
});
const makeOptimisticRemoveMutation = (id = optimisticAwardId) => ({
type: 'REMOVE_AWARD',
payload: id,
});
beforeEach(() => {
mock = new MockAdapter(axios);
});
@ -110,8 +130,10 @@ describe('Awards app actions', () => {
mock.onPost(`${relativeRootUrl || ''}/awards`).reply(200, { id: 1 });
});
it('commits ADD_NEW_AWARD', async () => {
it('adds an optimistic award, removes it, and then commits ADD_NEW_AWARD', async () => {
testAction(actions.toggleAward, null, { path: '/awards', awards: [] }, [
makeOptimisticAddMutation(),
makeOptimisticRemoveMutation(),
{ type: 'ADD_NEW_AWARD', payload: { id: 1 } },
]);
});
@ -127,7 +149,7 @@ describe('Awards app actions', () => {
actions.toggleAward,
null,
{ path: '/awards', awards: [] },
[],
[makeOptimisticAddMutation(), makeOptimisticRemoveMutation()],
[],
() => {
expect(Sentry.captureException).toHaveBeenCalled();
@ -137,7 +159,7 @@ describe('Awards app actions', () => {
});
});
describe('removing a award', () => {
describe('removing an award', () => {
const mockData = { id: 1, name: 'thumbsup', user: { id: 1 } };
describe('success', () => {
@ -160,6 +182,9 @@ describe('Awards app actions', () => {
});
describe('error', () => {
const currentUserId = 1;
const name = 'thumbsup';
beforeEach(() => {
mock.onDelete(`${relativeRootUrl || ''}/awards/1`).reply(500);
});
@ -167,13 +192,13 @@ describe('Awards app actions', () => {
it('calls Sentry.captureException', async () => {
await testAction(
actions.toggleAward,
'thumbsup',
name,
{
path: '/awards',
currentUserId: 1,
currentUserId,
awards: [mockData],
},
[],
[makeOptimisticRemoveMutation(1), makeOptimisticAddMutation(1, name, currentUserId)],
[],
() => {
expect(Sentry.captureException).toHaveBeenCalled();