Skip to content

PR #805

PR #805 #277

GitHub Actions / test-results-test-results-gitlab-gitlab-ee-15.11.9-ee.0-Release succeeded Dec 2, 2024 in 1s

649 passed, 0 failed and 6 skipped

Tests passed successfully

Report Passed Failed Skipped Time
/home/runner/work/NGitLab/NGitLab/TestResults/_fv-az1116-309_2024-12-02_17_00_35.trx 156✅ 4s
/home/runner/work/NGitLab/NGitLab/TestResults/_fv-az1116-309_2024-12-02_17_00_42.trx 156✅ 7s
/home/runner/work/NGitLab/NGitLab/TestResults/_fv-az1116-309_2024-12-02_17_01_09.trx 337✅ 6⚪ 691s

✅ /home/runner/work/NGitLab/NGitLab/TestResults/_fv-az1116-309_2024-12-02_17_00_35.trx

156 tests were completed in 4s with 156 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
NGitLab.Mock.Tests.BotUserTests 2✅ 61ms
NGitLab.Mock.Tests.BranchesMockTests 1✅ 159ms
NGitLab.Mock.Tests.CommitsMockTests 11✅ 213ms
NGitLab.Mock.Tests.ConfigTests 3✅ 283ms
NGitLab.Mock.Tests.GitLabClientMockTest 27✅ 21ms
NGitLab.Mock.Tests.GroupsMockTests 24✅ 111ms
NGitLab.Mock.Tests.IssuesMockTests 5✅ 33ms
NGitLab.Mock.Tests.LabelsMockTests 7✅ 10ms
NGitLab.Mock.Tests.LintCITests 3✅ 5ms
NGitLab.Mock.Tests.MembersMockTests 7✅ 51ms
NGitLab.Mock.Tests.MergeRequestsMockTests 16✅ 378ms
NGitLab.Mock.Tests.MilestonesMockTests 7✅ 26ms
NGitLab.Mock.Tests.PipelineTests 6✅ 54ms
NGitLab.Mock.Tests.ProjectsMockTests 19✅ 902ms
NGitLab.Mock.Tests.ReleasesMockTests 4✅ 58ms
NGitLab.Mock.Tests.RepositoryMockTests 7✅ 85ms
NGitLab.Mock.Tests.TagTests 1✅ 16ms
NGitLab.Mock.Tests.UsingVerify.RepositoryMockTests 6✅ 294ms

✅ NGitLab.Mock.Tests.BotUserTests

✅ Test_group_bot_user
✅ Test_project_bot_user

✅ NGitLab.Mock.Tests.BranchesMockTests

✅ Test_search_branches

✅ NGitLab.Mock.Tests.CommitsMockTests

✅ Test_commit_with_file_in_subdirectory
✅ Test_commits_added_can_be_found
✅ Test_commits_can_be_cherry_pick
✅ Test_commits_with_tags_can_be_found
✅ Test_create_commit_on_empty_repo("main")
✅ Test_create_commit_on_empty_repo("other-than-main")
✅ Test_create_commit_with_existing_branch
✅ Test_create_commit_with_start_branch_and_start_sha
✅ Test_GetCommitsBetweenTwoRefs
✅ Test_tags_from_commit_can_be_found
✅ Test_two_branches_can_be_created_from_same_commit

✅ NGitLab.Mock.Tests.ConfigTests

✅ Test_config_can_be_serialized
✅ Test_job_ids_are_unique
✅ Test_server_can_be_saved_in_config

✅ NGitLab.Mock.Tests.GitLabClientMockTest

✅ Test_can_get_group_client(GetGroupBadgeClient)
✅ Test_can_get_group_client(GetGroupHooksClient)
✅ Test_can_get_group_client(GetGroupMilestone)
✅ Test_can_get_group_client(GetGroupSearchClient)
✅ Test_can_get_group_client(GetGroupVariableClient)
✅ Test_can_get_project_client(GetClusterClient)
✅ Test_can_get_project_client(GetCommits)
✅ Test_can_get_project_client(GetCommitStatus)
✅ Test_can_get_project_client(GetEnvironmentClient)
✅ Test_can_get_project_client(GetJobs)
✅ Test_can_get_project_client(GetMergeRequest)
✅ Test_can_get_project_client(GetMilestone)
✅ Test_can_get_project_client(GetPipelines)
✅ Test_can_get_project_client(GetPipelineSchedules)
✅ Test_can_get_project_client(GetProjectBadgeClient)
✅ Test_can_get_project_client(GetProjectEvents)
✅ Test_can_get_project_client(GetProjectIssueNoteClient)
✅ Test_can_get_project_client(GetProjectLevelApprovalRulesClient)
✅ Test_can_get_project_client(GetProjectSearchClient)
✅ Test_can_get_project_client(GetProjectVariableClient)
✅ Test_can_get_project_client(GetProtectedBranchClient)
✅ Test_can_get_project_client(GetProtectedTagClient)
✅ Test_can_get_project_client(GetReleases)
✅ Test_can_get_project_client(GetRepository)
✅ Test_can_get_project_client(GetTriggers)
✅ Test_can_get_project_client(GetWikiClient)
✅ Test_getting_MergeRequestClient_for_group_is_not_implemented

✅ NGitLab.Mock.Tests.GroupsMockTests

✅ Test_create_update_delete_group_hooks
✅ Test_get_groups_with_top_level_only_ignores_subgroups
✅ Test_get_subgroups_by_fullpath
✅ Test_get_subgroups_by_id
✅ Test_get_subgroups_descendants_by_fullpath
✅ Test_get_subgroups_descendants_by_id
✅ Test_get_subgroups_descendants_of_subgroup_by_fullpath
✅ Test_get_subgroups_descendants_of_subgroup_by_id
✅ Test_group_created_at_date
✅ Test_group_get_by_fullpath
✅ Test_group_get_by_id
✅ Test_page_groups_first_page
✅ Test_page_groups_last_page
✅ Test_page_groups_with_invalid_perpage_throws
✅ Test_page_groups_with_page_0_returns_page_1
✅ Test_page_projects_first_page
✅ Test_page_projects_in_subgroup
✅ Test_page_projects_in_subgroup_with_descendants
✅ Test_page_projects_in_subgroup_with_no_projects
✅ Test_page_subgroups_with_descendants_after_last_page
✅ Test_page_subgroups_with_descendants_first_page
✅ Test_page_subgroups_with_descendants_last_page
✅ Test_page_subgroups_with_invalid_perpage_throws
✅ Test_page_subgroups_with_page_0_returns_page_1

