Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
66ad04e4
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
66ad04e4
编写于
7月 10, 2018
作者:
W
Winnie Hellmann
提交者:
Mike Greiling
7月 10, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Mock timeouts and Promise in SmartInterval tests
上级
5bd8bfb6
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
130 addition
and
99 deletion
+130
-99
spec/javascripts/helpers/wait_for_promises.js
spec/javascripts/helpers/wait_for_promises.js
+1
-0
spec/javascripts/job_spec.js
spec/javascripts/job_spec.js
+12
-15
spec/javascripts/smart_interval_spec.js
spec/javascripts/smart_interval_spec.js
+117
-84
未找到文件。
spec/javascripts/helpers/wait_for_promises.js
0 → 100644
浏览文件 @
66ad04e4
export
default
()
=>
new
Promise
(
resolve
=>
requestAnimationFrame
(
resolve
));
spec/javascripts/job_spec.js
浏览文件 @
66ad04e4
...
...
@@ -5,6 +5,7 @@ import { numberToHumanSize } from '~/lib/utils/number_utils';
import
'
~/lib/utils/datetime_utility
'
;
import
Job
from
'
~/job
'
;
import
'
~/breakpoints
'
;
import
waitForPromises
from
'
spec/helpers/wait_for_promises
'
;
describe
(
'
Job
'
,
()
=>
{
const
JOB_URL
=
`
${
gl
.
TEST_HOST
}
/frontend-fixtures/builds-project/-/jobs/1`
;
...
...
@@ -12,10 +13,6 @@ describe('Job', () => {
let
response
;
let
job
;
function
waitForPromise
()
{
return
new
Promise
(
resolve
=>
requestAnimationFrame
(
resolve
));
}
preloadFixtures
(
'
builds/build-with-artifacts.html.raw
'
);
beforeEach
(()
=>
{
...
...
@@ -49,7 +46,7 @@ describe('Job', () => {
beforeEach
(
function
(
done
)
{
job
=
new
Job
();
waitForPromise
()
waitForPromise
s
()
.
then
(
done
)
.
catch
(
done
.
fail
);
});
...
...
@@ -93,7 +90,7 @@ describe('Job', () => {
job
=
new
Job
();
waitForPromise
()
waitForPromise
s
()
.
then
(()
=>
{
expect
(
$
(
'
#build-trace .js-build-output
'
).
text
()).
toMatch
(
/Update/
);
expect
(
job
.
state
).
toBe
(
'
newstate
'
);
...
...
@@ -107,7 +104,7 @@ describe('Job', () => {
};
})
.
then
(()
=>
jasmine
.
clock
().
tick
(
4001
))
.
then
(
waitForPromise
)
.
then
(
waitForPromise
s
)
.
then
(()
=>
{
expect
(
$
(
'
#build-trace .js-build-output
'
).
text
()).
toMatch
(
/UpdateMore/
);
expect
(
job
.
state
).
toBe
(
'
finalstate
'
);
...
...
@@ -126,7 +123,7 @@ describe('Job', () => {
job
=
new
Job
();
waitForPromise
()
waitForPromise
s
()
.
then
(()
=>
{
expect
(
$
(
'
#build-trace .js-build-output
'
).
text
()).
toMatch
(
/Update/
);
...
...
@@ -137,7 +134,7 @@ describe('Job', () => {
};
})
.
then
(()
=>
jasmine
.
clock
().
tick
(
4001
))
.
then
(
waitForPromise
)
.
then
(
waitForPromise
s
)
.
then
(()
=>
{
expect
(
$
(
'
#build-trace .js-build-output
'
).
text
()).
not
.
toMatch
(
/Update/
);
expect
(
$
(
'
#build-trace .js-build-output
'
).
text
()).
toMatch
(
/Different/
);
...
...
@@ -160,7 +157,7 @@ describe('Job', () => {
job
=
new
Job
();
waitForPromise
()
waitForPromise
s
()
.
then
(()
=>
{
expect
(
document
.
querySelector
(
'
.js-truncated-info
'
).
classList
).
not
.
toContain
(
'
hidden
'
);
})
...
...
@@ -181,7 +178,7 @@ describe('Job', () => {
job
=
new
Job
();
waitForPromise
()
waitForPromise
s
()
.
then
(()
=>
{
expect
(
document
.
querySelector
(
'
.js-truncated-info-size
'
).
textContent
.
trim
(),
...
...
@@ -203,7 +200,7 @@ describe('Job', () => {
job
=
new
Job
();
waitForPromise
()
waitForPromise
s
()
.
then
(()
=>
{
expect
(
document
.
querySelector
(
'
.js-truncated-info-size
'
).
textContent
.
trim
(),
...
...
@@ -219,7 +216,7 @@ describe('Job', () => {
};
})
.
then
(()
=>
jasmine
.
clock
().
tick
(
4001
))
.
then
(
waitForPromise
)
.
then
(
waitForPromise
s
)
.
then
(()
=>
{
expect
(
document
.
querySelector
(
'
.js-truncated-info-size
'
).
textContent
.
trim
(),
...
...
@@ -258,7 +255,7 @@ describe('Job', () => {
job
=
new
Job
();
waitForPromise
()
waitForPromise
s
()
.
then
(()
=>
{
expect
(
document
.
querySelector
(
'
.js-truncated-info
'
).
classList
).
toContain
(
'
hidden
'
);
})
...
...
@@ -280,7 +277,7 @@ describe('Job', () => {
job
=
new
Job
();
waitForPromise
()
waitForPromise
s
()
.
then
(
done
)
.
catch
(
done
.
fail
);
});
...
...
spec/javascripts/smart_interval_spec.js
浏览文件 @
66ad04e4
import
$
from
'
jquery
'
;
import
_
from
'
underscore
'
;
import
SmartInterval
from
'
~/smart_interval
'
;
import
waitForPromises
from
'
spec/helpers/wait_for_promises
'
;
describe
(
'
SmartInterval
'
,
function
()
{
const
DEFAULT_MAX_INTERVAL
=
100
;
const
DEFAULT_STARTING_INTERVAL
=
5
;
const
DEFAULT_SHORT_TIMEOUT
=
75
;
const
DEFAULT_LONG_TIMEOUT
=
1000
;
const
DEFAULT_INCREMENT_FACTOR
=
2
;
function
createDefaultSmartInterval
(
config
)
{
...
...
@@ -27,52 +27,65 @@ describe('SmartInterval', function () {
return
new
SmartInterval
(
defaultParams
);
}
beforeEach
(()
=>
{
jasmine
.
clock
().
install
();
});
afterEach
(()
=>
{
jasmine
.
clock
().
uninstall
();
});
describe
(
'
Increment Interval
'
,
function
()
{
beforeEach
(
function
()
{
this
.
smartInterval
=
createDefaultSmartInterval
();
});
it
(
'
should increment the interval delay
'
,
(
done
)
=>
{
const
smartInterval
=
createDefaultSmartInterval
();
it
(
'
should increment the interval delay
'
,
function
(
done
)
{
const
interval
=
this
.
smartInterval
;
setTimeout
(()
=>
{
const
intervalConfig
=
this
.
smartInterval
.
cfg
;
const
iterationCount
=
4
;
const
maxIntervalAfterIterations
=
intervalConfig
.
startingInterval
*
(
intervalConfig
.
incrementByFactorOf
**
(
iterationCount
-
1
));
// 40
const
currentInterval
=
interval
.
getCurrentInterval
();
// Provide some flexibility for performance of testing environment
expect
(
currentInterval
).
toBeGreaterThan
(
intervalConfig
.
startingInterval
);
expect
(
currentInterval
<=
maxIntervalAfterIterations
).
toBeTruthy
();
done
();
},
DEFAULT_SHORT_TIMEOUT
);
// 4 iterations, increment by 2x = (5 + 10 + 20 + 40)
jasmine
.
clock
().
tick
(
DEFAULT_SHORT_TIMEOUT
);
waitForPromises
()
.
then
(()
=>
{
const
intervalConfig
=
smartInterval
.
cfg
;
const
iterationCount
=
4
;
const
maxIntervalAfterIterations
=
intervalConfig
.
startingInterval
*
(
intervalConfig
.
incrementByFactorOf
**
iterationCount
);
const
currentInterval
=
smartInterval
.
getCurrentInterval
();
// Provide some flexibility for performance of testing environment
expect
(
currentInterval
).
toBeGreaterThan
(
intervalConfig
.
startingInterval
);
expect
(
currentInterval
).
toBeLessThanOrEqual
(
maxIntervalAfterIterations
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
it
(
'
should not increment past maxInterval
'
,
function
(
done
)
{
const
interval
=
this
.
smartInterval
;
it
(
'
should not increment past maxInterval
'
,
(
done
)
=>
{
const
smartInterval
=
createDefaultSmartInterval
({
maxInterval
:
DEFAULT_STARTING_INTERVAL
})
;
setTimeout
(()
=>
{
const
currentInterval
=
interval
.
getCurrentInterval
();
expect
(
currentInterval
).
toBe
(
interval
.
cfg
.
maxInterval
);
jasmine
.
clock
().
tick
(
DEFAULT_STARTING_INTERVAL
);
jasmine
.
clock
().
tick
(
DEFAULT_STARTING_INTERVAL
*
DEFAULT_INCREMENT_FACTOR
);
done
();
},
DEFAULT_LONG_TIMEOUT
);
waitForPromises
()
.
then
(()
=>
{
const
currentInterval
=
smartInterval
.
getCurrentInterval
();
expect
(
currentInterval
).
toBe
(
smartInterval
.
cfg
.
maxInterval
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
it
(
'
does not increment while waiting for callback
'
,
function
()
{
jasmine
.
clock
().
install
();
it
(
'
does not increment while waiting for callback
'
,
done
=>
{
const
smartInterval
=
createDefaultSmartInterval
({
callback
:
()
=>
new
Promise
(
$
.
noop
),
});
jasmine
.
clock
().
tick
(
DEFAULT_SHORT_TIMEOUT
);
const
oneInterval
=
smartInterval
.
cfg
.
startingInterval
*
DEFAULT_INCREMENT_FACTOR
;
expect
(
smartInterval
.
getCurrentInterval
()).
toEqual
(
oneInterval
);
jasmine
.
clock
().
uninstall
();
waitForPromises
()
.
then
(()
=>
{
const
oneInterval
=
smartInterval
.
cfg
.
startingInterval
*
DEFAULT_INCREMENT_FACTOR
;
expect
(
smartInterval
.
getCurrentInterval
()).
toEqual
(
oneInterval
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
});
...
...
@@ -84,34 +97,39 @@ describe('SmartInterval', function () {
it
(
'
should cancel an interval
'
,
function
(
done
)
{
const
interval
=
this
.
smartInterval
;
setTimeout
(()
=>
{
interval
.
cancel
();
jasmine
.
clock
().
tick
(
DEFAULT_SHORT_TIMEOUT
);
const
{
intervalId
}
=
interval
.
state
;
const
currentInterval
=
interval
.
getCurrentInterval
();
const
intervalLowerLimit
=
interval
.
cfg
.
startingInterval
;
interval
.
cancel
();
expect
(
intervalId
).
toBeUndefined
();
expect
(
currentInterval
).
toBe
(
intervalLowerLimit
);
waitForPromises
()
.
then
(()
=>
{
const
{
intervalId
}
=
interval
.
state
;
const
currentInterval
=
interval
.
getCurrentInterval
();
const
intervalLowerLimit
=
interval
.
cfg
.
startingInterval
;
done
();
},
DEFAULT_SHORT_TIMEOUT
);
expect
(
intervalId
).
toBeUndefined
();
expect
(
currentInterval
).
toBe
(
intervalLowerLimit
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
it
(
'
should resume an interval
'
,
function
(
done
)
{
const
interval
=
this
.
smartInterval
;
setTimeout
(()
=>
{
interval
.
cancel
();
interval
.
resume
();
jasmine
.
clock
().
tick
(
DEFAULT_SHORT_TIMEOUT
);
const
{
intervalId
}
=
interval
.
state
;
interval
.
cancel
()
;
expect
(
intervalId
).
toBeTruthy
();
interval
.
resume
();
done
();
},
DEFAULT_SHORT_TIMEOUT
);
waitForPromises
()
.
then
(()
=>
{
const
{
intervalId
}
=
interval
.
state
;
expect
(
intervalId
).
toBeTruthy
();
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
});
...
...
@@ -126,64 +144,79 @@ describe('SmartInterval', function () {
it
(
'
should pause when page is not visible
'
,
function
(
done
)
{
const
interval
=
this
.
smartInterval
;
setTimeout
(()
=>
{
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
jasmine
.
clock
().
tick
(
DEFAULT_SHORT_TIMEOUT
);
waitForPromises
()
.
then
(()
=>
{
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
// simulates triggering of visibilitychange event
interval
.
handleVisibilityChange
({
target
:
{
visibilityState
:
'
hidden
'
}
});
// simulates triggering of visibilitychange event
interval
.
handleVisibilityChange
({
target
:
{
visibilityState
:
'
hidden
'
}
});
expect
(
interval
.
state
.
intervalId
).
toBeUndefined
();
done
();
},
DEFAULT_SHORT_TIMEOUT
);
expect
(
interval
.
state
.
intervalId
).
toBeUndefined
();
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
it
(
'
should change to the hidden interval when page is not visible
'
,
function
(
done
)
{
it
(
'
should change to the hidden interval when page is not visible
'
,
done
=>
{
const
HIDDEN_INTERVAL
=
1500
;
const
interval
=
createDefaultSmartInterval
({
hiddenInterval
:
HIDDEN_INTERVAL
});
setTimeout
(()
=>
{
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
expect
(
interval
.
getCurrentInterval
()
>=
DEFAULT_STARTING_INTERVAL
&&
interval
.
getCurrentInterval
()
<=
DEFAULT_MAX_INTERVAL
).
toBeTruthy
();
jasmine
.
clock
().
tick
(
DEFAULT_SHORT_TIMEOUT
);
waitForPromises
()
.
then
(()
=>
{
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
expect
(
interval
.
getCurrentInterval
()
>=
DEFAULT_STARTING_INTERVAL
&&
interval
.
getCurrentInterval
()
<=
DEFAULT_MAX_INTERVAL
).
toBeTruthy
();
// simulates triggering of visibilitychange event
interval
.
handleVisibilityChange
({
target
:
{
visibilityState
:
'
hidden
'
}
});
// simulates triggering of visibilitychange event
interval
.
handleVisibilityChange
({
target
:
{
visibilityState
:
'
hidden
'
}
});
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
expect
(
interval
.
getCurrentInterval
()).
toBe
(
HIDDEN_INTERVAL
);
done
();
},
DEFAULT_SHORT_TIMEOUT
);
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
expect
(
interval
.
getCurrentInterval
()).
toBe
(
HIDDEN_INTERVAL
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
it
(
'
should resume when page is becomes visible at the previous interval
'
,
function
(
done
)
{
const
interval
=
this
.
smartInterval
;
setTimeout
(()
=>
{
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
jasmine
.
clock
().
tick
(
DEFAULT_SHORT_TIMEOUT
);
// simulates triggering of visibilitychange event
interval
.
handleVisibilityChange
({
target
:
{
visibilityState
:
'
hidden
'
}
});
waitForPromises
()
.
then
(()
=>
{
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
expect
(
interval
.
state
.
intervalId
).
toBeUndefined
();
// simulates triggering of visibilitychange event
interval
.
handleVisibilityChange
({
target
:
{
visibilityState
:
'
hidden
'
}
});
// simulates triggering of visibilitychange event
interval
.
handleVisibilityChange
({
target
:
{
visibilityState
:
'
visible
'
}
});
expect
(
interval
.
state
.
intervalId
).
toBeUndefined
();
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
// simulates triggering of visibilitychange event
interval
.
handleVisibilityChange
({
target
:
{
visibilityState
:
'
visible
'
}
});
done
();
},
DEFAULT_SHORT_TIMEOUT
);
expect
(
interval
.
state
.
intervalId
).
toBeTruthy
();
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
it
(
'
should cancel on page unload
'
,
function
(
done
)
{
const
interval
=
this
.
smartInterval
;
setTimeout
(()
=>
{
$
(
document
).
triggerHandler
(
'
beforeunload
'
);
expect
(
interval
.
state
.
intervalId
).
toBeUndefined
();
expect
(
interval
.
getCurrentInterval
()).
toBe
(
interval
.
cfg
.
startingInterval
);
done
();
},
DEFAULT_SHORT_TIMEOUT
);
jasmine
.
clock
().
tick
(
DEFAULT_SHORT_TIMEOUT
);
waitForPromises
()
.
then
(()
=>
{
$
(
document
).
triggerHandler
(
'
beforeunload
'
);
expect
(
interval
.
state
.
intervalId
).
toBeUndefined
();
expect
(
interval
.
getCurrentInterval
()).
toBe
(
interval
.
cfg
.
startingInterval
);
})
.
then
(
done
)
.
catch
(
done
.
fail
);
});
it
(
'
should execute callback before first interval
'
,
function
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录