@@ -343,6 +343,7 @@ test("selfHostedTypes lists the supported software with labels", () => {
343343 assert . deepEqual ( selfHostedTypes ( ) , [
344344 { type : "gitlab" , label : "GitLab" } ,
345345 { type : "forgejo" , label : "Forgejo / Gitea" } ,
346+ { type : "bitbucket-server" , label : "Bitbucket Server / Data Center" } ,
346347 ] )
347348} )
348349
@@ -383,6 +384,69 @@ test("buildSelfHostedForge builds a Forgejo instance adapter reusing the codeber
383384 assert . deepEqual ( forge . authHeader ( "cb_secret" ) , { Authorization : "token cb_secret" } )
384385} )
385386
387+ test ( "buildSelfHostedForge builds a Bitbucket Server instance adapter" , ( ) => {
388+ const forge = buildSelfHostedForge ( { type : "bitbucket-server" , hostname : "bitbucket.example.com" } )
389+
390+ assert . equal ( forge . base_url , "https://bitbucket.example.com/rest/api/latest" )
391+ assert . equal ( forge . selfHosted , true )
392+
393+ const info = { projectKey : "PRJ" , repoSlug : "widget" , origin : "https://bitbucket.example.com" }
394+ assert . equal (
395+ forge . listPRsUrl ( info ) ,
396+ "https://bitbucket.example.com/rest/api/latest/projects/PRJ/repos/widget/pull-requests?state=OPEN" )
397+ assert . equal (
398+ forge . filesUrl ( info , { id : 7 } ) ,
399+ "https://bitbucket.example.com/rest/api/latest/projects/PRJ/repos/widget/pull-requests/7/changes" )
400+ assert . equal (
401+ forge . prWebUrl ( info , 7 ) ,
402+ "https://bitbucket.example.com/projects/PRJ/repos/widget/pull-requests/7" )
403+ assert . equal ( forge . prNumber ( { id : 7 } ) , 7 )
404+ assert . deepEqual ( forge . authHeader ( "bbs_secret" ) , { Authorization : "Bearer bbs_secret" } )
405+ } )
406+
407+ test ( "bitbucket-server parseUrl extracts project, repo and filepath from a browse URL" , ( ) => {
408+ const forge = buildSelfHostedForge ( { type : "bitbucket-server" , hostname : "bitbucket.example.com" } )
409+ const url = new URL ( "https://bitbucket.example.com/projects/PRJ/repos/widget/browse/src/app.js?at=refs%2Fheads%2Fmain" )
410+ assert . deepEqual ( forge . parseUrl ( url ) , {
411+ projectKey : "PRJ" ,
412+ repoSlug : "widget" ,
413+ filepath : "src/app.js" ,
414+ origin : "https://bitbucket.example.com" ,
415+ } )
416+ } )
417+
418+ test ( "bitbucket-server parseUrl maps a personal repo browse URL to the ~userSlug project" , ( ) => {
419+ const forge = buildSelfHostedForge ( { type : "bitbucket-server" , hostname : "bitbucket.example.com" } )
420+ const url = new URL ( "https://bitbucket.example.com/users/jdoe/repos/widget/browse/dir/app.js?at=refs%2Fheads%2Fmain" )
421+ assert . deepEqual ( forge . parseUrl ( url ) , {
422+ projectKey : "~jdoe" ,
423+ repoSlug : "widget" ,
424+ filepath : "dir/app.js" ,
425+ origin : "https://bitbucket.example.com" ,
426+ } )
427+ } )
428+
429+ test ( "bitbucket-server addresses a personal repo as ~userSlug in the API but /users on the web" , ( ) => {
430+ const forge = buildSelfHostedForge ( { type : "bitbucket-server" , hostname : "bitbucket.example.com" } )
431+ const info = { projectKey : "~jdoe" , repoSlug : "widget" , origin : "https://bitbucket.example.com" }
432+ assert . equal (
433+ forge . listPRsUrl ( info ) ,
434+ "https://bitbucket.example.com/rest/api/latest/projects/~jdoe/repos/widget/pull-requests?state=OPEN" )
435+ assert . equal (
436+ forge . prWebUrl ( info , 7 ) ,
437+ "https://bitbucket.example.com/users/jdoe/repos/widget/pull-requests/7" )
438+ } )
439+
440+ test ( "bitbucket-server pullRequests and filenames unwrap the paginated envelopes" , ( ) => {
441+ const forge = buildSelfHostedForge ( { type : "bitbucket-server" , hostname : "bitbucket.example.com" } )
442+ assert . deepEqual ( forge . pullRequests ( { values : [ { id : 1 } , { id : 2 } ] } ) , [ { id : 1 } , { id : 2 } ] )
443+ const changes = { values : [
444+ { path : { toString : "a.js" } } ,
445+ { path : { toString : "dir/b.js" } } ,
446+ ] }
447+ assert . deepEqual ( forge . filenames ( changes ) , [ "a.js" , "dir/b.js" ] )
448+ } )
449+
386450test ( "the public instance and a self-hosted instance share one family" , ( ) => {
387451 // the inversion: gitlab.com is itself an instanceOf the GitLab family, the
388452 // same family a self-hosted GitLab is built from, so they share a prototype
0 commit comments