✅ NGitLab.Mock.Tests.IssuesMockTests

✅ Test_issue_by_id_can_be_found
✅ Test_issue_resource_milestone_events_can_be_found
✅ Test_issues_assigned_to_me_can_be_listed
✅ Test_issues_assignee_not_throwing_when_assignees_is_null
✅ Test_issues_created_by_me_can_be_listed

✅ NGitLab.Mock.Tests.LabelsMockTests

✅ Test_labels_can_be_added_to_group
✅ Test_labels_can_be_added_to_project
✅ Test_labels_can_be_deleted_from_project
✅ Test_labels_can_be_edited_from_group
✅ Test_labels_can_be_edited_from_project
✅ Test_labels_can_be_found_from_group
✅ Test_labels_can_be_found_from_project

✅ NGitLab.Mock.Tests.LintCITests

✅ Test_GetLintCIByRef("dummy","Reference not found")
✅ Test_GetLintCIByRef("main","Pipeline filtered out by workflow rules.")
✅ Test_GetLintCIByRef(null,"Pipeline filtered out by workflow rules.")

✅ NGitLab.Mock.Tests.MembersMockTests

✅ Test_members_async_methods_simulate_gitlab_behavior
✅ Test_members_group_all_direct(False)
✅ Test_members_group_all_direct(True)
✅ Test_members_group_all_inherited
✅ Test_members_project_all_direct(False)
✅ Test_members_project_all_direct(True)
✅ Test_members_project_all_inherited

✅ NGitLab.Mock.Tests.MergeRequestsMockTests

✅ Test_create_merge_request_without_target_project_id
✅ Test_merge_request_resource_label_events_found
✅ Test_merge_request_resource_milestone_events_found
✅ Test_merge_request_resource_state_events_found_on_close_and_reopen
✅ Test_merge_request_with_conflicts_cannot_be_accepted(False)
✅ Test_merge_request_with_conflicts_cannot_be_accepted(True)
✅ Test_merge_request_with_head_pipeline
✅ Test_merge_request_with_no_rebase_required_can_be_accepted(False)
✅ Test_merge_request_with_no_rebase_required_can_be_accepted(True)
✅ Test_merge_request_with_non_conflicting_rebase_needed_and_merge_method_ff_cannot_be_accepted(False)
✅ Test_merge_request_with_non_conflicting_rebase_needed_and_merge_method_ff_cannot_be_accepted(True)
✅ Test_merge_requests_approvable_by_me_can_be_listed
✅ Test_merge_requests_assigned_to_me_can_be_listed
✅ Test_merge_requests_assignee_should_update_assignees_and_vice_versa
✅ Test_merge_requests_can_be_listed_when_assignee_not_set
✅ Test_merge_requests_created_by_me_can_be_listed

✅ NGitLab.Mock.Tests.MilestonesMockTests

✅ Test_groups_merge_request_can_be_found_from_milestone
✅ Test_milestones_can_be_added_to_project
✅ Test_milestones_can_be_closed_and_activated_from_project
✅ Test_milestones_can_be_deleted_from_project
✅ Test_milestones_can_be_edited_from_project
✅ Test_milestones_can_be_found_from_project
✅ Test_projects_merge_request_can_be_found_from_milestone

✅ NGitLab.Mock.Tests.PipelineTests

✅ Test_create_pipeline_with_branch_ref_sets_sha(False)
✅ Test_create_pipeline_with_branch_ref_sets_sha(True)
✅ Test_create_pipeline_with_invalid_ref_does_not_set_sha
✅ Test_create_pipeline_with_tag_ref_sets_sha
✅ Test_pipelines
✅ Test_pipelines_testreport_summary

✅ NGitLab.Mock.Tests.ProjectsMockTests

✅ CreateAsync_WhenInitializeWithReadmeIsFalse_ItIgnoresDefaultBranch
✅ CreateAsync_WhenMockCreatedWithSupportedOptions_TheyAreAvailableInModel
✅ CreateAsync_WhenProjectNameAlreadyExists_ItThrows
✅ CreateAsync_WhenProjectNameOfDifferentCaseAlreadyExists_ItWorks
✅ CreateAsync_WhenProjectPathAlreadyExists_ItThrows
✅ DeleteAsync_WhenProjectExists_ItIsDeleted
✅ DeleteAsync_WhenProjectNotFound_ItThrows
✅ Test_empty_repo
✅ Test_get_languages
✅ Test_project_can_be_cloned_by_default
✅ Test_project_permissions_maintainer_with_project_access
✅ Test_project_permissions_with_group_access
✅ Test_project_permissions_with_no_access
✅ Test_project_with_nested_submodules
✅ Test_project_with_submodules
✅ Test_projects_created_can_be_found
✅ Test_projects_created_url_ends_with_namespace_and_name
✅ UpdateAsync_WhenProjectNotFound_ItThrows
✅ WithProjectHelper_WhenPathNotSpecified_ItAutogeneratesPathFromName

✅ NGitLab.Mock.Tests.ReleasesMockTests

✅ Test_release
✅ Test_release_orderBy
✅ Test_release_page
✅ Test_release_sort

✅ NGitLab.Mock.Tests.RepositoryMockTests

✅ Test_create_a_new_commit_on_existing_branch
✅ Test_create_a_new_commit_on_new_branch_with_start_branch
✅ Test_create_a_new_commit_on_new_branch_with_start_sha
✅ Test_create_a_new_commit_on_nonexistent_branch
✅ Test_create_a_new_commit_with_start_branch_fails_if_branch_already_exists
✅ Test_create_a_new_commit_with_start_sha_fails_if_branch_already_exists
✅ Test_create_commit_in_new_branch_fails_if_both_start_branch_and_sha_specified

✅ NGitLab.Mock.Tests.TagTests

✅ GetTagAsync

✅ NGitLab.Mock.Tests.UsingVerify.RepositoryMockTests

✅ Test_get_raw_blob_content
✅ Test_get_tree_item_has_id_and_mode
✅ Test_get_tree_item_in_sub_folder
✅ Test_get_tree_not_in_main_branch
✅ Test_get_tree_when_subdirectory_does_not_exist_throws_not_found
✅ Test_get_tree_with_recurse

