Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gzupanda
code-server
提交
d31439ec
C
code-server
项目概览
gzupanda
/
code-server
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
code-server
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
d31439ec
编写于
4月 24, 2021
作者:
R
repo-ranger[bot]
提交者:
GitHub
4月 24, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #3200 from cdr/jsjoeio/add-test-browser-register
feat(testing): add tests for registerServiceWorker
上级
5ad8e686
83746c8a
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
96 addition
and
3 deletion
+96
-3
src/browser/register.ts
src/browser/register.ts
+2
-2
test/unit/register.test.ts
test/unit/register.test.ts
+93
-0
test/unit/util.test.ts
test/unit/util.test.ts
+1
-1
未找到文件。
src/browser/register.ts
浏览文件 @
d31439ec
...
...
@@ -4,12 +4,12 @@ import "./pages/error.css"
import
"
./pages/global.css
"
import
"
./pages/login.css
"
async
function
registerServiceWorker
():
Promise
<
void
>
{
export
async
function
registerServiceWorker
():
Promise
<
void
>
{
const
options
=
getOptions
()
const
path
=
normalize
(
`
${
options
.
csStaticBase
}
/dist/serviceWorker.js`
)
try
{
await
navigator
.
serviceWorker
.
register
(
path
,
{
scope
:
(
options
.
base
??
""
)
+
"
/
"
,
scope
:
options
.
base
+
"
/
"
,
})
console
.
log
(
"
[Service Worker] registered
"
)
}
catch
(
error
)
{
...
...
test/unit/register.test.ts
浏览文件 @
d31439ec
import
{
JSDOM
}
from
"
jsdom
"
import
{
loggerModule
}
from
"
../utils/helpers
"
import
{
registerServiceWorker
}
from
"
../../src/browser/register
"
import
{
LocationLike
}
from
"
./util.test
"
describe
(
"
register
"
,
()
=>
{
describe
(
"
when navigator and serviceWorker are defined
"
,
()
=>
{
...
...
@@ -37,6 +39,12 @@ describe("register", () => {
global
.
navigator
=
(
undefined
as
unknown
)
as
Navigator
&
typeof
globalThis
global
.
location
=
(
undefined
as
unknown
)
as
Location
&
typeof
globalThis
})
it
(
"
test should have access to browser globals from beforeAll
"
,
()
=>
{
expect
(
typeof
global
.
window
).
not
.
toBeFalsy
()
expect
(
typeof
global
.
document
).
not
.
toBeFalsy
()
expect
(
typeof
global
.
navigator
).
not
.
toBeFalsy
()
expect
(
typeof
global
.
location
).
not
.
toBeFalsy
()
})
it
(
"
should register a ServiceWorker
"
,
()
=>
{
// Load service worker like you would in the browser
...
...
@@ -84,4 +92,89 @@ describe("register", () => {
expect
(
spy
).
toHaveBeenCalledWith
(
"
[Service Worker] navigator is undefined
"
)
})
})
describe
(
"
registerServiceWorker
"
,
()
=>
{
let
serviceWorkerPath
:
string
let
serviceWorkerScope
:
string
const
mockFn
=
jest
.
fn
((
path
:
string
,
options
:
{
scope
:
string
})
=>
{
serviceWorkerPath
=
path
serviceWorkerScope
=
options
.
scope
return
undefined
})
beforeAll
(()
=>
{
const
location
:
LocationLike
=
{
pathname
:
""
,
origin
:
"
http://localhost:8080
"
,
}
const
{
window
}
=
new
JSDOM
()
global
.
window
=
(
window
as
unknown
)
as
Window
&
typeof
globalThis
global
.
document
=
window
.
document
global
.
navigator
=
window
.
navigator
global
.
location
=
location
as
Location
Object
.
defineProperty
(
global
.
navigator
,
"
serviceWorker
"
,
{
value
:
{
register
:
mockFn
,
},
})
})
afterEach
(()
=>
{
mockFn
.
mockClear
()
jest
.
resetModules
()
})
afterAll
(()
=>
{
jest
.
restoreAllMocks
()
// We don't want these to stay around because it can affect other tests
global
.
window
=
(
undefined
as
unknown
)
as
Window
&
typeof
globalThis
global
.
document
=
(
undefined
as
unknown
)
as
Document
&
typeof
globalThis
global
.
navigator
=
(
undefined
as
unknown
)
as
Navigator
&
typeof
globalThis
global
.
location
=
(
undefined
as
unknown
)
as
Location
&
typeof
globalThis
})
it
(
"
should register when options.base is undefined
"
,
async
()
=>
{
// Mock getElementById
const
csStaticBasePath
=
"
/static/development/Users/jp/Dev/code-server
"
const
spy
=
jest
.
spyOn
(
document
,
"
getElementById
"
)
// Create a fake element and set the attribute
const
mockElement
=
document
.
createElement
(
"
div
"
)
mockElement
.
id
=
"
coder-options
"
mockElement
.
setAttribute
(
"
data-settings
"
,
`{"csStaticBase":"
${
csStaticBasePath
}
","logLevel":2,"disableTelemetry":false,"disableUpdateCheck":false}`
,
)
// Return mockElement from the spy
// this way, when we call "getElementById"
// it returns the element
spy
.
mockImplementation
(()
=>
mockElement
)
await
registerServiceWorker
()
expect
(
mockFn
).
toBeCalled
()
expect
(
serviceWorkerPath
).
toMatch
(
`
${
csStaticBasePath
}
/dist/serviceWorker.js`
)
expect
(
serviceWorkerScope
).
toMatch
(
"
/
"
)
})
it
(
"
should register when options.base is defined
"
,
async
()
=>
{
const
csStaticBasePath
=
"
/static/development/Users/jp/Dev/code-server
"
const
spy
=
jest
.
spyOn
(
document
,
"
getElementById
"
)
// Create a fake element and set the attribute
const
mockElement
=
document
.
createElement
(
"
div
"
)
mockElement
.
id
=
"
coder-options
"
mockElement
.
setAttribute
(
"
data-settings
"
,
`{"base":"proxy/","csStaticBase":"
${
csStaticBasePath
}
","logLevel":2,"disableTelemetry":false,"disableUpdateCheck":false}`
,
)
// Return mockElement from the spy
// this way, when we call "getElementById"
// it returns the element
spy
.
mockImplementation
(()
=>
mockElement
)
await
registerServiceWorker
()
expect
(
mockFn
).
toBeCalled
()
expect
(
serviceWorkerPath
).
toMatch
(
`/dist/serviceWorker.js`
)
expect
(
serviceWorkerScope
).
toMatch
(
"
/
"
)
})
})
})
test/unit/util.test.ts
浏览文件 @
d31439ec
...
...
@@ -16,7 +16,7 @@ import { loggerModule } from "../utils/helpers"
const
dom
=
new
JSDOM
()
global
.
document
=
dom
.
window
.
document
type
LocationLike
=
Pick
<
Location
,
"
pathname
"
|
"
origin
"
>
export
type
LocationLike
=
Pick
<
Location
,
"
pathname
"
|
"
origin
"
>
// jest.mock is hoisted above the imports so we must use `require` here.
jest
.
mock
(
"
@coder/logger
"
,
()
=>
require
(
"
../utils/helpers
"
).
loggerModule
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录