diff --git a/files/GitLink编程夏令营(GLCC).md b/files/GitLink编程夏令营(GLCC).md new file mode 100644 index 0000000..4879099 --- /dev/null +++ b/files/GitLink编程夏令营(GLCC).md @@ -0,0 +1,4 @@ +GitLink编程夏令营(GLCC),是在CCF中国计算机学会指导下,由CCF开源发展委员会(CCF ODC)举办的面向全国高校学生的暑期编程活动。 +活动将覆盖近千所高校,并联合各大开源基金会、开源企业、开源社区、开源专家,旨在鼓励青年学生通过参加真实的开源软件开发,提升自身技术能力,为开源社区输送优秀人才。 +为青年学生提供开放友好的交流平台,希望进一步推动国内开源社区的繁荣发展。 + diff --git a/files/GitLink,新一代开源创新服务平台.txt b/files/GitLink,新一代开源创新服务平台.txt new file mode 100644 index 0000000..ad6050b --- /dev/null +++ b/files/GitLink,新一代开源创新服务平台.txt @@ -0,0 +1,12 @@ +基于Git打造分布式代码托管环境,提供免费公、私有代码仓库; + +支持在线文件编辑、代码分支管理、协作贡献统计、代码仓库复刻(Fork)、贡献合并请求(PR)、群智贡献审阅等功能; + + +提供疑修(Issue)、里程碑、通知提醒、标签归档等多样化任务管理工具,支持各类开发任务的发布、指派与跟踪; + +同时提供在线Wiki文档、组织多粒度管理等功能,为您搭建一站式的项目过程管理环境; + +让您的团队协作更高效、过程更透明! + +融合DevOps思想,提供轻量级的工作流引擎(Engine),打通编码、测试、构建、部署等开发运维环节;支持自定义配置、代码静态扫描、构建自动触发、容器镜像托管等功能,同时支持接入第三方运维工具。 \ No newline at end of file diff --git a/interface/gitlink/gitlink_login_oauth_token.yaml b/interface/gitlink/gitlink_login_oauth_token.yaml index 4811988..1df1fe2 100644 --- a/interface/gitlink/gitlink_login_oauth_token.yaml +++ b/interface/gitlink/gitlink_login_oauth_token.yaml @@ -1,7 +1,7 @@ # 公共参数 case_common: allure_epic: GitLink接口 - allure_feature: 登录模块 + allure_feature: 用户模块 allure_story: 登录接口 case_markers: - gitlink diff --git a/interface/gitlink/projects/about/test_gitlink_repo_edit_about.yaml b/interface/gitlink/projects/about/test_gitlink_repo_edit_about.yaml index 0695b52..8499728 100644 --- a/interface/gitlink/projects/about/test_gitlink_repo_edit_about.yaml +++ b/interface/gitlink/projects/about/test_gitlink_repo_edit_about.yaml @@ -6,14 +6,13 @@ case_common: - gitlink - repo - about - - usefixtures: gitlink_login -# 目前非仓库管理员操作会报403, 待后续需求确认后更改 +# 仅仓库管理员才能编辑项目主页 case_info: - id: gitlink_repo_get_about_detail_01 - title: 编辑项目主页内容 + title: 仓库管理员编辑项目主页内容 run: true severity: normal url: /api/${env_repo_owner}/${env_repo_identifier}/about.json @@ -34,4 +33,38 @@ case_info: type_jsonpath: $.identifier assert_sql: extract: - case_dependence: \ No newline at end of file + case_dependence: + setup: + interface: gitlink_super_login_04 + +- + id: gitlink_repo_get_about_detail_02 + title: 非仓库管理员编辑项目主页内容 + run: true + severity: normal + url: /api/${env_repo_owner}/${env_repo_identifier}/about.json + method: POST + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + request_type: json + payload: + content: ${generate_paragraph(nb=10)} + files: + assert_response: + status_code: 200 + assertStatus: + message: 断言接口返回status + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assertPraised: + message: 断言接口返回message + expect_value: 你没有权限操作. + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + setup: + interface: gitlink_login_01 \ No newline at end of file diff --git a/interface/gitlink/projects/collaborators/test_gitlink_add_repo_collaborator.yaml b/interface/gitlink/projects/collaborators/test_gitlink_add_repo_collaborator.yaml new file mode 100644 index 0000000..3ea5b19 --- /dev/null +++ b/interface/gitlink/projects/collaborators/test_gitlink_add_repo_collaborator.yaml @@ -0,0 +1,81 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 成员管理 + case_markers: + - gitlink + - gitea + - collaborator + - usefixtures: gitlink_login + + +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_add_repo_collaborator_01 + title: 仓库管理员添加一个项目成员,添加成功 + severity: critical + run: True + url: /api/${repo_owner}/${repo_identifier}/collaborators.json + method: POST + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + user_id: ${t_user_id} + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=0 + expect_value: 0 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=success + expect_value: success + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + teardown: + # 删除仓库 + interface: gitlink_projects_delete_project_01 + +- + id: gitlink_add_repo_collaborator_02 + title: 非仓库管理员添加一个项目成员,添加失败 + severity: critical + run: True + url: /api/${env_repo_owner}/${env_repo_identifier}/collaborators.json + method: POST + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + user_id: ${t_user_id} + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: \ No newline at end of file diff --git a/interface/gitlink/projects/collaborators/test_gitlink_change_repo_collaborator_role.yaml b/interface/gitlink/projects/collaborators/test_gitlink_change_repo_collaborator_role.yaml new file mode 100644 index 0000000..03a817d --- /dev/null +++ b/interface/gitlink/projects/collaborators/test_gitlink_change_repo_collaborator_role.yaml @@ -0,0 +1,126 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 成员管理 + case_markers: + - gitlink + - gitea + - collaborator + - usefixtures: gitlink_login + +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_change_repo_collaborator_role_01 + title: 仓库管理员更改项目成员权限 - 修改为报告者,修改成功 + severity: critical + run: True + url: /api/${repo_owner}/${repo_identifier}/collaborators/change_role.json + method: PUT + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + user_id: ${t_user_id} + role: Reporter # 必填,枚举值:Manager Developer Reporter + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=0 + expect_value: 0 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=success + expect_value: success + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_projects_new_project_02 + - gitlink_add_repo_collaborator_01 + teardown: + interface: + - gitlink_delete_repo_collaborator_01 + - gitlink_projects_delete_project_01 + + +- + id: gitlink_change_repo_collaborator_role_02 + title: 仓库管理员更改项目成员权限 - 修改为管理员,修改成功 + severity: critical + run: True + url: /api/${repo_owner}/${repo_identifier}/collaborators/change_role.json + method: PUT + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + user_id: ${t_user_id} + role: Manager # 必填,枚举值:Manager Developer Reporter + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=0 + expect_value: 0 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=success + expect_value: success + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_projects_new_project_02 + - gitlink_add_repo_collaborator_01 + teardown: + interface: + - gitlink_delete_repo_collaborator_01 + - gitlink_projects_delete_project_01 + + +- + id: gitlink_change_repo_collaborator_role_03 + title: 非仓库管理员更改项目成员权限 - 修改为管理员,修改失败 + severity: critical + run: True + url: /api/${env_repo_owner}/${env_repo_identifier}/collaborators/change_role.json + method: PUT + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + user_id: ${t_user_id} + role: Manager # 必填,枚举值:Manager Developer Reporter + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: \ No newline at end of file diff --git a/interface/gitlink/projects/collaborators/test_gitlink_delete_repo_collaborator.yaml b/interface/gitlink/projects/collaborators/test_gitlink_delete_repo_collaborator.yaml new file mode 100644 index 0000000..0f1e3c3 --- /dev/null +++ b/interface/gitlink/projects/collaborators/test_gitlink_delete_repo_collaborator.yaml @@ -0,0 +1,82 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 成员管理 + case_markers: + - gitlink + - gitea + - collaborator + - usefixtures: gitlink_login + +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_delete_repo_collaborator_01 + title: 仓库管理员删除一个项目成员,删除成功 + severity: critical + run: True + url: /api/${repo_owner}/${repo_identifier}/collaborators/remove.json + method: DELETE + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + user_id: ${t_user_id} + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=0 + expect_value: 0 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=success + expect_value: success + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + setup: + # 新建私有仓库 + interface: + - gitlink_projects_new_project_02 + - gitlink_add_repo_collaborator_01 + teardown: + # 删除仓库 + interface: gitlink_projects_delete_project_01 + +- + id: gitlink_delete_repo_collaborator_02 + title: 非仓库管理员删除一个项目成员,删除失败 + severity: critical + run: True + url: /api/${env_repo_owner}/${env_repo_identifier}/collaborators/remove.json + method: DELETE + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + user_id: ${t_user_id} + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: \ No newline at end of file diff --git a/interface/gitlink/projects/collaborators/test_gitlink_get_repo_collaborator_list.yaml b/interface/gitlink/projects/collaborators/test_gitlink_get_repo_collaborator_list.yaml new file mode 100644 index 0000000..88c4714 --- /dev/null +++ b/interface/gitlink/projects/collaborators/test_gitlink_get_repo_collaborator_list.yaml @@ -0,0 +1,72 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 成员管理 + case_markers: + - gitlink + - gitea + - collaborator + - usefixtures: gitlink_login + + +case_info: +- + id: gitlink_get_repo_collaborator_list_01 + title: 仓库管理员获取项目成员列表,获取成功 + severity: critical + run: True + url: /api/${repo_owner}/${repo_identifier}/collaborators.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + page: 1 + limit: 15 + files: + assert_response: + status_code: 200 + assertField: + message: 断言接口存在参数total_count + expect_value: total_count + assert_type: contains + assert_sql: + extract: + type_jsonpath: + repo_user_ids: $.members[*].id + case_dependence: + + +- + id: gitlink_get_repo_collaborator_list_02 + title: 非仓库管理员获取项目成员列表,获取失败 + severity: critical + run: True + url: /api/${env_repo_owner}/${env_repo_identifier}/collaborators.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + page: 1 + limit: 15 + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: \ No newline at end of file diff --git a/interface/gitlink/projects/collaborators/test_gitlink_get_user_list.yaml b/interface/gitlink/projects/collaborators/test_gitlink_get_user_list.yaml new file mode 100644 index 0000000..c299e32 --- /dev/null +++ b/interface/gitlink/projects/collaborators/test_gitlink_get_user_list.yaml @@ -0,0 +1,37 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 成员管理 + case_markers: + - gitlink + - gitea + - usefixtures: gitlink_login + + + +case_info: +- + id: gitlink_get_user_list_01 + title: 获取平台用户列表 + severity: normal + run: True + url: /api/users/list.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段total_count + expect_value: total_count + assert_type: contains + assert_sql: + extract: + type_jsonpath: + sys_user_ids: $.users[*].user_id + case_dependence: diff --git a/interface/gitlink/projects/issues/test_gitlink_repo_batch_edit_issue.yaml b/interface/gitlink/projects/issues/test_gitlink_repo_batch_edit_issue.yaml index 891cc01..25a954a 100644 --- a/interface/gitlink/projects/issues/test_gitlink_repo_batch_edit_issue.yaml +++ b/interface/gitlink/projects/issues/test_gitlink_repo_batch_edit_issue.yaml @@ -44,4 +44,7 @@ case_info: extract: case_dependence: setup: - interface: gitlink_repo_get_issue_list_01 \ No newline at end of file + interface: + - gitlink_repo_new_issue_01 + - gitlink_repo_new_issue_01 + - gitlink_repo_get_issue_list_01 \ No newline at end of file diff --git a/interface/gitlink/projects/pull_request/test_gitlink_repo_get_pull_request_version_diff.yaml b/interface/gitlink/projects/pull_request/test_gitlink_repo_get_pull_request_version_diff.yaml index fecebed..71ce7e7 100644 --- a/interface/gitlink/projects/pull_request/test_gitlink_repo_get_pull_request_version_diff.yaml +++ b/interface/gitlink/projects/pull_request/test_gitlink_repo_get_pull_request_version_diff.yaml @@ -30,7 +30,6 @@ case_info: message: 断言接口返回存在file_nums expect_value: file_nums assert_type: contains - type_jsonpath: $.message assert_sql: extract: case_dependence: diff --git a/interface/gitlink/projects/repository/test_gitlink_get_repo_detail_full.yaml b/interface/gitlink/projects/repository/test_gitlink_get_repo_detail_full.yaml index be17d19..a6e9e12 100644 --- a/interface/gitlink/projects/repository/test_gitlink_get_repo_detail_full.yaml +++ b/interface/gitlink/projects/repository/test_gitlink_get_repo_detail_full.yaml @@ -31,3 +31,7 @@ case_info: expect_value: default_branch assert_sql: extract: + type_jsonpath: + repo_project_name: $.name + repo_private: $.private + diff --git a/interface/gitlink/projects/repository/test_gitlink_get_repo_simple.yaml b/interface/gitlink/projects/repository/test_gitlink_get_repo_simple.yaml index 961845c..854f484 100644 --- a/interface/gitlink/projects/repository/test_gitlink_get_repo_simple.yaml +++ b/interface/gitlink/projects/repository/test_gitlink_get_repo_simple.yaml @@ -31,3 +31,5 @@ case_info: expect_value: identifier assert_sql: extract: + type_jsonpath: + repo_project_name: $.name diff --git a/interface/gitlink/projects/settings/test_gitlink_get_repo_category.yaml b/interface/gitlink/projects/settings/test_gitlink_get_repo_category.yaml new file mode 100644 index 0000000..576aa9a --- /dev/null +++ b/interface/gitlink/projects/settings/test_gitlink_get_repo_category.yaml @@ -0,0 +1,37 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 仓库设置 + case_markers: + - gitlink + - gitea + - usefixtures: gitlink_login + + + +case_info: +- + id: gitlink_get_repo_category_01 + title: 获取项目类别 + severity: critical + run: True + url: /api/project_categories.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段project_categories + expect_value: project_categories + assert_type: contains + assert_sql: + extract: + type_jsonpath: + repo_project_category_ids: $.project_categories[*].id + case_dependence: diff --git a/interface/gitlink/projects/settings/test_gitlink_get_repo_language.yaml b/interface/gitlink/projects/settings/test_gitlink_get_repo_language.yaml new file mode 100644 index 0000000..b5a5bed --- /dev/null +++ b/interface/gitlink/projects/settings/test_gitlink_get_repo_language.yaml @@ -0,0 +1,37 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 仓库设置 + case_markers: + - gitlink + - gitea + - usefixtures: gitlink_login + + + +case_info: +- + id: gitlink_get_repo_language_01 + title: 获取项目语言 + severity: critical + run: True + url: /api/project_languages.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段project_languages + expect_value: project_languages + assert_type: contains + assert_sql: + extract: + type_jsonpath: + repo_project_language_ids: $.project_languages[*].id + case_dependence: diff --git a/interface/gitlink/projects/settings/test_gitlink_get_repo_setting.yaml b/interface/gitlink/projects/settings/test_gitlink_get_repo_setting.yaml new file mode 100644 index 0000000..d903fa3 --- /dev/null +++ b/interface/gitlink/projects/settings/test_gitlink_get_repo_setting.yaml @@ -0,0 +1,47 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 仓库设置 + case_markers: + - gitlink + - gitea + - usefixtures: gitlink_login + +# 仅仓库管理员及以上角色才有权限 +common_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + teardown: + interface: gitlink_projects_delete_project_01 + +case_info: + - id: gitlink_get_repo_setting_01 + title: 获取仓库基本设置 + severity: critical + run: True + url: /api/${repo_owner}/${repo_identifier}/edit.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段project_identifier + expect_value: project_identifier + assert_type: contains + assert_sql: + extract: + type_jsonpath: + repo_project_name: $.project_name + repo_project_identifier: $.project_identifier + repo_project_private: $.private + repo_project_description: $.project_description + repo_project_language_id: $.project_language_id + repo_project_category_id: $.project_category_id + case_dependence: diff --git a/interface/gitlink/projects/settings/test_gitlink_update_private_repo_setting.yaml b/interface/gitlink/projects/settings/test_gitlink_update_private_repo_setting.yaml new file mode 100644 index 0000000..4168092 --- /dev/null +++ b/interface/gitlink/projects/settings/test_gitlink_update_private_repo_setting.yaml @@ -0,0 +1,202 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 仓库设置 + case_markers: + - gitlink + - gitea + - usefixtures: gitlink_login + +# 仅仓库管理员及以上角色才有权限 +common_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + teardown: + interface: gitlink_projects_delete_project_01 + + +case_info: +- + id: gitlink_update_repo_setting_01 + title: 更新仓库基本设置 - 更新项目名称 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: update-name-${generate_words} # 项目名称 + identifier: ${repo_project_identifier} # 项目标识 + files: + assert_response: + status_code: 200 + assertIdentifier: + message: 断言接口返回的identifier + expect_value: ${repo_project_identifier} + assert_type: == + type_jsonpath: $.identifier + assertPrivate: + message: 断言接口返回的is_public + expect_value: False + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_get_repo_setting_01 + +- + id: gitlink_update_repo_setting_02 + title: 更新仓库基本设置 - 更新项目标识 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: ${repo_project_name} # 项目名称 + identifier: update_${generate_identifier()}_${generate_identifier()} # 项目标识 + files: + assert_response: + status_code: 200 + assertName: + message: 断言接口返回的name + expect_value: ${repo_project_name} + assert_type: == + type_jsonpath: $.name + assertPrivate: + message: 断言接口返回的is_public + expect_value: False + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + type_jsonpath: + repo_identifier: $.identifier + case_dependence: + setup: + interface: + - gitlink_get_repo_setting_01 + +- + id: gitlink_update_repo_setting_03 + title: 更新仓库基本设置 - 更新项目类别 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: ${repo_project_name} # 项目名称 + project_category_id: ${random.choice(${repo_project_category_ids})} # 项目类别ID + identifier: ${repo_project_identifier} # 项目标识 + files: + assert_response: + status_code: 200 + assertIdentifier: + message: 断言接口返回的identifier + expect_value: ${repo_project_identifier} + assert_type: == + type_jsonpath: $.identifier + assertPrivate: + message: 断言接口返回的is_public + expect_value: False + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_get_repo_category_01 + - gitlink_get_repo_setting_01 + +- + id: gitlink_update_repo_setting_04 + title: 更新仓库基本设置 - 更新项目语言 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: ${repo_project_name} # 项目名称 + project_language_id: ${random.choice(${repo_project_language_ids})} # 项目语言ID + identifier: ${repo_project_identifier} # 项目标识 + files: + assert_response: + status_code: 200 + assertIdentifier: + message: 断言接口返回的identifier + expect_value: ${repo_project_identifier} + assert_type: == + type_jsonpath: $.identifier + assertPrivate: + message: 断言接口返回的is_public + expect_value: False + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_get_repo_language_01 + - gitlink_get_repo_setting_01 + + +- + id: gitlink_update_repo_setting_05 + title: 更新仓库基本设置 - 更新仓库公私有性, 私有仓库更新为公开 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: ${repo_project_name} # 项目名称 + private: False # 项目是否为私有项目 + identifier: ${repo_project_identifier} # 项目标识 + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回的identifier + expect_value: ${repo_project_identifier} + assert_type: == + type_jsonpath: $.identifier + assertPrivate: + message: 断言接口返回的is_public + expect_value: True + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_get_repo_setting_01 + diff --git a/interface/gitlink/projects/settings/test_gitlink_update_public_repo_setting.yaml b/interface/gitlink/projects/settings/test_gitlink_update_public_repo_setting.yaml new file mode 100644 index 0000000..eb6753d --- /dev/null +++ b/interface/gitlink/projects/settings/test_gitlink_update_public_repo_setting.yaml @@ -0,0 +1,200 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: 仓库设置 + case_markers: + - gitlink + - gitea + - usefixtures: gitlink_login + +# 仅仓库管理员及以上角色才有权限 +common_dependence: + setup: + # 新建公开仓库 + interface: gitlink_projects_new_project_01 + teardown: + interface: gitlink_projects_delete_project_01 + + +case_info: +- + id: gitlink_update_repo_setting_01 + title: 更新仓库基本设置 - 更新项目名称 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: update-name-${generate_words} # 项目名称 + identifier: ${repo_project_identifier} # 项目标识 + files: + assert_response: + status_code: 200 + assertIdentifier: + message: 断言接口返回的identifier + expect_value: ${repo_project_identifier} + assert_type: == + type_jsonpath: $.identifier + assertPrivate: + message: 断言接口返回的is_public + expect_value: True + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_get_repo_setting_01 + +- + id: gitlink_update_repo_setting_02 + title: 更新仓库基本设置 - 更新项目标识 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: ${repo_project_name} # 项目名称 + identifier: update_${generate_identifier()}_${generate_identifier()} # 项目标识 + files: + assert_response: + status_code: 200 + assertName: + message: 断言接口返回的name + expect_value: ${repo_project_name} + assert_type: == + type_jsonpath: $.name + assertPrivate: + message: 断言接口返回的is_public + expect_value: True + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + type_jsonpath: + repo_identifier: $.identifier + case_dependence: + setup: + interface: + - gitlink_get_repo_setting_01 + +- + id: gitlink_update_repo_setting_03 + title: 更新仓库基本设置 - 更新项目类别 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: ${repo_project_name} # 项目名称 + project_category_id: ${random.choice(${repo_project_category_ids})} # 项目类别ID + identifier: ${repo_project_identifier} # 项目标识 + files: + assert_response: + status_code: 200 + assertIdentifier: + message: 断言接口返回的identifier + expect_value: ${repo_project_identifier} + assert_type: == + type_jsonpath: $.identifier + assertPrivate: + message: 断言接口返回的is_public + expect_value: True + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_get_repo_category_01 + - gitlink_get_repo_setting_01 + +- + id: gitlink_update_repo_setting_04 + title: 更新仓库基本设置 - 更新项目语言 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: ${repo_project_name} # 项目名称 + project_language_id: ${random.choice(${repo_project_language_ids})} # 项目语言ID + identifier: ${repo_project_identifier} # 项目标识 + files: + assert_response: + status_code: 200 + assertIdentifier: + message: 断言接口返回的identifier + expect_value: ${repo_project_identifier} + assert_type: == + type_jsonpath: $.identifier + assertPrivate: + message: 断言接口返回的is_public + expect_value: True + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_get_repo_language_01 + - gitlink_get_repo_setting_01 + +- + id: gitlink_update_repo_setting_05 + title: 更新仓库基本设置 - 更新仓库公私有性, 公开仓库更新为私有 + severity: critical + run: true + url: /api/${repo_owner}/${repo_identifier}.json + method: PATCH + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + name: ${repo_project_name} # 项目名称 + private: True # 项目是否为私有项目 + identifier: ${repo_project_identifier} # 项目标识 + files: + assert_response: + status_code: 200 + assertIdentifier: + message: 断言接口返回的identifier + expect_value: ${repo_project_identifier} + assert_type: == + type_jsonpath: $.identifier + assertPrivate: + message: 断言接口返回的is_public + expect_value: False + assert_type: == + type_jsonpath: $.is_public + assert_sql: + extract: + case_dependence: + setup: + interface: + - gitlink_get_repo_setting_01 \ No newline at end of file diff --git a/interface/gitlink/projects/tags/test_gitlink_repo_delete_tag.yaml b/interface/gitlink/projects/tags/test_gitlink_repo_delete_tag.yaml index 7078310..6b12a60 100644 --- a/interface/gitlink/projects/tags/test_gitlink_repo_delete_tag.yaml +++ b/interface/gitlink/projects/tags/test_gitlink_repo_delete_tag.yaml @@ -8,10 +8,13 @@ case_common: - gitea - usefixtures: gitlink_login + +# 通过发行版新建标签,删除标签之前需要先删除发行版 + case_info: - id: gitlink_repo_delete_tag_001 - title: 删除标签 + title: 删除标签 - 当前标签无关联发行版,删除成功 severity: normal run: True url: /api/v1/${env_repo_owner}/${env_repo_identifier}/tags/${tag_name}.json @@ -37,6 +40,42 @@ case_info: type_jsonpath: $.message assert_sql: extract: + case_dependence: + setup: + interface: + - gitlink_repo_new_release_001 + - gitlink_repo_get_tags_list_001 + - gitlink_repo_get_release_list_001 + - gitlink_repo_delete_release_001 + +- + id: gitlink_repo_delete_tag_002 + title: 删除标签 - 当前标签关联了发行版,将发行失败 + severity: normal + run: True + url: /api/v1/${env_repo_owner}/${env_repo_identifier}/tags/${tag_name}.json + method: DELETE + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + files: + assert_response: + status_code: 200 + assertStatus: + message: 断言接口返回status=-1 + expect_value: -1 + assert_type: == + type_jsonpath: $.status + assertMessage: + message: 断言接口返回message + expect_value: 请先删除发行版! + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: case_dependence: setup: interface: diff --git a/interface/gitlink/projects/test_gitlink_new_project.yaml b/interface/gitlink/projects/test_gitlink_new_project.yaml index 9e6007f..e4558e6 100644 --- a/interface/gitlink/projects/test_gitlink_new_project.yaml +++ b/interface/gitlink/projects/test_gitlink_new_project.yaml @@ -52,7 +52,42 @@ case_info: - id: gitlink_projects_new_project_02 - title: 正确输入所有参数,新建私有项目成功 + title: 正确输入各项必填参数,新建私有项目成功 + run: true + url: /api/projects.json + method: POST + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + request_type: json + payload: + user_id: ${user_id} + name: test_${generate_identifier()}_${generate_identifier()} + repository_name: ${generate_identifier()}_test + private: true + files: + assert_response: + status_code: 200 + login: + message: 断言接口返回的login + expect_value: ${login} + assert_type: == + type_jsonpath: $.login + assert_sql: + extract: + type_jsonpath: + repo_id: $.id + repo_name: $.name + repo_owner: $.login + repo_identifier: $.identifier + case_dependence: + teardown: + interface: + - gitlink_projects_delete_project_01 + +- + id: gitlink_projects_new_project_03 + title: 输入所有参数,新建项目成功 run: false url: /api/projects.json method: POST @@ -101,9 +136,8 @@ case_info: teardown: interface: - gitlink_projects_delete_project_01 - - - id: gitlink_projects_new_project_03 + id: gitlink_projects_new_project_04 title: 正确输入各项必填参数,新建项目成功(校验数据库) severity: normal run: false diff --git a/interface/gitlink/projects/webhook/test_gitlink_get_repo_add_webhook.yaml b/interface/gitlink/projects/webhook/test_gitlink_get_repo_add_webhook.yaml new file mode 100644 index 0000000..d3328dc --- /dev/null +++ b/interface/gitlink/projects/webhook/test_gitlink_get_repo_add_webhook.yaml @@ -0,0 +1,89 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Webhook + case_markers: + - gitlink + - gitea + - webhook + - usefixtures: gitlink_login + - skip: 暂时还未完成 + +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_get_repo_add_webhook_01 + title: 仓库管理员创建Webhook,创建成功 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks.json + method: POST + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + type: # 选填,类型, 默认值gitea, 枚举值:gitea slack discord dingtalk telegram msteams feishu matrix jianmu softbot + active: # 必填,是否开启, 布尔值 + content_type: # 必填,内容类型, 枚举值:json form + http_method: # 必填,请求方式,枚举值:GET POST + secret: # 选填,密钥 + url: # 必填,请求地址 + branch_filter: # 必填,分支白名单 推送、创建,删除分支事件的分支白名单,使用 glob 模式匹配指定。若为空或 ,则将报告所有分支的事件。 + events: # 必填,事件,枚举值:push create delete issues_only issue_assign issue_label issue_comment pull_request_only pull_request_assign pull_request_comment + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段total_count + expect_value: total_count + assert_type: contains + assert_sql: + extract: + case_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + # teardown: + # # 删除仓库 + # interface: gitlink_projects_delete_project_01 + +- + id: gitlink_get_repo_add_webhook_02 + title: 非仓库管理员创建Webhook,创建成功 + severity: normal + run: True + url: /api/${env_repo_owner}/${env_repo_identifier}/webhooks.json + method: POST + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + type: # 选填,类型, 默认值gitea, 枚举值:gitea slack discord dingtalk telegram msteams feishu matrix jianmu softbot + active: # 必填,是否开启, 布尔值 + content_type: # 必填,内容类型, 枚举值:json form + http_method: # 必填,请求方式,枚举值:GET POST + secret: # 选填,密钥 + url: # 必填,请求地址 + branch_filter: # 必填,分支白名单 推送、创建,删除分支事件的分支白名单,使用 glob 模式匹配指定。若为空或 ,则将报告所有分支的事件。 + events: # 必填,事件,枚举值:push create delete issues_only issue_assign issue_label issue_comment pull_request_only pull_request_assign pull_request_comment + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: diff --git a/interface/gitlink/projects/webhook/test_gitlink_get_repo_delete_webhook.yaml b/interface/gitlink/projects/webhook/test_gitlink_get_repo_delete_webhook.yaml new file mode 100644 index 0000000..5af522d --- /dev/null +++ b/interface/gitlink/projects/webhook/test_gitlink_get_repo_delete_webhook.yaml @@ -0,0 +1,79 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Webhook + case_markers: + - gitlink + - gitea + - webhook + - usefixtures: gitlink_login + - skip: 暂时还未完成 + +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_get_repo_delete_webhook_01 + title: 仓库管理员删除Webhook,删除成功 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks/${webhook_id}.json + method: DELETE + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: + repo: + id: + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段total_count + expect_value: total_count + assert_type: contains + assert_sql: + extract: + case_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + # teardown: + # # 删除仓库 + # interface: gitlink_projects_delete_project_01 + +- + id: gitlink_get_repo_delete_webhook_02 + title: 非仓库管理员删除Webhook,删除失败 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks/${webhook_id}.json + method: DELETE + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: + repo: + id: + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: diff --git a/interface/gitlink/projects/webhook/test_gitlink_get_repo_upate_webhook.yaml b/interface/gitlink/projects/webhook/test_gitlink_get_repo_upate_webhook.yaml new file mode 100644 index 0000000..9ee33e8 --- /dev/null +++ b/interface/gitlink/projects/webhook/test_gitlink_get_repo_upate_webhook.yaml @@ -0,0 +1,88 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Webhook + case_markers: + - gitlink + - gitea + - webhook + - usefixtures: gitlink_login + - skip: 暂时还未完成 +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_get_repo_update_webhook_01 + title: 仓库管理员更新Webhook,更新成功 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks/${webhook_id}.json + method: PUT + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + type: # 选填,类型, 默认值gitea, 枚举值:gitea slack discord dingtalk telegram msteams feishu matrix jianmu softbot + active: # 必填,是否开启, 布尔值 + content_type: # 必填,内容类型, 枚举值:json form + http_method: # 必填,请求方式,枚举值:GET POST + secret: # 选填,密钥 + url: # 必填,请求地址 + branch_filter: # 必填,分支白名单 推送、创建,删除分支事件的分支白名单,使用 glob 模式匹配指定。若为空或 ,则将报告所有分支的事件。 + events: # 必填,事件,枚举值:push create delete issues_only issue_assign issue_label issue_comment pull_request_only pull_request_assign pull_request_comment + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段total_count + expect_value: total_count + assert_type: contains + assert_sql: + extract: + case_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + # teardown: + # # 删除仓库 + # interface: gitlink_projects_delete_project_01 + +- + id: gitlink_get_repo_update_webhook_02 + title: 非仓库管理员更新Webhook,更新失败 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks/${webhook_id}.json + method: PUT + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + type: # 选填,类型, 默认值gitea, 枚举值:gitea slack discord dingtalk telegram msteams feishu matrix jianmu softbot + active: # 必填,是否开启, 布尔值 + content_type: # 必填,内容类型, 枚举值:json form + http_method: # 必填,请求方式,枚举值:GET POST + secret: # 选填,密钥 + url: # 必填,请求地址 + branch_filter: # 必填,分支白名单 推送、创建,删除分支事件的分支白名单,使用 glob 模式匹配指定。若为空或 ,则将报告所有分支的事件。 + events: # 必填,事件,枚举值:push create delete issues_only issue_assign issue_label issue_comment pull_request_only pull_request_assign pull_request_comment + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: diff --git a/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_detail.yaml b/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_detail.yaml new file mode 100644 index 0000000..9853a4f --- /dev/null +++ b/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_detail.yaml @@ -0,0 +1,78 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Webhook + case_markers: + - gitlink + - gitea + - webhook + - usefixtures: gitlink_login + - skip: 暂时还未完成 +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_get_repo_webhook_detail_01 + title: 仓库管理员获取Webhook详情,获取成功 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks/${webhook_id}.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: + repo: + id: + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段total_count + expect_value: total_count + assert_type: contains + assert_sql: + extract: + case_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + # teardown: + # # 删除仓库 + # interface: gitlink_projects_delete_project_01 + +- + id: gitlink_get_repo_webhook_detail_02 + title: 非仓库管理员获取Webhook详情,获取失败 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks/${webhook_id}.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: + repo: + id: + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: diff --git a/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_history_list.yaml b/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_history_list.yaml new file mode 100644 index 0000000..aed8948 --- /dev/null +++ b/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_history_list.yaml @@ -0,0 +1,78 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Webhook + case_markers: + - gitlink + - gitea + - webhook + - usefixtures: gitlink_login + - skip: 暂时还未完成 +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_get_repo_webhook_history_list_01 + title: 仓库管理员获取Webhook历史推送列表,获取成功 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks/${id}/hooktasks.json.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: + repo: + id: + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段total_count + expect_value: total_count + assert_type: contains + assert_sql: + extract: + case_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + # teardown: + # # 删除仓库 + # interface: gitlink_projects_delete_project_01 + +- + id: gitlink_get_repo_webhook_history_list_02 + title: 非仓库管理员获取Webhook历史推送列表,获取失败 + severity: normal + run: True + url: /api/${env_repo_owner}/${env_repo_identifier}/webhooks/${id}/hooktasks.json.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: + repo: + id: + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: diff --git a/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_list.yaml b/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_list.yaml new file mode 100644 index 0000000..94e39bc --- /dev/null +++ b/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_list.yaml @@ -0,0 +1,76 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Webhook + case_markers: + - gitlink + - gitea + - webhook + - usefixtures: gitlink_login + - skip: 暂时还未完成 +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_get_repo_webhook_list_01 + title: 仓库管理员获取Webhook列表,获取成功 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + page: 1 + limit: 15 + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段total_count + expect_value: total_count + assert_type: contains + assert_sql: + extract: + case_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + # teardown: + # # 删除仓库 + # interface: gitlink_projects_delete_project_01 + +- + id: gitlink_get_repo_webhook_list_02 + title: 非仓库管理员获取Webhook列表,获取失败 + severity: normal + run: True + url: /api/${env_repo_owner}/${env_repo_identifier}/webhooks.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + page: 1 + limit: 15 + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: diff --git a/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_test.yaml b/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_test.yaml new file mode 100644 index 0000000..76f572e --- /dev/null +++ b/interface/gitlink/projects/webhook/test_gitlink_get_repo_webhook_test.yaml @@ -0,0 +1,78 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Webhook + case_markers: + - gitlink + - gitea + - webhook + - usefixtures: gitlink_login + - skip: 暂时还未完成 +# 仅仓库管理员及以上角色才有权限 + +case_info: +- + id: gitlink_get_repo_webhook_test_01 + title: 仓库管理员测试Webhook推送,请求成功 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks/${id}/tests.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: + repo: + id: + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回包括字段total_count + expect_value: total_count + assert_type: contains + assert_sql: + extract: + case_dependence: + setup: + # 新建私有仓库 + interface: gitlink_projects_new_project_02 + # teardown: + # # 删除仓库 + # interface: gitlink_projects_delete_project_01 + +- + id: gitlink_get_repo_webhook_test_02 + title: 非仓库管理员测试Webhook推送,请求失败 + severity: normal + run: True + url: /api/${repo_owner}/${repo_identifier}/webhooks/${id}/tests.json + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: + repo: + id: + files: + assert_response: + status_code: 200 + assert_status: + message: 断言接口status=403 + expect_value: 403 + assert_type: == + type_jsonpath: $.status + assert_message: + message: 断言接口message=你不是管理员,没有权限操作 + expect_value: 你不是管理员,没有权限操作 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: diff --git a/interface/gitlink/projects/wiki/test_gitlink_repo_delete_wiki.yaml b/interface/gitlink/projects/wiki/test_gitlink_repo_delete_wiki.yaml new file mode 100644 index 0000000..177d877 --- /dev/null +++ b/interface/gitlink/projects/wiki/test_gitlink_repo_delete_wiki.yaml @@ -0,0 +1,49 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Wiki + case_markers: + - gitlink + - repo_wiki + - gitea + - usefixtures: gitlink_login + - skip: 暂时跳过 + + +common_dependence: + setup: + env_vars: + env_page_title: 新页面_${generate_words()} + env_page_content: ${generate_paragraph} + +case_info: +- + id: gitlink_repo_delete_wiki_01 + title: 删除wiki页面 + severity: critical + run: True + url: ${wiki_host}/api/wiki/deleteWiki + method: DELETE + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repo: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + pageName: ${env_page_title} # 必填,当前页标题 + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回的message + expect_value: 204 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + setup: + interface: gitlink_repo_new_wiki_01 diff --git a/interface/gitlink/projects/wiki/test_gitlink_repo_export_wiki.yaml b/interface/gitlink/projects/wiki/test_gitlink_repo_export_wiki.yaml new file mode 100644 index 0000000..a532629 --- /dev/null +++ b/interface/gitlink/projects/wiki/test_gitlink_repo_export_wiki.yaml @@ -0,0 +1,93 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Wiki + case_markers: + - gitlink + - repo_wiki + - gitea + - usefixtures: gitlink_login + - skip: 暂时跳过 + + +common_dependence: + setup: + interface: gitlink_get_repo_simple_01 + + +case_info: +- + id: gitlink_repo_export_wiki_01 + title: 导出wiki库(pdf), 导出成功 + severity: normal + run: True + url: ${wiki_host}/api/wikiExport/wikiExport-wrapper + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repoName: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + projectName: ${repo_project_name} # 必填,项目名称 + type: pdf # 类型,pdf or markdown or html + files: + assert_response: + status_code: 200 + assert_sql: + extract: + case_dependence: + + +- + id: gitlink_repo_export_wiki_02 + title: 导出wiki库(markdown), 导出成功 + severity: normal + run: True + url: ${wiki_host}/api/wikiExport/wikiExport-wrapper + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repoName: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + projectName: ${repo_project_name} # 必填,项目名称 + type: markdown # 类型,pdf or markdown or html + files: + assert_response: + status_code: 200 + assert_sql: + extract: + case_dependence: + +- + id: gitlink_repo_export_wiki_03 + title: 导出wiki库(html), 导出成功 + severity: normal + run: True + url: ${wiki_host}/api/wikiExport/wikiExport-wrapper + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repoName: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + projectName: ${repo_project_name} # 必填,项目名称 + type: html # 类型,pdf or markdown or html + files: + assert_response: + status_code: 200 + assert_sql: + extract: + case_dependence: \ No newline at end of file diff --git a/interface/gitlink/projects/wiki/test_gitlink_repo_get_wiki_detail.yaml b/interface/gitlink/projects/wiki/test_gitlink_repo_get_wiki_detail.yaml new file mode 100644 index 0000000..622c3d4 --- /dev/null +++ b/interface/gitlink/projects/wiki/test_gitlink_repo_get_wiki_detail.yaml @@ -0,0 +1,53 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Wiki + case_markers: + - gitlink + - repo_wiki + - gitea + - usefixtures: gitlink_login + - skip: 暂时跳过 + +# 前提条件:新建一个wiki页面,确保wiki库不为空 + +common_dependence: + setup: + env_vars: + env_page_title: 新页面_${generate_words()} + env_page_content: ${generate_paragraph} + interface: gitlink_repo_new_wiki_01 + teardown: + interface: gitlink_repo_delete_wiki_01 + +case_info: +- + id: gitlink_repo_get_wiki_detail_01 + title: 获取wiki页面详情 + severity: normal + run: True + url: ${wiki_host}/api/wiki/getWiki + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repo: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + pageName: ${wiki_page_sub_url} # 必填,当前页标题 (特殊字符处理后的标题) + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回的message + expect_value: 200 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + setup: + interface: gitlink_repo_get_wiki_page_01 diff --git a/interface/gitlink/projects/wiki/test_gitlink_repo_get_wiki_page.yaml b/interface/gitlink/projects/wiki/test_gitlink_repo_get_wiki_page.yaml new file mode 100644 index 0000000..365abb5 --- /dev/null +++ b/interface/gitlink/projects/wiki/test_gitlink_repo_get_wiki_page.yaml @@ -0,0 +1,42 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Wiki + case_markers: + - gitlink + - repo_wiki + - gitea + - usefixtures: gitlink_login + - skip: 暂时跳过 + + +case_info: +- + id: gitlink_repo_get_wiki_page_01 + title: 获取wiki库所有页面 + severity: normal + run: True + url: ${wiki_host}/api/wiki/wikiPages + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repo: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回的message + expect_value: 200 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + type_jsonpath: + wiki_page_sub_url: $.data[0].sub_url + case_dependence: diff --git a/interface/gitlink/projects/wiki/test_gitlink_repo_get_wiki_sidebar.yaml b/interface/gitlink/projects/wiki/test_gitlink_repo_get_wiki_sidebar.yaml new file mode 100644 index 0000000..5d9f337 --- /dev/null +++ b/interface/gitlink/projects/wiki/test_gitlink_repo_get_wiki_sidebar.yaml @@ -0,0 +1,43 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Wiki + case_markers: + - gitlink + - repo_wiki + - gitea + - usefixtures: gitlink_login + - skip: 暂时跳过 + + +case_info: +- + id: gitlink_repo_get_wiki_sidebar_01 + title: 获取wiki库的sidebar信息 + severity: normal + run: True + url: ${wiki_host}/api/wiki/wikiPages + method: GET + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: params + payload: + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repo: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + pageName: _Sidebar + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回的message + expect_value: 200 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + type_jsonpath: + wiki_sidebar_content: $.data.md_content + case_dependence: diff --git a/interface/gitlink/projects/wiki/test_gitlink_repo_import_wiki.yaml b/interface/gitlink/projects/wiki/test_gitlink_repo_import_wiki.yaml new file mode 100644 index 0000000..db3f2c3 --- /dev/null +++ b/interface/gitlink/projects/wiki/test_gitlink_repo_import_wiki.yaml @@ -0,0 +1,75 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Wiki + case_markers: + - gitlink + - repo_wiki + - gitea + - usefixtures: gitlink_login + - skip: 暂时跳过 + +# 仅支持txt, markdown文件的导入 + +case_info: +- + id: gitlink_repo_import_wiki_01 + title: 导入wiki页面(txt文件), 导入成功 + severity: critical + run: True + url: ${wiki_host}/api/wikiExport/uploadWiki/${env_repo_owner}/${env_repo_identifier}/${env_project_id} + method: POST + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: file + payload: + multipartFile + files: GitLink,新一代开源创新服务平台.txt + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回的message + expect_value: 201 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + teardown: + env_vars: + env_page_title: GitLink,新一代开源创新服务平台 + interface: gitlink_repo_delete_wiki_01 + + +- + id: gitlink_repo_import_wiki_02 + title: 导入wiki页面(md文件), 导入成功 + severity: critical + run: True + url: ${wiki_host}/api/wikiExport/uploadWiki/${env_repo_owner}/${env_repo_identifier}/${env_project_id} + method: POST + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: file + payload: + multipartFile + files: GitLink编程夏令营(GLCC).md + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回的message + expect_value: 201 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + teardown: + env_vars: + env_page_title: GitLink编程夏令营(GLCC) + interface: gitlink_repo_delete_wiki_01 + diff --git a/interface/gitlink/projects/wiki/test_gitlink_repo_new_wiki.yaml b/interface/gitlink/projects/wiki/test_gitlink_repo_new_wiki.yaml index 25891cf..fa76956 100644 --- a/interface/gitlink/projects/wiki/test_gitlink_repo_new_wiki.yaml +++ b/interface/gitlink/projects/wiki/test_gitlink_repo_new_wiki.yaml @@ -4,10 +4,11 @@ case_common: allure_story: Wiki case_markers: - gitlink - - projects + - repo_wiki - gitea - new_wiki - usefixtures: gitlink_login + - skip: 暂时跳过 common_dependence: @@ -30,13 +31,13 @@ case_info: cookies: request_type: json payload: - owner: ${env_repo_owner} - repo: ${env_repo_identifier} - projectId: ${env_project_id} - pageName: ${env_page_title} # 当前页标题 - title: ${env_page_title} # 标题 - message: - content_base64: ${string_to_base64('${env_page_content}')} + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repo: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + pageName: ${env_page_title} # 必填,当前页标题 + title: ${env_page_title} # 必填,标题 + message: # 选填,提交信息 + content_base64: ${string_to_base64('${env_page_content}')} # 必填,wiki内容 files: assert_response: status_code: 200 @@ -48,3 +49,5 @@ case_info: assert_sql: extract: case_dependence: + teardown: + interface: gitlink_repo_delete_wiki_01 diff --git a/interface/gitlink/projects/wiki/test_gitlink_repo_update_wiki.yaml b/interface/gitlink/projects/wiki/test_gitlink_repo_update_wiki.yaml new file mode 100644 index 0000000..60d029f --- /dev/null +++ b/interface/gitlink/projects/wiki/test_gitlink_repo_update_wiki.yaml @@ -0,0 +1,56 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Wiki + case_markers: + - gitlink + - repo_wiki + - gitea + - new_wiki + - usefixtures: gitlink_login + - skip: 暂时跳过 + + +# 前提条件:新建一个wiki页面,确保wiki库不为空 + +common_dependence: + setup: + env_vars: + env_page_title: 新页面_${generate_words()} + env_page_content: ${generate_paragraph} + interface: gitlink_repo_new_wiki_01 + teardown: + interface: gitlink_repo_delete_wiki_01 + +case_info: +- + id: gitlink_repo_update_wiki_01 + title: 编辑wiki页面 + severity: critical + run: True + url: ${wiki_host}/api/wiki/updateWiki + method: PUT + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repo: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + pageName: ${env_page_title} # 必填,当前页标题 + title: ${env_page_title} # 必填,标题 + message: # 选填,提交信息 + content_base64: ${string_to_base64('${env_page_content}')} # 必填,wiki内容 + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回的message + expect_value: 200 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: diff --git a/interface/gitlink/projects/wiki/test_gitlink_repo_update_wiki_sidebar.yaml b/interface/gitlink/projects/wiki/test_gitlink_repo_update_wiki_sidebar.yaml new file mode 100644 index 0000000..1a432d0 --- /dev/null +++ b/interface/gitlink/projects/wiki/test_gitlink_repo_update_wiki_sidebar.yaml @@ -0,0 +1,48 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 开源项目模块 + allure_story: Wiki + case_markers: + - gitlink + - repo_wiki + - gitea + - usefixtures: gitlink_login + - skip: 暂时跳过 + + +# 前提条件:新建wiki页面是需要同步更新sidebar + +case_info: +- + id: gitlink_repo_update_wiki_sidebar_01 + title: 更新wiki库的sidebar + severity: critical + run: True + url: ${wiki_host}/api/wiki/updateWiki + method: PUT + headers: + Content-Type: application/json; charset=utf-8; + cookies: ${cookies} + cookies: + request_type: json + payload: + owner: ${env_repo_owner} # 必填,仓库拥有者标识 + repo: ${env_repo_identifier} # 必填,仓库标识 + projectId: ${env_project_id} # 必填 gitlink项目id + pageName: _Sidebar + title: _Sidebar + message: # 选填,提交信息 + content_base64: + files: + assert_response: + status_code: 200 + assertMessage: + message: 断言接口返回的message + expect_value: 200 + assert_type: == + type_jsonpath: $.message + assert_sql: + extract: + case_dependence: + setup: + interface: gitlink_repo_get_wiki_sidebar_01 diff --git a/interface/gitlink/test_gitlink_login.yaml b/interface/gitlink/test_gitlink_login.yaml index 6e3ab82..c08580c 100644 --- a/interface/gitlink/test_gitlink_login.yaml +++ b/interface/gitlink/test_gitlink_login.yaml @@ -1,7 +1,7 @@ # 公共参数 case_common: allure_epic: GitLink接口 # 敏捷里面的概念,定义史诗,相当于module级的标签, 往下是 feature - allure_feature: 登录模块 # 功能点的描述,相当于class级的标签, 理解成模块往下是 story + allure_feature: 用户模块 # 功能点的描述,相当于class级的标签, 理解成模块往下是 story allure_story: 登录接口 # 故事,可以理解为场景,相当于method级的标签, 往下是 title case_markers: # pytest框架的标记 pytest.mark. - gitlink diff --git a/interface/gitlink/users/test_gitlink_user_apply_token.yaml b/interface/gitlink/users/test_gitlink_user_apply_token.yaml new file mode 100644 index 0000000..5c8d24b --- /dev/null +++ b/interface/gitlink/users/test_gitlink_user_apply_token.yaml @@ -0,0 +1,29 @@ +case_common: + allure_epic: GitLink接口 + allure_feature: 用户模块 + allure_story: 申请token + case_markers: + - gitlink + - skip: 暂时还没有调通,等接口文档更新后,了解各个参数如何调用 + +case_info: +- + id: gitlink_user_apply_token_01 + title: 为用户申请一个token接口 + run: True + severity: normal + url: /users/${env_login}/tokens + method: POST + headers: + Content-Type: application/json; charset=utf-8; + cookies: + request_type: json + payload: + name: ${env_login} + scope: + - all + files: + assert_response: + status_code: 200 + assert_sql: + extract: \ No newline at end of file diff --git a/interface/gitlink/users/test_gitlink_user_register.yaml b/interface/gitlink/users/test_gitlink_user_register.yaml index 2e791ac..8dc8e44 100644 --- a/interface/gitlink/users/test_gitlink_user_register.yaml +++ b/interface/gitlink/users/test_gitlink_user_register.yaml @@ -1,7 +1,7 @@ case_common: allure_epic: GitLink接口 allure_feature: 用户模块 - allure_story: 登录注册 + allure_story: 注册接口 case_markers: - gitlink - gitea diff --git a/interface/pms/projects/test_sheet/test_pms_edit_test_sheet.yaml b/interface/pms/projects/test_sheet/test_pms_edit_test_sheet.yaml index 0ee6091..b3df7ef 100644 --- a/interface/pms/projects/test_sheet/test_pms_edit_test_sheet.yaml +++ b/interface/pms/projects/test_sheet/test_pms_edit_test_sheet.yaml @@ -136,7 +136,7 @@ case_info: status_code: 200 assertMessage: type_jsonpath: $.msg - expect_value: 失败 + expect_value: 开始时间不能晚于结束时间 assert_type: == assert_sql: extract: \ No newline at end of file diff --git a/utils/data_utils/faker_handle.py b/utils/data_utils/faker_handle.py index eda70fe..2058a2c 100644 --- a/utils/data_utils/faker_handle.py +++ b/utils/data_utils/faker_handle.py @@ -8,6 +8,7 @@ # 标准库导入 import random +import string import re from datetime import datetime, date, timedelta # 第三方库导入 @@ -171,21 +172,21 @@ class FakerData: def generate_identifier(self, lan="en", char_len=8): """ - :return:生成随机标识,满足要求:长度为2~100, 只能包含数字,字母,下划线(_),中划线(-),英文句号(.),必须以数字和字母开头,不能以下划线/中划线/英文句号开头和结尾 + :return:生成随机标识,满足要求:长度为2~100(这里长度通过传参控制,默认为8), 只能包含数字,字母,下划线(_),中划线(-),英文句号(.),必须以数字和字母开头,不能以下划线/中划线/英文句号开头和结尾 """ if lan == "zh": fk = self.fk_zh else: fk = self.faker while True: - identifier = fk.slug() # 生成随机的slug标识 + identifier = ''.join(random.choices(string.ascii_letters + string.digits + '_.-', k=char_len)) # 生成指定长度的随机标识 if ( re.match(r'^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,98}[a-zA-Z0-9]$', identifier) and not (identifier.startswith('_') or identifier.startswith('-') or identifier.startswith('.')) and - not (identifier.endswith('_') or identifier.endswith('.')) - ) and len(identifier) >= char_len: - return identifier[:char_len] + not (identifier.endswith('_') or identifier.startswith('-') or identifier.endswith('.')) + ): + return identifier def generate_city(self, lan="en", full: bool = True) -> str: """