✅ /home/runner/work/NGitLab/NGitLab/TestResults/_fv-az1116-309_2024-12-02_17_00_42.trx

156 tests were completed in 7s with 156 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
NGitLab.Mock.Tests.BotUserTests 2✅ 78ms
NGitLab.Mock.Tests.BranchesMockTests 1✅ 162ms
NGitLab.Mock.Tests.CommitsMockTests 11✅ 359ms
NGitLab.Mock.Tests.ConfigTests 3✅ 512ms
NGitLab.Mock.Tests.GitLabClientMockTest 27✅ 21ms
NGitLab.Mock.Tests.GroupsMockTests 24✅ 196ms
NGitLab.Mock.Tests.IssuesMockTests 5✅ 172ms
NGitLab.Mock.Tests.LabelsMockTests 7✅ 10ms
NGitLab.Mock.Tests.LintCITests 3✅ 7ms
NGitLab.Mock.Tests.MembersMockTests 7✅ 47ms
NGitLab.Mock.Tests.MergeRequestsMockTests 16✅ 460ms
NGitLab.Mock.Tests.MilestonesMockTests 7✅ 60ms
NGitLab.Mock.Tests.PipelineTests 6✅ 125ms
NGitLab.Mock.Tests.ProjectsMockTests 19✅ 851ms
NGitLab.Mock.Tests.ReleasesMockTests 4✅ 64ms
NGitLab.Mock.Tests.RepositoryMockTests 7✅ 120ms
NGitLab.Mock.Tests.TagTests 1✅ 15ms
NGitLab.Mock.Tests.UsingVerify.RepositoryMockTests 6✅ 388ms

✅ NGitLab.Mock.Tests.BotUserTests

✅ Test_group_bot_user
✅ Test_project_bot_user

✅ NGitLab.Mock.Tests.BranchesMockTests

✅ Test_search_branches

✅ NGitLab.Mock.Tests.CommitsMockTests

✅ Test_commit_with_file_in_subdirectory
✅ Test_commits_added_can_be_found
✅ Test_commits_can_be_cherry_pick
✅ Test_commits_with_tags_can_be_found
✅ Test_create_commit_on_empty_repo("main")
✅ Test_create_commit_on_empty_repo("other-than-main")
✅ Test_create_commit_with_existing_branch
✅ Test_create_commit_with_start_branch_and_start_sha
✅ Test_GetCommitsBetweenTwoRefs
✅ Test_tags_from_commit_can_be_found
✅ Test_two_branches_can_be_created_from_same_commit

✅ NGitLab.Mock.Tests.ConfigTests

✅ Test_config_can_be_serialized
✅ Test_job_ids_are_unique
✅ Test_server_can_be_saved_in_config

✅ NGitLab.Mock.Tests.GitLabClientMockTest

✅ Test_can_get_group_client(GetGroupBadgeClient)
✅ Test_can_get_group_client(GetGroupHooksClient)
✅ Test_can_get_group_client(GetGroupMilestone)
✅ Test_can_get_group_client(GetGroupSearchClient)
✅ Test_can_get_group_client(GetGroupVariableClient)
✅ Test_can_get_project_client(GetClusterClient)
✅ Test_can_get_project_client(GetCommits)
✅ Test_can_get_project_client(GetCommitStatus)
✅ Test_can_get_project_client(GetEnvironmentClient)
✅ Test_can_get_project_client(GetJobs)
✅ Test_can_get_project_client(GetMergeRequest)
✅ Test_can_get_project_client(GetMilestone)
✅ Test_can_get_project_client(GetPipelines)
✅ Test_can_get_project_client(GetPipelineSchedules)
✅ Test_can_get_project_client(GetProjectBadgeClient)
✅ Test_can_get_project_client(GetProjectEvents)
✅ Test_can_get_project_client(GetProjectIssueNoteClient)
✅ Test_can_get_project_client(GetProjectLevelApprovalRulesClient)
✅ Test_can_get_project_client(GetProjectSearchClient)
✅ Test_can_get_project_client(GetProjectVariableClient)
✅ Test_can_get_project_client(GetProtectedBranchClient)
✅ Test_can_get_project_client(GetProtectedTagClient)
✅ Test_can_get_project_client(GetReleases)
✅ Test_can_get_project_client(GetRepository)
✅ Test_can_get_project_client(GetTriggers)
✅ Test_can_get_project_client(GetWikiClient)
✅ Test_getting_MergeRequestClient_for_group_is_not_implemented

✅ NGitLab.Mock.Tests.GroupsMockTests

✅ Test_create_update_delete_group_hooks
✅ Test_get_groups_with_top_level_only_ignores_subgroups
✅ Test_get_subgroups_by_fullpath
✅ Test_get_subgroups_by_id
✅ Test_get_subgroups_descendants_by_fullpath
✅ Test_get_subgroups_descendants_by_id
✅ Test_get_subgroups_descendants_of_subgroup_by_fullpath
✅ Test_get_subgroups_descendants_of_subgroup_by_id
✅ Test_group_created_at_date
✅ Test_group_get_by_fullpath
✅ Test_group_get_by_id
✅ Test_page_groups_first_page
✅ Test_page_groups_last_page
✅ Test_page_groups_with_invalid_perpage_throws
✅ Test_page_groups_with_page_0_returns_page_1
✅ Test_page_projects_first_page
✅ Test_page_projects_in_subgroup
✅ Test_page_projects_in_subgroup_with_descendants
✅ Test_page_projects_in_subgroup_with_no_projects
✅ Test_page_subgroups_with_descendants_after_last_page
✅ Test_page_subgroups_with_descendants_first_page
✅ Test_page_subgroups_with_descendants_last_page
✅ Test_page_subgroups_with_invalid_perpage_throws
✅ Test_page_subgroups_with_page_0_returns_page_1

✅ NGitLab.Mock.Tests.IssuesMockTests

✅ Test_issue_by_id_can_be_found
✅ Test_issue_resource_milestone_events_can_be_found
✅ Test_issues_assigned_to_me_can_be_listed
✅ Test_issues_assignee_not_throwing_when_assignees_is_null
✅ Test_issues_created_by_me_can_be_listed

✅ NGitLab.Mock.Tests.LabelsMockTests

✅ Test_labels_can_be_added_to_group
✅ Test_labels_can_be_added_to_project
✅ Test_labels_can_be_deleted_from_project
✅ Test_labels_can_be_edited_from_group
✅ Test_labels_can_be_edited_from_project
✅ Test_labels_can_be_found_from_group
✅ Test_labels_can_be_found_from_project

✅ NGitLab.Mock.Tests.LintCITests

✅ Test_GetLintCIByRef("dummy","Reference not found")
✅ Test_GetLintCIByRef("main","Pipeline filtered out by workflow rules.")
✅ Test_GetLintCIByRef(null,"Pipeline filtered out by workflow rules.")

✅ NGitLab.Mock.Tests.MembersMockTests

✅ Test_members_async_methods_simulate_gitlab_behavior
✅ Test_members_group_all_direct(False)
✅ Test_members_group_all_direct(True)
✅ Test_members_group_all_inherited
✅ Test_members_project_all_direct(False)
✅ Test_members_project_all_direct(True)
✅ Test_members_project_all_inherited

✅ NGitLab.Mock.Tests.MergeRequestsMockTests

✅ Test_create_merge_request_without_target_project_id
✅ Test_merge_request_resource_label_events_found
✅ Test_merge_request_resource_milestone_events_found
✅ Test_merge_request_resource_state_events_found_on_close_and_reopen
✅ Test_merge_request_with_conflicts_cannot_be_accepted(False)
✅ Test_merge_request_with_conflicts_cannot_be_accepted(True)
✅ Test_merge_request_with_head_pipeline
✅ Test_merge_request_with_no_rebase_required_can_be_accepted(False)
✅ Test_merge_request_with_no_rebase_required_can_be_accepted(True)
✅ Test_merge_request_with_non_conflicting_rebase_needed_and_merge_method_ff_cannot_be_accepted(False)
✅ Test_merge_request_with_non_conflicting_rebase_needed_and_merge_method_ff_cannot_be_accepted(True)
✅ Test_merge_requests_approvable_by_me_can_be_listed
✅ Test_merge_requests_assigned_to_me_can_be_listed
✅ Test_merge_requests_assignee_should_update_assignees_and_vice_versa
✅ Test_merge_requests_can_be_listed_when_assignee_not_set
✅ Test_merge_requests_created_by_me_can_be_listed

✅ NGitLab.Mock.Tests.MilestonesMockTests

✅ Test_groups_merge_request_can_be_found_from_milestone
✅ Test_milestones_can_be_added_to_project
✅ Test_milestones_can_be_closed_and_activated_from_project
✅ Test_milestones_can_be_deleted_from_project
✅ Test_milestones_can_be_edited_from_project
✅ Test_milestones_can_be_found_from_project
✅ Test_projects_merge_request_can_be_found_from_milestone

✅ NGitLab.Mock.Tests.PipelineTests

✅ Test_create_pipeline_with_branch_ref_sets_sha(False)
✅ Test_create_pipeline_with_branch_ref_sets_sha(True)
✅ Test_create_pipeline_with_invalid_ref_does_not_set_sha
✅ Test_create_pipeline_with_tag_ref_sets_sha
✅ Test_pipelines
✅ Test_pipelines_testreport_summary

✅ NGitLab.Mock.Tests.ProjectsMockTests

✅ CreateAsync_WhenInitializeWithReadmeIsFalse_ItIgnoresDefaultBranch
✅ CreateAsync_WhenMockCreatedWithSupportedOptions_TheyAreAvailableInModel
✅ CreateAsync_WhenProjectNameAlreadyExists_ItThrows
✅ CreateAsync_WhenProjectNameOfDifferentCaseAlreadyExists_ItWorks
✅ CreateAsync_WhenProjectPathAlreadyExists_ItThrows
✅ DeleteAsync_WhenProjectExists_ItIsDeleted
✅ DeleteAsync_WhenProjectNotFound_ItThrows
✅ Test_empty_repo
✅ Test_get_languages
✅ Test_project_can_be_cloned_by_default
✅ Test_project_permissions_maintainer_with_project_access
✅ Test_project_permissions_with_group_access
✅ Test_project_permissions_with_no_access
✅ Test_project_with_nested_submodules
✅ Test_project_with_submodules
✅ Test_projects_created_can_be_found
✅ Test_projects_created_url_ends_with_namespace_and_name
✅ UpdateAsync_WhenProjectNotFound_ItThrows
✅ WithProjectHelper_WhenPathNotSpecified_ItAutogeneratesPathFromName

✅ NGitLab.Mock.Tests.ReleasesMockTests

✅ Test_release
✅ Test_release_orderBy
✅ Test_release_page
✅ Test_release_sort

✅ NGitLab.Mock.Tests.RepositoryMockTests

✅ Test_create_a_new_commit_on_existing_branch
✅ Test_create_a_new_commit_on_new_branch_with_start_branch
✅ Test_create_a_new_commit_on_new_branch_with_start_sha
✅ Test_create_a_new_commit_on_nonexistent_branch
✅ Test_create_a_new_commit_with_start_branch_fails_if_branch_already_exists
✅ Test_create_a_new_commit_with_start_sha_fails_if_branch_already_exists
✅ Test_create_commit_in_new_branch_fails_if_both_start_branch_and_sha_specified

✅ NGitLab.Mock.Tests.TagTests

✅ GetTagAsync

✅ NGitLab.Mock.Tests.UsingVerify.RepositoryMockTests

✅ Test_get_raw_blob_content
✅ Test_get_tree_item_has_id_and_mode
✅ Test_get_tree_item_in_sub_folder
✅ Test_get_tree_not_in_main_branch
✅ Test_get_tree_when_subdirectory_does_not_exist_throws_not_found
✅ Test_get_tree_with_recurse

✅ /home/runner/work/NGitLab/NGitLab/TestResults/_fv-az1116-309_2024-12-02_17_01_09.trx

343 tests were completed in 691s with 337 passed, 0 failed and 6 skipped.

Test suite Passed Failed Skipped Time
NGitLab.Tests.APITests 1✅ 28s
NGitLab.Tests.AsyncApiValidation 1✅ 8ms
NGitLab.Tests.BranchClientTests 2✅ 5s
NGitLab.Tests.CommitStatusTests 9✅ 10s
NGitLab.Tests.CommitsTests 13✅ 20s
NGitLab.Tests.CompareTests 3✅ 4s
NGitLab.Tests.ContributorsTests 2✅ 3s
NGitLab.Tests.EnvironmentsTests 8✅ 4s
NGitLab.Tests.EventTests 2✅ 912ms
NGitLab.Tests.Extensions.FunctionRetryExtensionsTests 2✅ 237ms
NGitLab.Tests.FilesTests 6✅ 5s
NGitLab.Tests.GitLabChangeDiffCounterTests 1✅ 1ms
NGitLab.Tests.GitLabCredentialsTests 6✅ 1ms
NGitLab.Tests.GraphQLTests 2✅ 591ms
NGitLab.Tests.GroupBadgeClientTests 1✅ 602ms
NGitLab.Tests.GroupHooksClientTests 1✅ 834ms
NGitLab.Tests.GroupsTests 42✅ 30s
NGitLab.Tests.GroupVariableClientTests 2✅ 995ms
NGitLab.Tests.HttpRequestorTests 6✅ 2s
NGitLab.Tests.Impl.DynamicEnumTests 1✅ 1ms
NGitLab.Tests.Impl.JsonConverterTests 8✅ 10ms
NGitLab.Tests.Impl.SimpleJsonTests 3✅ 9ms
NGitLab.Tests.Impl.UtilsTests 2✅ 1ms
NGitLab.Tests.Impl.WebHeadersDictionaryAdaptorTests 4✅ 3ms
NGitLab.Tests.IssueTests 15✅ 11s
NGitLab.Tests.JobTests 10✅ 77s
NGitLab.Tests.JsonTests 8✅ 12ms
NGitLab.Tests.LintClientTests 4✅ 2s
NGitLab.Tests.MembersClientTests 7✅ 6s
NGitLab.Tests.MergeRequestChangesClientTests 1✅ 4s
NGitLab.Tests.MergeRequestClientTests 12✅ 1⚪ 76s
NGitLab.Tests.MergeRequestCommentsClientTests 3✅ 7s
NGitLab.Tests.MergeRequestDiscussionsClientTests 6✅ 14s
NGitLab.Tests.Milestone.MilestoneClientTests 4✅ 6s
NGitLab.Tests.NamespacesTests 4✅ 8s
NGitLab.Tests.PipelineTests 10✅ 1⚪ 79s
NGitLab.Tests.ProjectBadgeClientTests 1✅ 648ms
NGitLab.Tests.ProjectIssueNoteTests 2✅ 1s
NGitLab.Tests.ProjectLevelApprovalRulesClientTests 4⚪ 134ms
NGitLab.Tests.ProjectsTests 42✅ 33s
NGitLab.Tests.ProjectVariableClientTests 2✅ 1s
NGitLab.Tests.ProtectedBranchTests 1✅ 2s
NGitLab.Tests.ProtectedTagTests 1✅ 2s
NGitLab.Tests.Release.ReleaseClientTests 2✅ 4s
NGitLab.Tests.RepositoryClient.BranchClientTests 4✅ 6s
NGitLab.Tests.RepositoryClient.ProjectHooksClientTests 1✅ 506ms
NGitLab.Tests.RepositoryClient.RepositoryClientTests 25✅ 33s
NGitLab.Tests.RunnerTests 6✅ 11s
NGitLab.Tests.Sha1Tests 5✅ 1ms
NGitLab.Tests.SnippetsTest 4✅ 4s
NGitLab.Tests.TagTests 12✅ 19s
NGitLab.Tests.TriggerTests 1✅ 419ms
NGitLab.Tests.UsersTests 15✅ 160s
NGitLab.Tests.WikiTests 1✅ 1s

✅ NGitLab.Tests.APITests

✅ Test_the_exception_does_not_contain_the_password_on_connection_error

✅ NGitLab.Tests.AsyncApiValidation

✅ ValidateAsyncMethodSignature

✅ NGitLab.Tests.BranchClientTests

✅ Test_CommitInfoIsCorrectlyDeserialized
✅ Test_search_branches

✅ NGitLab.Tests.CommitStatusTests

✅ Test_get_commit_status
✅ Test_post_commit_status_and_update_it_from_canceled_to_pending
✅ Test_post_commit_status_and_update_it_from_pending_to_canceled
✅ Test_post_commit_status_and_update_it_from_pending_to_failed
✅ Test_post_commit_status_and_update_it_from_pending_to_running_to_success
✅ Test_post_commit_status_and_update_it_from_success_to_canceled
✅ Test_post_commit_status_and_update_it_from_success_to_failed
✅ Test_post_commit_status_and_update_it_from_success_to_pending
✅ Test_post_commit_status_with_no_coverage

✅ NGitLab.Tests.CommitsTests

✅ Test_can_cherry_pick_commit
✅ Test_can_get_commit
✅ Test_can_get_merge_request_associated_to_commit
✅ Test_can_get_stats_in_commit
✅ Test_commit_can_be_created_from_sha
✅ Test_commit_can_set_executable_flag
✅ Test_create_a_new_commit_with_start_branch_fails_if_branch_already_exists
✅ Test_create_a_new_commit_with_start_sha_fails_if_branch_already_exists
✅ Test_create_commit_in_new_branch_can_create_branch(False)
✅ Test_create_commit_in_new_branch_can_create_branch(True)
✅ Test_create_commit_in_new_branch_fails_if_both_start_branch_and_sha_specified
✅ Test_create_commit_on_empty_repo
✅ Test_create_commit_on_nonexistent_branch_fails_when_neither_start_branch_nor_start_sha_specified

✅ NGitLab.Tests.CompareTests

✅ Test_compare
✅ Test_compare_equal
✅ Test_compare_invalid

✅ NGitLab.Tests.ContributorsTests

✅ Test_can_get_contributors
✅ Test_can_get_MultipleContributors

✅ NGitLab.Tests.EnvironmentsTests

✅ CreateAndGetAll
✅ Delete
✅ Edit
✅ GetById
✅ QueryByName
✅ QueryBySearch
✅ QueryByState
✅ Stop

✅ NGitLab.Tests.EventTests

✅ Test_get_global_events_works
✅ Test_get_user_events_works

✅ NGitLab.Tests.Extensions.FunctionRetryExtensionsTests

✅ Test_methods_dont_fail_dont_retry
✅ Test_methods_retry_fail_retry_two_time

✅ NGitLab.Tests.FilesTests

✅ Test_add_update_delete_get_and_exists_file
✅ Test_add_update_delete_get_and_exists_file_async
✅ Test_blame_comparison
✅ Test_get_blame_of_an_old_commit
✅ Test_get_blame_of_latest_commit
✅ Test_get_file_with_bom

✅ NGitLab.Tests.GitLabChangeDiffCounterTests

✅ Compute_return_diffs_stats

✅ NGitLab.Tests.GitLabCredentialsTests

✅ Constructor_should_complete_api_version_when_not_set("https://test","https://test")
✅ Constructor_should_complete_api_version_when_not_set("https://test/","https://test")
✅ Constructor_should_complete_api_version_when_not_set("https://test/api/v4","https://test")
✅ Constructor_should_complete_api_version_when_not_set("https://test/api/v4/","https://test")
✅ Constructor_should_reject_apiv3("https://test/api/v3")
✅ Constructor_should_reject_apiv3("https://test/api/v3/")

✅ NGitLab.Tests.GraphQLTests

✅ Test_get_project
✅ Test_invalid_request

✅ NGitLab.Tests.GroupBadgeClientTests

✅ Test_group_badges

✅ NGitLab.Tests.GroupHooksClientTests

✅ Test_create_update_delete_group_hook

✅ NGitLab.Tests.GroupsTests

✅ Test_create_delete_group
✅ Test_get_by_group_query_groupQuery_AllAvailable_returns_groups
✅ Test_get_by_group_query_groupQuery_MinAccessLevel_returns_groups
✅ Test_get_by_group_query_groupQuery_OrderBy_returns_groups
✅ Test_get_by_group_query_groupQuery_Owned_returns_groups
✅ Test_get_by_group_query_groupQuery_Search_returns_groups
✅ Test_get_by_group_query_groupQuery_SkipGroups_returns_groups
✅ Test_get_by_group_query_groupQuery_Sort_returns_groups
✅ Test_get_by_group_query_groupQuery_Statistics_returns_groups
✅ Test_get_by_group_query_groupQuery_WithCustomAttributes_returns_groups
✅ Test_get_by_group_query_nulls_does_not_throws
✅ Test_get_group_by_fullpath
✅ Test_get_subgroups_by_fullpath
✅ Test_get_subgroups_by_fullpath_groupQuery_MinAccessLevel_returns_groups
✅ Test_get_subgroups_by_fullpath_groupQuery_OrderBy_returns_groups
✅ Test_get_subgroups_by_fullpath_groupQuery_Owned_returns_groups
✅ Test_get_subgroups_by_fullpath_groupQuery_Search_returns_groups
✅ Test_get_subgroups_by_fullpath_groupQuery_Sort_returns_groups
✅ Test_get_subgroups_by_fullpath_groupQuery_Statistics_returns_groups
✅ Test_get_subgroups_by_fullpath_groupQuery_WithCustomAttributes_returns_groups
✅ Test_get_subgroups_by_fullpath_query_groupQuery_AllAvailable_returns_groups
✅ Test_get_subgroups_by_fullpath_SkipGroups_returns_groups
✅ Test_get_subgroups_by_id
✅ Test_get_subgroups_by_id_groupQuery_AllAvailable_returns_groups
✅ Test_get_subgroups_by_id_groupQuery_MinAccessLevel_returns_groups
✅ Test_get_subgroups_by_id_groupQuery_OrderBy_returns_groups
✅ Test_get_subgroups_by_id_groupQuery_Owned_returns_groups
✅ Test_get_subgroups_by_id_groupQuery_Search_returns_groups
✅ Test_get_subgroups_by_id_groupQuery_Sort_returns_groups
✅ Test_get_subgroups_by_id_groupQuery_Statistics_returns_groups
✅ Test_get_subgroups_by_id_groupQuery_WithCustomAttributes_returns_groups
✅ Test_get_subgroups_by_id_SkipGroups_returns_groups
✅ Test_group_created_on_date_is_now
✅ Test_group_projects_query_returns_archived
✅ Test_group_projects_query_returns_searched_project
✅ Test_groups_is_not_empty
✅ Test_page_group_projects_returns_expected_pages
✅ Test_page_group_query_TopLevelOnly_does_not_return_children
✅ Test_page_group_returns_expected_pages
✅ Test_page_subgroup_including_descendants_returns_expected_pages
✅ Test_page_subgroup_returns_expected_pages
✅ Test_projects_are_set_in_a_group_by_id

✅ NGitLab.Tests.GroupVariableClientTests

✅ Test_group_variables
✅ Test_group_variables_with_complete_members

✅ NGitLab.Tests.HttpRequestorTests

✅ Test_authorization_header_uses_bearer
✅ Test_calls_are_retried_when_they_fail_in_gitlab
✅ Test_impersonation_via_sudo_and_user_id
✅ Test_impersonation_via_sudo_and_username
✅ Test_request_options_sudo_transferred_to_request_header
✅ Test_the_timeout_can_be_overridden_in_the_request_options

✅ NGitLab.Tests.Impl.DynamicEnumTests

✅ Test_comparison

✅ NGitLab.Tests.Impl.JsonConverterTests

✅ Test_DeserializeNullToSupportedValueType_Succeeds
✅ Test_DeserializeNullToUnsupportedValueType_Throws
✅ Test_DeserializeStringToDateTime_SupportsMultipleFormats("2022-01-12",Unspecified)
✅ Test_DeserializeStringToDateTime_SupportsMultipleFormats("2022-01-12T22:49:21.552+00:00",Utc)
✅ Test_DeserializeStringToDateTime_SupportsMultipleFormats("2022-01-12T22:49:21.552Z",Utc)
✅ Test_DeserializeStringToDouble_Succeeds
✅ Test_DeserializeStringToInt32
✅ Test_DeserializeStringToInt64_Succeeds

✅ NGitLab.Tests.Impl.SimpleJsonTests

✅ Test_basic_field
✅ Test_dynamic_enums_fill_the_enum_value_when_the_enum_is_unknown
✅ Test_dynamic_enums_fill_the_string_value_when_the_enum_is_unknown

✅ NGitLab.Tests.Impl.UtilsTests

✅ AddParameter_ConsidersEnumMemberAttribute(Accepted,"Accepted")
✅ AddParameter_ConsidersEnumMemberAttribute(PushedTo,"pushed+to")

✅ NGitLab.Tests.Impl.WebHeadersDictionaryAdaptorTests

✅ Test_empty_and_null_header_values_works_correctly
✅ Test_empty_header_collection_works_correctly
✅ Test_multiple_header_collection_works_correctly
✅ Test_single_header_collection_works_correctly

✅ NGitLab.Tests.IssueTests

✅ Test_get_all_project_issues
✅ Test_get_all_resource_label_events
✅ Test_get_all_resource_milestone_events
✅ Test_get_assigned_issues_with_IssueQuery
✅ Test_get_assigned_issues_with_IssueQuery_and_project_id
✅ Test_get_confidential_issues_with_IssueQuery
✅ Test_get_issue_by_id
✅ Test_get_issue_with_IssueQuery
✅ Test_get_issues_no_confidential_filter_with_IssueQuery
✅ Test_get_issues_with_invalid_project_id_will_throw
✅ Test_get_linked_issue
✅ Test_get_new_and_updated_issue_with_duedate
✅ Test_get_non_confidential_issues_with_IssueQuery
✅ Test_get_unassigned_issues_with_IssueQuery
✅ Test_getparticipants_issue

✅ NGitLab.Tests.JobTests

✅ Test_get_job_artifact
✅ Test_get_job_artifact_query
✅ Test_get_job_artifacts
✅ Test_get_job_from_id
✅ Test_get_job_trace
✅ Test_getjobs_all
✅ Test_getjobs_multiple_scopes
✅ Test_getjobs_scope
✅ Test_run_action_play
✅ Test_run_action_retry

✅ NGitLab.Tests.JsonTests

✅ DeserializeEnumWithEnumMemberAttribute_Ok("v1",Value1)
✅ DeserializeEnumWithEnumMemberAttribute_Ok("V1",Value1)
✅ DeserializeEnumWithEnumMemberAttribute_Ok("v2",Value2)
✅ DeserializeEnumWithEnumMemberAttribute_Ok("V2",Value2)
✅ DeserializeEnumWithEnumMemberAttribute_Ok("value2",Value2)
✅ DeserializeEnumWithEnumMemberAttribute_UnknownValues("dfsf")
✅ DeserializeNewerContract_Ok
✅ DeserializeOlderContract_Ok

✅ NGitLab.Tests.LintClientTests

✅ LintInvalidCIYaml
✅ LintInvalidProjectCIYaml
✅ LintValidCIProjectYaml
✅ LintValidCIYaml

✅ NGitLab.Tests.MembersClientTests

✅ AddMemberToGroup
✅ AddMemberToProject
✅ AsyncMethodsBehaveAsExpected
✅ GetAccessLevelMemberOfGroup
✅ GetAccessLevelMemberOfProject
✅ UpsertAccessLevelMemberOfGroup
✅ UpsertAccessLevelMemberOfProject

✅ NGitLab.Tests.MergeRequestChangesClientTests

✅ GetChangesOnMergeRequest

✅ NGitLab.Tests.MergeRequestClientTests

✅ Test_cancel_merge_when_pipeline_succeeds
✅ Test_get_assigned_merge_requests
✅ Test_get_unassigned_merge_requests
✅ Test_gitlab_returns_an_error_when_trying_to_create_a_request_with_same_source_and_destination
✅ Test_merge_request_api
⚪ Test_merge_request_approvers
✅ Test_merge_request_delete
✅ Test_merge_request_head_pipeline
✅ Test_merge_request_id_is_not_equal_to_iid
✅ Test_merge_request_rebase
✅ Test_merge_request_rebaseasync_skip_ci
✅ Test_merge_request_versions
✅ Test_set_reviewers_merge_requests

✅ NGitLab.Tests.MergeRequestCommentsClientTests

✅ AddCommentToMergeRequest_DeprecatedApi
✅ AddCommentToMergeRequestOnArchivedProject
✅ AddEditCommentToMergeRequest

✅ NGitLab.Tests.MergeRequestDiscussionsClientTests

✅ AddDiscussionToMergeRequest_DiscussionCreated
✅ AddDiscussionToMergeRequestOnArchivedProject
✅ DeleteOneNoteFromDiscussion_DiscussionAndNoteDeleted
✅ EditCommentFromDiscussion_CommentEdited
✅ GetDiscussion_DiscussionFound
✅ ResolveDiscussion_AllNotesResolved

✅ NGitLab.Tests.Milestone.MilestoneClientTests

✅ Test_group_milestone_api
✅ Test_group_milestone_merge_requests
✅ Test_project_milestone_api
✅ Test_project_milestone_merge_requests

✅ NGitLab.Tests.NamespacesTests

✅ Test_namespaces_contains_a_group
✅ Test_namespaces_contains_a_user
✅ Test_namespaces_search_for_group
✅ Test_namespaces_search_for_user

✅ NGitLab.Tests.PipelineTests

✅ Test_can_get_coverage
✅ Test_can_list_all_jobs_from_project
✅ Test_can_list_jobs_from_pipeline
✅ Test_can_list_the_pipelines
✅ Test_create_pipeline_with_testreports
✅ Test_create_pipeline_with_variables
✅ Test_delete_pipeline
✅ Test_get_triggered_pipeline_variables
✅ Test_retry
✅ Test_search_for_pipeline
⚪ Test_update_pipeline_metadata

✅ NGitLab.Tests.ProjectBadgeClientTests

✅ Test_project_badges

✅ NGitLab.Tests.ProjectIssueNoteTests

✅ CreateNote
✅ ListNotes

✅ NGitLab.Tests.ProjectLevelApprovalRulesClientTests

⚪ CreateApprovalRule
⚪ DeleteApprovalRule
⚪ GetApprovalRules
⚪ UpdateApprovalRule

✅ NGitLab.Tests.ProjectsTests

✅ CreateAsync_CreatesNewProject
✅ CreateAsync_WhenInitializeWithReadmeIsFalse_ItIgnoresDefaultBranch
✅ CreateAsync_WhenProjectAlreadyExists_ItThrows
✅ CreateProjectWithSquashOption(Always)
✅ CreateProjectWithSquashOption(DefaultOff)
✅ CreateProjectWithSquashOption(DefaultOn)
✅ CreateProjectWithSquashOption(Never)
✅ CreateProjectWithSquashOption(null)
✅ CreateUpdateDelete(False)
✅ CreateUpdateDelete(True)
✅ DeleteAsync_WhenProjectExists_ItIsDeleted
✅ DeleteAsync_WhenProjectNotFound_ItThrows
✅ ForkProject
✅ GetAccessibleProjects
✅ GetByNamespacedPathAsync
✅ GetOwnedProjects
✅ GetProjectAsync_WhenProjectDoesNotExist_ShouldThrowNotFound
✅ GetProjectAsync_WithPathAndWithoutQuery_ReturnsProject
✅ GetProjectAsync_WorksWithId_ReturnsProject
✅ GetProjectByIdAsync
✅ GetProjectByIdByQuery_Statistics
✅ GetProjectByTopics
✅ GetProjectLanguages
✅ GetProjectsAsync
✅ GetProjectsByLastActivity
✅ GetProjectsByQuery
✅ GetProjectsByQuery_VisibilityInternal
✅ GetProjectsCanSpecifyTheProjectPerPageCount
✅ GetProjectsProperties
✅ GetProjectsStatistics
✅ GetVisibleProjects
✅ IsEmpty
✅ SearchAsync_WhenNotFound_ReturnsEmptySet
✅ SearchAsync_WhenSearchForExistingProject_ItFindsIt
✅ Test_get_by_project_query_projectQuery_MinAccessLevel_returns_projects(Developer)
✅ Test_get_by_project_query_projectQuery_MinAccessLevel_returns_projects(Guest)
✅ Test_get_by_project_query_projectQuery_MinAccessLevel_returns_projects(Maintainer)
✅ Test_get_by_project_query_projectQuery_MinAccessLevel_returns_projects(Reporter)
✅ Test_project_groups_query_returns_ancestor_groups
✅ Test_project_groups_query_returns_searched_group
✅ UpdateAsync_WhenProjectNotFound_ItThrows
✅ UpdateAsync_WhenUpdateVisibilityAndTopics_ItWorks

✅ NGitLab.Tests.ProjectVariableClientTests

✅ Test_project_variables
✅ Test_project_variables_with_scope

✅ NGitLab.Tests.ProtectedBranchTests

✅ ProtectBranch_Test

✅ NGitLab.Tests.ProtectedTagTests

✅ ProtectTag_Test

✅ NGitLab.Tests.Release.ReleaseClientTests

✅ Test_release_api
✅ Test_release_links

✅ NGitLab.Tests.RepositoryClient.BranchClientTests

✅ AddDelete
✅ GetAll
✅ GetByName
✅ Test_that_branch_names_containing_slashes_are_supported

✅ NGitLab.Tests.RepositoryClient.ProjectHooksClientTests

✅ CreateUpdateDelete

✅ NGitLab.Tests.RepositoryClient.RepositoryClientTests

✅ GetAllCommits
✅ GetAllTreeObjectsAtInvalidPath
✅ GetAllTreeObjectsAtRoot(11)
✅ GetAllTreeObjectsAtRoot(4)
✅ GetAllTreeObjectsInPathOnRef
✅ GetAllTreeObjectsInPathWith100ElementsByPage
✅ GetAllTreeObjectsRecursivelyFromRoot(11)
✅ GetAllTreeObjectsRecursivelyFromRoot(4)
✅ GetAllTreeObjectsRecursivelyFromRootAsync(11)
✅ GetAllTreeObjectsRecursivelyFromRootAsync(4)
✅ GetAllTreeObjectsRecursivelyFromSubfolderAsync(11)
✅ GetAllTreeObjectsRecursivelyFromSubfolderAsync(4)
✅ GetArchive
✅ GetCommitByBranchName
✅ GetCommitBySha1
✅ GetCommitBySha1Range
✅ GetCommitDiff
✅ GetCommitRefs(All)
✅ GetCommitRefs(Branch)
✅ GetCommitRefs(Tag)
✅ GetCommitsDoesntIncludeSinceWhenNotSpecified
✅ GetCommitsDoesntIncludeUntilWhenNotSpecified
✅ GetCommitsSince
✅ GetCommitsUntil
✅ GetRawBlob

✅ NGitLab.Tests.RunnerTests

✅ Test_can_enable_and_disable_a_runner_on_a_project
✅ Test_can_find_a_runner_on_a_group
✅ Test_can_find_a_runner_on_a_project
✅ Test_can_register_and_delete_a_runner_on_a_group
✅ Test_Runner_Can_Be_Locked_And_Unlocked
✅ Test_Runner_Can_Update_RunUntagged_Flag

✅ NGitLab.Tests.Sha1Tests

✅ WhenNotEnoughtChars_ThenErrorThrown
✅ WhenSha1WithLeadingZero_ThenParsedCorrectly
✅ WhenSha1WithLowerCase_ThenParsedCorrectly
✅ WhenSha1WithUpperCase_ThenParsedCorrectly
✅ WhenToManyChars_ThenErrorThrown

✅ NGitLab.Tests.SnippetsTest

✅ Test_snippet_inProject(Internal)
✅ Test_snippet_inProject(Private)
✅ Test_snippet_inProject(Public)
✅ Test_snippet_public

✅ NGitLab.Tests.TagTests

✅ GetTag("v0.5",True)
✅ GetTag("v0.6",False)
✅ SearchTags(".[0-9]$",0)
✅ SearchTags(".5$",1)
✅ SearchTags("\\.5$",0)
✅ SearchTags("^v0.5",1)
✅ SearchTags("^v0",2)
✅ SearchTags("^v1",0)
✅ SearchTags("0.5$",1)
✅ SearchTags("0\\.",0)
✅ SearchTags("v1",0)
✅ Test_can_tag_a_project

✅ NGitLab.Tests.TriggerTests

✅ Test_can_get_triggers_for_project

✅ NGitLab.Tests.UsersTests

✅ CreateAsync
✅ CreateTokenAsAdmin_ReturnsUserToken
✅ CreateTokenAsyncAsAdmin_ReturnsUserToken
✅ CreateTokenAsyncAsAdmin_WhenUserNotFound_ItThrowsBadRequest
✅ CreateUpdateDelete
✅ DeactivatedAccountShouldBeAbleToActivate
✅ GetLastActivityDates
✅ GetLastActivityDates_UsingNonAdminCredentials
✅ GetLastActivityDatesFromTheFuture
✅ GetLastActivityDatesSinceYesterday
✅ GetUser
✅ GetUserByEmailDoesNotWorkOnNonAdminClient
✅ GetUserByEmailWorksOnAdminClient
✅ GetUsers
✅ Test_can_add_an_ssh_key_to_the_gitlab_profile

✅ NGitLab.Tests.WikiTests

✅ Test_wiki