Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
6a3b4071
Commit
6a3b4071
authored
Jan 23, 2020
by
Natalia Tepluhina
Committed by
Martin Wortschack
Jan 23, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Convert Jest tests to use VTU in 'spec/frontend/vue_shared'
parent
0768943e
Changes
17
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
509 additions
and
397 deletions
+509
-397
app/assets/javascripts/filtered_search/components/recent_searches_dropdown_content.vue
...ed_search/components/recent_searches_dropdown_content.vue
+12
-5
app/assets/javascripts/vue_shared/components/identicon.vue
app/assets/javascripts/vue_shared/components/identicon.vue
+1
-1
app/assets/javascripts/vue_shared/components/issue/issue_warning.vue
...javascripts/vue_shared/components/issue/issue_warning.vue
+3
-3
app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
...ascripts/vue_shared/components/notes/placeholder_note.vue
+1
-1
spec/frontend/filtered_search/components/recent_searches_dropdown_content_spec.js
...earch/components/recent_searches_dropdown_content_spec.js
+80
-156
spec/frontend/vue_shared/components/__snapshots__/code_block_spec.js.snap
...e_shared/components/__snapshots__/code_block_spec.js.snap
+16
-0
spec/frontend/vue_shared/components/__snapshots__/identicon_spec.js.snap
...ue_shared/components/__snapshots__/identicon_spec.js.snap
+11
-0
spec/frontend/vue_shared/components/code_block_spec.js
spec/frontend/vue_shared/components/code_block_spec.js
+15
-23
spec/frontend/vue_shared/components/identicon_spec.js
spec/frontend/vue_shared/components/identicon_spec.js
+24
-56
spec/frontend/vue_shared/components/issue/__snapshots__/issue_warning_spec.js.snap
...components/issue/__snapshots__/issue_warning_spec.js.snap
+62
-0
spec/frontend/vue_shared/components/issue/issue_warning_spec.js
...rontend/vue_shared/components/issue/issue_warning_spec.js
+87
-47
spec/frontend/vue_shared/components/markdown/__snapshots__/suggestion_diff_spec.js.snap
...nents/markdown/__snapshots__/suggestion_diff_spec.js.snap
+28
-0
spec/frontend/vue_shared/components/markdown/suggestion_diff_spec.js
...nd/vue_shared/components/markdown/suggestion_diff_spec.js
+34
-49
spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_note_spec.js.snap
...ponents/notes/__snapshots__/placeholder_note_spec.js.snap
+62
-0
spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_system_note_spec.js.snap
.../notes/__snapshots__/placeholder_system_note_spec.js.snap
+15
-0
spec/frontend/vue_shared/components/notes/placeholder_note_spec.js
...tend/vue_shared/components/notes/placeholder_note_spec.js
+42
-38
spec/frontend/vue_shared/components/notes/placeholder_system_note_spec.js
...e_shared/components/notes/placeholder_system_note_spec.js
+16
-18
No files found.
app/assets/javascripts/filtered_search/components/recent_searches_dropdown_content.vue
View file @
6a3b4071
...
@@ -59,21 +59,25 @@ export default {
...
@@ -59,21 +59,25 @@ export default {
</
script
>
</
script
>
<
template
>
<
template
>
<div>
<div>
<div
v-if=
"!isLocalStorageAvailable"
class=
"dropdown-info-note"
>
<div
v-if=
"!isLocalStorageAvailable"
ref=
"localStorageNote"
class=
"dropdown-info-note"
>
{{
__
(
'
This feature requires local storage to be enabled
'
)
}}
{{
__
(
'
This feature requires local storage to be enabled
'
)
}}
</div>
</div>
<ul
v-else-if=
"hasItems"
>
<ul
v-else-if=
"hasItems"
>
<li
v-for=
"(item, index) in processedItems"
:key=
"`processed-items-$
{index}`">
<li
v-for=
"(item, index) in processedItems"
ref=
"dropdownItem"
:key=
"`processed-items-$
{index}`"
>
<button
<button
type=
"button"
type=
"button"
class=
"filtered-search-history-dropdown-item"
class=
"filtered-search-history-dropdown-item
js-dropdown-button
"
@
click=
"onItemActivated(item.text)"
@
click=
"onItemActivated(item.text)"
>
>
<span>
<span>
<span
<span
v-for=
"(token, tokenIndex) in item.tokens"
v-for=
"(token, tokenIndex) in item.tokens"
:key=
"`dropdown-token-$
{tokenIndex}`"
:key=
"`dropdown-token-$
{tokenIndex}`"
class="filtered-search-history-dropdown-token"
class="filtered-search-history-dropdown-token
js-dropdown-token
"
>
>
<span
class=
"name"
>
{{
token
.
prefix
}}
</span>
<span
class=
"name"
>
{{
token
.
prefix
}}
</span>
<span
class=
"name"
>
{{
token
.
operator
}}
</span>
<span
class=
"name"
>
{{
token
.
operator
}}
</span>
...
@@ -88,6 +92,7 @@ export default {
...
@@ -88,6 +92,7 @@ export default {
<li
class=
"divider"
></li>
<li
class=
"divider"
></li>
<li>
<li>
<button
<button
ref=
"clearButton"
type=
"button"
type=
"button"
class=
"filtered-search-history-clear-button"
class=
"filtered-search-history-clear-button"
@
click=
"onRequestClearRecentSearches($event)"
@
click=
"onRequestClearRecentSearches($event)"
...
@@ -96,6 +101,8 @@ export default {
...
@@ -96,6 +101,8 @@ export default {
</button>
</button>
</li>
</li>
</ul>
</ul>
<div
v-else
class=
"dropdown-info-note"
>
{{
__
(
"
You don't have any recent searches
"
)
}}
</div>
<div
v-else
ref=
"dropdownNote"
class=
"dropdown-info-note"
>
{{
__
(
"
You don't have any recent searches
"
)
}}
</div>
</div>
</div>
</
template
>
</
template
>
app/assets/javascripts/vue_shared/components/identicon.vue
View file @
6a3b4071
...
@@ -29,7 +29,7 @@ export default {
...
@@ -29,7 +29,7 @@ export default {
</
script
>
</
script
>
<
template
>
<
template
>
<div
:class=
"[sizeClass, identiconBackgroundClass]"
class=
"avatar identicon"
>
<div
ref=
"identicon"
:class=
"[sizeClass, identiconBackgroundClass]"
class=
"avatar identicon"
>
{{
identiconTitle
}}
{{
identiconTitle
}}
</div>
</div>
</
template
>
</
template
>
app/assets/javascripts/vue_shared/components/issue/issue_warning.vue
View file @
6a3b4071
...
@@ -65,14 +65,14 @@ export default {
...
@@ -65,14 +65,14 @@ export default {
<div
class=
"issuable-note-warning"
>
<div
class=
"issuable-note-warning"
>
<icon
v-if=
"!isLockedAndConfidential"
:name=
"warningIcon"
:size=
"16"
class=
"icon inline"
/>
<icon
v-if=
"!isLockedAndConfidential"
:name=
"warningIcon"
:size=
"16"
class=
"icon inline"
/>
<span
v-if=
"isLockedAndConfidential"
>
<span
v-if=
"isLockedAndConfidential"
ref=
"lockedAndConfidential"
>
<span
v-html=
"confidentialAndLockedDiscussionText"
></span>
<span
v-html=
"confidentialAndLockedDiscussionText"
></span>
{{
{{
__
(
"
People without permission will never get a notification and won't be able to comment.
"
)
__
(
"
People without permission will never get a notification and won't be able to comment.
"
)
}}
}}
</span>
</span>
<span
v-else-if=
"isConfidential"
>
<span
v-else-if=
"isConfidential"
ref=
"confidential"
>
{{
__
(
'
This is a confidential issue.
'
)
}}
{{
__
(
'
This is a confidential issue.
'
)
}}
{{
__
(
'
People without permission will never get a notification.
'
)
}}
{{
__
(
'
People without permission will never get a notification.
'
)
}}
<gl-link
:href=
"confidentialIssueDocsPath"
target=
"_blank"
>
<gl-link
:href=
"confidentialIssueDocsPath"
target=
"_blank"
>
...
@@ -80,7 +80,7 @@ export default {
...
@@ -80,7 +80,7 @@ export default {
</gl-link>
</gl-link>
</span>
</span>
<span
v-else-if=
"isLocked"
>
<span
v-else-if=
"isLocked"
ref=
"locked"
>
{{
__
(
'
This issue is locked.
'
)
}}
{{
__
(
'
This issue is locked.
'
)
}}
{{
__
(
'
Only project members can comment.
'
)
}}
{{
__
(
'
Only project members can comment.
'
)
}}
<gl-link
:href=
"lockedIssueDocsPath"
target=
"_blank"
>
<gl-link
:href=
"lockedIssueDocsPath"
target=
"_blank"
>
...
...
app/assets/javascripts/vue_shared/components/notes/placeholder_note.vue
View file @
6a3b4071
...
@@ -47,7 +47,7 @@ export default {
...
@@ -47,7 +47,7 @@ export default {
:img-size=
"40"
:img-size=
"40"
/>
/>
</div>
</div>
<div
:class=
"
{ discussion: !note.individual_note }" class="timeline-content">
<div
ref=
"note"
:class=
"
{ discussion: !note.individual_note }" class="timeline-content">
<div
class=
"note-header"
>
<div
class=
"note-header"
>
<div
class=
"note-header-info"
>
<div
class=
"note-header-info"
>
<a
:href=
"getUserData.path"
>
<a
:href=
"getUserData.path"
>
...
...
spec/frontend/filtered_search/components/recent_searches_dropdown_content_spec.js
View file @
6a3b4071
import
Vue
from
'
vue
'
;
import
{
shallowMount
}
from
'
@vue/test-utils
'
;
import
eventHub
from
'
~/filtered_search/event_hub
'
;
import
eventHub
from
'
~/filtered_search/event_hub
'
;
import
RecentSearchesDropdownContent
from
'
~/filtered_search/components/recent_searches_dropdown_content.vue
'
;
import
RecentSearchesDropdownContent
from
'
~/filtered_search/components/recent_searches_dropdown_content.vue
'
;
import
IssuableFilteredSearchTokenKeys
from
'
~/filtered_search/issuable_filtered_search_token_keys
'
;
import
IssuableFilteredSearchTokenKeys
from
'
~/filtered_search/issuable_filtered_search_token_keys
'
;
const
createComponent
=
propsData
=>
{
describe
(
'
Recent Searches Dropdown Content
'
,
()
=>
{
const
Component
=
Vue
.
extend
(
RecentSearchesDropdownContent
);
let
wrapper
;
return
new
Component
({
const
findLocalStorageNote
=
()
=>
wrapper
.
find
({
ref
:
'
localStorageNote
'
});
el
:
document
.
createElement
(
'
div
'
),
const
findDropdownItems
=
()
=>
wrapper
.
findAll
({
ref
:
'
dropdownItem
'
});
propsData
,
const
findDropdownNote
=
()
=>
wrapper
.
find
({
ref
:
'
dropdownNote
'
});
});
};
const
createComponent
=
props
=>
{
wrapper
=
shallowMount
(
RecentSearchesDropdownContent
,
{
// Remove all the newlines and whitespace from the formatted markup
propsData
:
{
const
trimMarkupWhitespace
=
text
=>
text
.
replace
(
/
(\n
|
\s)
+/gm
,
'
'
).
trim
();
allowedKeys
:
IssuableFilteredSearchTokenKeys
.
getKeys
(),
items
:
[],
describe
(
'
RecentSearchesDropdownContent
'
,
()
=>
{
isLocalStorageAvailable
:
false
,
const
propsDataWithoutItems
=
{
...
props
,
items
:
[],
},
allowedKeys
:
IssuableFilteredSearchTokenKeys
.
getKeys
(),
});
};
const
propsDataWithItems
=
{
items
:
[
'
foo
'
,
'
author:@root label:~foo bar
'
],
allowedKeys
:
IssuableFilteredSearchTokenKeys
.
getKeys
(),
};
};
let
vm
;
afterEach
(()
=>
{
afterEach
(()
=>
{
if
(
vm
)
{
wrapper
.
destroy
();
vm
.
$destroy
();
wrapper
=
null
;
}
});
});
describe
(
'
with no items
'
,
()
=>
{
describe
(
'
when local storage is not available
'
,
()
=>
{
let
el
;
beforeEach
(()
=>
{
beforeEach
(()
=>
{
vm
=
createComponent
(
propsDataWithoutItems
);
createComponent
();
el
=
vm
.
$el
;
});
});
it
(
'
should render empty state
'
,
()
=>
{
it
(
'
renders a note about enabling local storage
'
,
()
=>
{
expect
(
el
.
querySelector
(
'
.dropdown-info-note
'
)).
toBeDefined
();
expect
(
findLocalStorageNote
().
exists
()).
toBe
(
true
);
const
items
=
el
.
querySelectorAll
(
'
.filtered-search-history-dropdown-item
'
);
expect
(
items
.
length
).
toEqual
(
propsDataWithoutItems
.
items
.
length
);
});
});
});
describe
(
'
with items
'
,
()
=>
{
let
el
;
beforeEach
(()
=>
{
it
(
'
does not render dropdown items
'
,
()
=>
{
vm
=
createComponent
(
propsDataWithItems
);
expect
(
findDropdownItems
().
exists
()).
toBe
(
false
);
el
=
vm
.
$el
;
});
});
it
(
'
should render clear recent searches button
'
,
()
=>
{
it
(
'
does not render dropdownNote
'
,
()
=>
{
expect
(
el
.
querySelector
(
'
.filtered-search-history-clear-button
'
)).
toBeDefined
(
);
expect
(
findDropdownNote
().
exists
()).
toBe
(
false
);
});
});
});
it
(
'
should render recent search items
'
,
()
=>
{
describe
(
'
when localStorage is available and items array is not empty
'
,
()
=>
{
const
items
=
el
.
querySelectorAll
(
'
.filtered-search-history-dropdown-item
'
);
let
onRecentSearchesItemSelectedSpy
;
let
onRequestClearRecentSearchesSpy
;
expect
(
items
.
length
).
toEqual
(
propsDataWithItems
.
items
.
length
);
expect
(
beforeAll
(()
=>
{
trimMarkupWhitespace
(
onRecentSearchesItemSelectedSpy
=
jest
.
fn
();
items
[
0
].
querySelector
(
'
.filtered-search-history-dropdown-search-token
'
).
textContent
,
onRequestClearRecentSearchesSpy
=
jest
.
fn
();
),
eventHub
.
$on
(
'
recentSearchesItemSelected
'
,
onRecentSearchesItemSelectedSpy
);
).
toEqual
(
'
foo
'
);
eventHub
.
$on
(
'
requestClearRecentSearches
'
,
onRequestClearRecentSearchesSpy
);
const
item1Tokens
=
items
[
1
].
querySelectorAll
(
'
.filtered-search-history-dropdown-token
'
);
expect
(
item1Tokens
.
length
).
toEqual
(
2
);
expect
(
item1Tokens
[
0
].
querySelector
(
'
.name
'
).
textContent
).
toEqual
(
'
author:
'
);
expect
(
item1Tokens
[
0
].
querySelector
(
'
.value
'
).
textContent
).
toEqual
(
'
@root
'
);
expect
(
item1Tokens
[
1
].
querySelector
(
'
.name
'
).
textContent
).
toEqual
(
'
label:
'
);
expect
(
item1Tokens
[
1
].
querySelector
(
'
.value
'
).
textContent
).
toEqual
(
'
~foo
'
);
expect
(
trimMarkupWhitespace
(
items
[
1
].
querySelector
(
'
.filtered-search-history-dropdown-search-token
'
).
textContent
,
),
).
toEqual
(
'
bar
'
);
});
});
});
describe
(
'
if isLocalStorageAvailable is `false`
'
,
()
=>
{
let
el
;
beforeEach
(()
=>
{
beforeEach
(()
=>
{
c
onst
props
=
Object
.
assign
({
isLocalStorageAvailable
:
false
},
propsDataWithItems
);
c
reateComponent
({
items
:
[
'
foo
'
,
'
author:@root label:~foo bar
'
],
vm
=
createComponent
(
props
);
isLocalStorageAvailable
:
true
,
el
=
vm
.
$el
;
})
;
});
});
it
(
'
should render an info note
'
,
()
=>
{
afterAll
(()
=>
{
const
note
=
el
.
querySelector
(
'
.dropdown-info-note
'
);
eventHub
.
$off
(
'
recentSearchesItemSelected
'
,
onRecentSearchesItemSelectedSpy
);
const
items
=
el
.
querySelectorAll
(
'
.filtered-search-history-dropdown-item
'
);
eventHub
.
$off
(
'
requestClearRecentSearchesSpy
'
,
onRequestClearRecentSearchesSpy
);
});
expect
(
note
).
toBeDefined
();
it
(
'
does not render a note about enabling local storage
'
,
()
=>
{
expect
(
note
.
innerText
.
trim
()).
toBe
(
'
This feature requires local storage to be enabled
'
);
expect
(
findLocalStorageNote
().
exists
()).
toBe
(
false
);
expect
(
items
.
length
).
toEqual
(
propsDataWithoutItems
.
items
.
length
);
});
});
});
describe
(
'
computed
'
,
()
=>
{
it
(
'
does not render dropdownNote
'
,
()
=>
{
describe
(
'
processedItems
'
,
()
=>
{
expect
(
findDropdownNote
().
exists
()).
toBe
(
false
);
it
(
'
with items
'
,
()
=>
{
});
vm
=
createComponent
(
propsDataWithItems
);
const
{
processedItems
}
=
vm
;
expect
(
processedItems
.
length
).
toEqual
(
2
);
expect
(
processedItems
[
0
].
text
).
toEqual
(
propsDataWithItems
.
items
[
0
]);
expect
(
processedItems
[
0
].
tokens
).
toEqual
([]);
expect
(
processedItems
[
0
].
searchToken
).
toEqual
(
'
foo
'
);
expect
(
processedItems
[
1
].
text
).
toEqual
(
propsDataWithItems
.
items
[
1
]);
expect
(
processedItems
[
1
].
tokens
.
length
).
toEqual
(
2
);
expect
(
processedItems
[
1
].
tokens
[
0
].
prefix
).
toEqual
(
'
author:
'
);
expect
(
processedItems
[
1
].
tokens
[
0
].
suffix
).
toEqual
(
'
@root
'
);
expect
(
processedItems
[
1
].
tokens
[
1
].
prefix
).
toEqual
(
'
label:
'
);
expect
(
processedItems
[
1
].
tokens
[
1
].
suffix
).
toEqual
(
'
~foo
'
);
expect
(
processedItems
[
1
].
searchToken
).
toEqual
(
'
bar
'
);
});
it
(
'
with no
items
'
,
()
=>
{
it
(
'
renders a correct amount of dropdown
items
'
,
()
=>
{
vm
=
createComponent
(
propsDataWithoutItems
);
expect
(
findDropdownItems
()).
toHaveLength
(
2
);
const
{
processedItems
}
=
vm
;
})
;
expect
(
processedItems
.
length
).
toEqual
(
0
);
it
(
'
expect second dropdown to have 2 tokens
'
,
()
=>
{
});
expect
(
findDropdownItems
()
.
at
(
1
)
.
findAll
(
'
.js-dropdown-token
'
),
).
toHaveLength
(
2
);
});
});
describe
(
'
hasItems
'
,
()
=>
{
it
(
'
emits recentSearchesItemSelected on dropdown item click
'
,
()
=>
{
it
(
'
with items
'
,
()
=>
{
findDropdownItems
()
vm
=
createComponent
(
propsDataWithItems
);
.
at
(
0
)
const
{
hasItems
}
=
vm
;
.
find
(
'
.js-dropdown-button
'
)
.
trigger
(
'
click
'
);
expect
(
hasItems
).
toEqual
(
true
);
expect
(
onRecentSearchesItemSelectedSpy
).
toHaveBeenCalledWith
(
'
foo
'
);
});
});
it
(
'
with no items
'
,
()
=>
{
it
(
'
emits requestClearRecentSearches on Clear resent searches button
'
,
()
=>
{
vm
=
createComponent
(
propsDataWithoutItems
);
wrapper
.
find
({
ref
:
'
clearButton
'
}).
trigger
(
'
click
'
);
const
{
hasItems
}
=
vm
;
expect
(
hasItems
).
toEqual
(
false
);
expect
(
onRequestClearRecentSearchesSpy
).
toHaveBeenCalled
();
});
});
});
});
});
describe
(
'
methods
'
,
()
=>
{
describe
(
'
when locale storage is available and items array is empty
'
,
()
=>
{
describe
(
'
onItemActivated
'
,
()
=>
{
beforeEach
(()
=>
{
let
onRecentSearchesItemSelectedSpy
;
createComponent
({
isLocalStorageAvailable
:
true
,
beforeEach
(()
=>
{
onRecentSearchesItemSelectedSpy
=
jest
.
fn
();
eventHub
.
$on
(
'
recentSearchesItemSelected
'
,
onRecentSearchesItemSelectedSpy
);
vm
=
createComponent
(
propsDataWithItems
);
});
afterEach
(()
=>
{
eventHub
.
$off
(
'
recentSearchesItemSelected
'
,
onRecentSearchesItemSelectedSpy
);
});
it
(
'
emits event
'
,
()
=>
{
expect
(
onRecentSearchesItemSelectedSpy
).
not
.
toHaveBeenCalled
();
vm
.
onItemActivated
(
'
something
'
);
expect
(
onRecentSearchesItemSelectedSpy
).
toHaveBeenCalledWith
(
'
something
'
);
});
});
});
});
describe
(
'
onRequestClearRecentSearches
'
,
()
=>
{
it
(
'
does not render a note about enabling local storage
'
,
()
=>
{
let
onRequestClearRecentSearchesSpy
;
expect
(
findLocalStorageNote
().
exists
()).
toBe
(
false
);
});
beforeEach
(()
=>
{
onRequestClearRecentSearchesSpy
=
jest
.
fn
();
eventHub
.
$on
(
'
requestClearRecentSearches
'
,
onRequestClearRecentSearchesSpy
);
vm
=
createComponent
(
propsDataWithItems
);
});
afterEach
(()
=>
{
eventHub
.
$off
(
'
requestClearRecentSearches
'
,
onRequestClearRecentSearchesSpy
);
});
it
(
'
emits event
'
,
()
=>
{
it
(
'
does not render dropdown items
'
,
()
=>
{
expect
(
onRequestClearRecentSearchesSpy
).
not
.
toHaveBeenCalled
(
);
expect
(
findDropdownItems
().
exists
()).
toBe
(
false
);
vm
.
onRequestClearRecentSearches
({
stopPropagation
:
()
=>
{}
});
});
expect
(
onRequestClearRecentSearchesSpy
).
toHaveBeenCalled
();
it
(
'
renders dropdown note
'
,
()
=>
{
}
);
expect
(
findDropdownNote
().
exists
()).
toBe
(
true
);
});
});
});
});
});
});
spec/frontend/vue_shared/components/__snapshots__/code_block_spec.js.snap
0 → 100644
View file @
6a3b4071
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Code Block matches snapshot 1`] = `
<pre
class="code-block rounded"
>
<code
class="d-block"
>
test-code
</code>
</pre>
`;
spec/frontend/vue_shared/components/__snapshots__/identicon_spec.js.snap
0 → 100644
View file @
6a3b4071
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Identicon matches snapshot 1`] = `
<div
class="avatar identicon s40 bg2"
>
E
</div>
`;
spec/frontend/vue_shared/components/code_block_spec.js
View file @
6a3b4071
import
Vue
from
'
vue
'
;
import
{
shallowMount
}
from
'
@vue/test-utils
'
;
import
component
from
'
~/vue_shared/components/code_block.vue
'
;
import
CodeBlock
from
'
~/vue_shared/components/code_block.vue
'
;
import
mountComponent
from
'
../../helpers/vue_mount_component_helper
'
;
describe
(
'
Code Block
'
,
()
=>
{
describe
(
'
Code Block
'
,
()
=>
{
const
Component
=
Vue
.
extend
(
component
);
let
wrapper
;
let
vm
;
afterEach
(()
=>
{
const
createComponent
=
()
=>
{
vm
.
$destroy
();
wrapper
=
shallowMount
(
CodeBlock
,
{
});
propsData
:
{
code
:
'
test-code
'
,
it
(
'
renders a code block with the provided code
'
,
()
=>
{
},
const
code
=
"
Failure/Error: is_expected.to eq(3)
\n\n
expected: 3
\n
got: -1
\n\n
(compared using ==)
\n
./spec/test_spec.rb:12:in `block (4 levels) in
\
u003ctop (required)
\
u003e'
"
;
vm
=
mountComponent
(
Component
,
{
code
,
});
});
};
expect
(
vm
.
$el
.
querySelector
(
'
code
'
).
textContent
).
toEqual
(
code
);
afterEach
(()
=>
{
wrapper
.
destroy
();
wrapper
=
null
;
});
});
it
(
'
escapes XSS injections
'
,
()
=>
{
it
(
'
matches snapshot
'
,
()
=>
{
const
code
=
'
CCC<img src=x onerror=alert(document.domain)>
'
;
createComponent
();
vm
=
mountComponent
(
Component
,
{
code
,
});
expect
(
vm
.
$el
.
querySelector
(
'
code
'
).
textContent
).
toEqual
(
code
);
expect
(
wrapper
.
element
).
toMatchSnapshot
(
);
});
});
});
});
spec/frontend/vue_shared/components/identicon_spec.js
View file @
6a3b4071
import
Vue
from
'
vue
'
;
import
{
shallowMount
}
from
'
@vue/test-utils
'
;
import
identiconComponent
from
'
~/vue_shared/components/identicon.vue
'
;
import
IdenticonComponent
from
'
~/vue_shared/components/identicon.vue
'
;
const
createComponent
=
sizeClass
=>
{
describe
(
'
Identicon
'
,
()
=>
{
const
Component
=
Vue
.
extend
(
identiconComponent
);
let
wrapper
;
return
new
Component
({
const
createComponent
=
()
=>
{
propsData
:
{
wrapper
=
shallowMount
(
IdenticonComponent
,
{
entityId
:
1
,
propsData
:
{
entityName
:
'
entity-name
'
,
entityId
:
1
,
sizeClass
,
entityName
:
'
entity-name
'
,
},
sizeClass
:
'
s40
'
,
}).
$mount
();
},
};
describe
(
'
IdenticonComponent
'
,
()
=>
{
describe
(
'
computed
'
,
()
=>
{
let
vm
;
beforeEach
(()
=>
{
vm
=
createComponent
();
});
afterEach
(()
=>
{
vm
.
$destroy
();
});
describe
(
'
identiconBackgroundClass
'
,
()
=>
{
it
(
'
should return bg class based on entityId
'
,
()
=>
{
vm
.
entityId
=
4
;
expect
(
vm
.
identiconBackgroundClass
).
toBeDefined
();
expect
(
vm
.
identiconBackgroundClass
).
toBe
(
'
bg5
'
);
});
});
});
};
describe
(
'
identiconTitle
'
,
()
=>
{
afterEach
(()
=>
{
it
(
'
should return first letter of entity title in uppercase
'
,
()
=>
{
wrapper
.
destroy
();
vm
.
entityName
=
'
dummy-group
'
;
wrapper
=
null
;
expect
(
vm
.
identiconTitle
).
toBeDefined
();
expect
(
vm
.
identiconTitle
).
toBe
(
'
D
'
);
});
});
});
});
describe
(
'
template
'
,
()
=>
{
it
(
'
matches snapshot
'
,
()
=>
{
it
(
'
should render identicon
'
,
()
=>
{
createComponent
();
const
vm
=
createComponent
();
expect
(
vm
.
$el
.
nodeName
).
toBe
(
'
DIV
'
);
expect
(
wrapper
.
element
).
toMatchSnapshot
();
expect
(
vm
.
$el
.
classList
.
contains
(
'
identicon
'
)).
toBeTruthy
();
});
expect
(
vm
.
$el
.
classList
.
contains
(
'
s40
'
)).
toBeTruthy
();
expect
(
vm
.
$el
.
classList
.
contains
(
'
bg2
'
)).
toBeTruthy
();
vm
.
$destroy
();
});
it
(
'
should render identicon with provided sizing class
'
,
()
=>
{
it
(
'
adds a correct class to identicon
'
,
()
=>
{
const
vm
=
createComponent
(
'
s32
'
);
createComponent
(
);
expect
(
vm
.
$el
.
classList
.
contains
(
'
s32
'
)).
toBeTruthy
();
expect
(
wrapper
.
find
({
ref
:
'
identicon
'
}).
classes
()).
toContain
(
'
bg2
'
);
vm
.
$destroy
();
});
});
});
});
});
spec/frontend/vue_shared/components/issue/__snapshots__/issue_warning_spec.js.snap
0 → 100644
View file @
6a3b4071
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Issue Warning Component when issue is confidential but not locked renders information about confidential issue 1`] = `
<span>
This is a confidential issue.
People without permission will never get a notification.
<gl-link-stub
href="confidential-path"
target="_blank"
>
Learn more
</gl-link-stub>
</span>
`;
exports[`Issue Warning Component when issue is locked and confidential renders information about locked and confidential issue 1`] = `
<span>
<span>
This issue is
<a
href=""
rel="noopener noreferrer"
target="_blank"
>
confidential
</a>
and
<a
href=""
rel="noopener noreferrer"
target="_blank"
>
locked
</a>
.
</span>
People without permission will never get a notification and won't be able to comment.
</span>
`;
exports[`Issue Warning Component when issue is locked but not confidential renders information about locked issue 1`] = `
<span>
This issue is locked.
Only project members can comment.
<gl-link-stub
href="locked-path"
target="_blank"
>
Learn more
</gl-link-stub>
</span>
`;
spec/frontend/vue_shared/components/issue/issue_warning_spec.js
View file @
6a3b4071
import
Vue
from
'
vue
'
;
import
{
shallowMount
}
from
'
@vue/test-utils
'
;
import
mountComponent
from
'
helpers/vue_mount_component_helper
'
;
import
IssueWarning
from
'
~/vue_shared/components/issue/issue_warning.vue
'
;
import
issueWarning
from
'
~/vue_shared/components/issue/issue_warning
.vue
'
;
import
Icon
from
'
~/vue_shared/components/icon
.vue
'
;
const
IssueWarning
=
Vue
.
extend
(
issueWarning
);
describe
(
'
Issue Warning Component
'
,
()
=>
{
let
wrapper
;
function
formatWarning
(
string
)
{
const
findIcon
=
()
=>
wrapper
.
find
(
Icon
);
// Replace newlines with a space then replace multiple spaces with one space
const
findLockedBlock
=
()
=>
wrapper
.
find
({
ref
:
'
locked
'
});
return
string
const
findConfidentialBlock
=
()
=>
wrapper
.
find
({
ref
:
'
confidential
'
});
.
trim
()
const
findLockedAndConfidentialBlock
=
()
=>
wrapper
.
find
({
ref
:
'
lockedAndConfidential
'
});
.
replace
(
/
\n
/g
,
'
'
)
.
replace
(
/
\s\s
+/g
,
'
'
);
}
describe
(
'
Issue Warning Component
'
,
()
=>
{
const
createComponent
=
props
=>
{
describe
(
'
isLocked
'
,
()
=>
{
wrapper
=
shallowMount
(
IssueWarning
,
{
it
(
'
should render locked issue warning information
'
,
()
=>
{
propsData
:
{
const
props
=
{
...
props
,
},
});
};
afterEach
(()
=>
{
wrapper
.
destroy
();
wrapper
=
null
;
});
describe
(
'
when issue is locked but not confidential
'
,
()
=>
{
beforeEach
(()
=>
{
createComponent
({
isLocked
:
true
,
isLocked
:
true
,
lockedIssueDocsPath
:
'
docs/issues/locked
'
,
lockedIssueDocsPath
:
'
locked-path
'
,
};
isConfidential
:
false
,
const
vm
=
mountComponent
(
IssueWarning
,
props
);
});
});
expect
(
vm
.
$el
.
querySelector
(
'
.icon use
'
).
getAttributeNS
(
'
http://www.w3.org/1999/xlink
'
,
'
href
'
),
it
(
'
renders information about locked issue
'
,
()
=>
{
).
toMatch
(
/lock$/
);
expect
(
findLockedBlock
().
exists
()).
toBe
(
true
);
expect
(
formatWarning
(
vm
.
$el
.
querySelector
(
'
span
'
).
textContent
)).
toEqual
(
expect
(
findLockedBlock
().
element
).
toMatchSnapshot
();
'
This issue is locked. Only project members can comment. Learn more
'
,
});
);
expect
(
vm
.
$el
.
querySelector
(
'
a
'
).
href
).
toContain
(
props
.
lockedIssueDocsPath
);
it
(
'
renders warning icon
'
,
()
=>
{
expect
(
findIcon
().
exists
()).
toBe
(
true
);
});
it
(
'
does not render information about locked and confidential issue
'
,
()
=>
{
expect
(
findLockedAndConfidentialBlock
().
exists
()).
toBe
(
false
);
});
it
(
'
does not render information about confidential issue
'
,
()
=>
{
expect
(
findConfidentialBlock
().
exists
()).
toBe
(
false
);
});
});
});
});
describe
(
'
isConfidential
'
,
()
=>
{
describe
(
'
when issue is confidential but not locked
'
,
()
=>
{
it
(
'
should render confidential issue warning information
'
,
()
=>
{
beforeEach
(()
=>
{
const
props
=
{
createComponent
({
isLocked
:
false
,
isConfidential
:
true
,
isConfidential
:
true
,
confidentialIssueDocsPath
:
'
/docs/issues/confidential
'
,
confidentialIssueDocsPath
:
'
confidential-path
'
,
};
});
const
vm
=
mountComponent
(
IssueWarning
,
props
);
});
expect
(
it
(
'
renders information about confidential issue
'
,
()
=>
{
vm
.
$el
.
querySelector
(
'
.icon use
'
).
getAttributeNS
(
'
http://www.w3.org/1999/xlink
'
,
'
href
'
),
expect
(
findConfidentialBlock
().
exists
()).
toBe
(
true
);
).
toMatch
(
/eye-slash$/
);
expect
(
findConfidentialBlock
().
element
).
toMatchSnapshot
();
expect
(
formatWarning
(
vm
.
$el
.
querySelector
(
'
span
'
).
textContent
)).
toEqual
(
});
'
This is a confidential issue. People without permission will never get a notification. Learn more
'
,
);
it
(
'
renders warning icon
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
a
'
).
href
).
toContain
(
props
.
confidentialIssueDocsPath
);
expect
(
wrapper
.
find
(
Icon
).
exists
()).
toBe
(
true
);
});
it
(
'
does not render information about locked issue
'
,
()
=>
{
expect
(
findLockedBlock
().
exists
()).
toBe
(
false
);
});
it
(
'
does not render information about locked and confidential issue
'
,
()
=>
{
expect
(
findLockedAndConfidentialBlock
().
exists
()).
toBe
(
false
);
});
});
});
});
describe
(
'
isLocked and isC
onfidential
'
,
()
=>
{
describe
(
'
when issue is locked and c
onfidential
'
,
()
=>
{
it
(
'
should render locked and confidential issue warning information
'
,
()
=>
{
beforeEach
(
()
=>
{
c
onst
vm
=
mountComponent
(
IssueWarning
,
{
c
reateComponent
(
{
isLocked
:
true
,
isLocked
:
true
,
isConfidential
:
true
,
isConfidential
:
true
,
});
});
});
it
(
'
renders information about locked and confidential issue
'
,
()
=>
{
expect
(
findLockedAndConfidentialBlock
().
exists
()).
toBe
(
true
);
expect
(
findLockedAndConfidentialBlock
().
element
).
toMatchSnapshot
();
});
it
(
'
does not render warning icon
'
,
()
=>
{
expect
(
wrapper
.
find
(
Icon
).
exists
()).
toBe
(
false
);
});
it
(
'
does not render information about locked issue
'
,
()
=>
{
expect
(
findLockedBlock
().
exists
()).
toBe
(
false
);
});
expect
(
vm
.
$el
.
querySelector
(
'
.icon
'
)).
toBeFalsy
();
it
(
'
does not render information about confidential issue
'
,
()
=>
{
expect
(
formatWarning
(
vm
.
$el
.
querySelector
(
'
span
'
).
textContent
)).
toEqual
(
expect
(
findConfidentialBlock
().
exists
()).
toBe
(
false
);
"
This issue is confidential and locked. People without permission will never get a notification and won't be able to comment.
"
,
);
});
});
});
});
});
});
spec/frontend/vue_shared/components/markdown/__snapshots__/suggestion_diff_spec.js.snap
0 → 100644
View file @
6a3b4071
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Suggestion Diff component matches snapshot 1`] = `
<div
class="md-suggestion"
>
<suggestion-diff-header-stub
class="qa-suggestion-diff-header js-suggestion-diff-header"
helppagepath="path_to_docs"
/>
<table
class="mb-3 md-suggestion-diff js-syntax-highlight code"
>
<tbody>
<suggestion-diff-row-stub
line="[object Object]"
/>
<suggestion-diff-row-stub
line="[object Object]"
/>
<suggestion-diff-row-stub
line="[object Object]"
/>
</tbody>
</table>
</div>
`;
spec/frontend/vue_shared/components/markdown/suggestion_diff_spec.js
View file @
6a3b4071
import
Vue
from
'
vue
'
;
import
{
shallowMount
}
from
'
@vue/test-utils
'
;
import
SuggestionDiffComponent
from
'
~/vue_shared/components/markdown/suggestion_diff.vue
'
;
import
SuggestionDiffComponent
from
'
~/vue_shared/components/markdown/suggestion_diff.vue
'
;
import
{
selectDiffLines
}
from
'
~/vue_shared/components/lib/utils/diff_utils
'
;
import
SuggestionDiffHeader
from
'
~/vue_shared/components/markdown/suggestion_diff_header.vue
'
;
import
SuggestionDiffRow
from
'
~/vue_shared/components/markdown/suggestion_diff_row.vue
'
;
const
MOCK_DATA
=
{
const
MOCK_DATA
=
{
canApply
:
true
,
suggestion
:
{
suggestion
:
{
id
:
1
,
id
:
1
,
diff_lines
:
[
diff_lines
:
[
...
@@ -42,60 +42,45 @@ const MOCK_DATA = {
...
@@ -42,60 +42,45 @@ const MOCK_DATA = {
helpPagePath
:
'
path_to_docs
'
,
helpPagePath
:
'
path_to_docs
'
,
};
};
const
lines
=
selectDiffLines
(
MOCK_DATA
.
suggestion
.
diff_lines
);
const
newLines
=
lines
.
filter
(
line
=>
line
.
type
===
'
new
'
);
describe
(
'
Suggestion Diff component
'
,
()
=>
{
describe
(
'
Suggestion Diff component
'
,
()
=>
{
let
vm
;
let
wrapper
;
beforeEach
(
done
=>
{
const
Component
=
Vue
.
extend
(
SuggestionDiffComponent
);
vm
=
new
Component
({
propsData
:
MOCK_DATA
,
}).
$mount
();
Vue
.
nextTick
(
done
);
});
describe
(
'
init
'
,
()
=>
{
it
(
'
renders a suggestion header
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
.js-suggestion-diff-header
'
)).
not
.
toBeNull
();
});
it
(
'
renders a diff table with syntax highlighting
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
.md-suggestion-diff.js-syntax-highlight.code
'
)).
not
.
toBeNull
();
});
it
(
'
renders the oldLineNumber
'
,
()
=>
{
const
createComponent
=
()
=>
{
const
fromLine
=
vm
.
$el
.
querySelector
(
'
.old_line
'
).
innerHTML
;
wrapper
=
shallowMount
(
SuggestionDiffComponent
,
{
propsData
:
{
expect
(
parseInt
(
fromLine
,
10
)).
toBe
(
lines
[
0
].
old_line
);
...
MOCK_DATA
,
},
});
});
};
it
(
'
renders the oldLineContent
'
,
()
=>
{
beforeEach
(()
=>
{
const
fromContent
=
vm
.
$el
.
querySelector
(
'
.line_content.old
'
).
innerHTML
;
createComponent
();
});
expect
(
fromContent
.
includes
(
lines
[
0
].
text
)).
toBe
(
true
);
});
it
(
'
renders new lines
'
,
()
=>
{
afterEach
(()
=>
{
const
newLinesElements
=
vm
.
$el
.
querySelectorAll
(
'
.line_holder.new
'
);
wrapper
.
destroy
();
wrapper
=
null
;
});
newLinesElements
.
forEach
((
line
,
i
)
=>
{
it
(
'
matches snapshot
'
,
()
=>
{
expect
(
newLinesElements
[
i
].
innerHTML
.
includes
(
newLines
[
i
].
new_line
)).
toBe
(
true
);
expect
(
wrapper
.
element
).
toMatchSnapshot
();
expect
(
newLinesElements
[
i
].
innerHTML
.
includes
(
newLines
[
i
].
text
)).
toBe
(
true
);
});
});
});
});
describe
(
'
applySuggestion
'
,
()
=>
{
it
(
'
renders a correct amount of suggestion diff rows
'
,
()
=>
{
it
(
'
emits apply event when applySuggestion is called
'
,
()
=>
{
expect
(
wrapper
.
findAll
(
SuggestionDiffRow
)).
toHaveLength
(
3
);
const
callback
=
()
=>
{};
});
jest
.
spyOn
(
vm
,
'
$emit
'
).
mockImplementation
(()
=>
{});
vm
.
applySuggestion
(
callback
);
expect
(
vm
.
$emit
).
toHaveBeenCalledWith
(
'
apply
'
,
{
suggestionId
:
vm
.
suggestion
.
id
,
callback
});
it
(
'
emits apply event on sugestion diff header apply
'
,
()
=>
{
});
wrapper
.
find
(
SuggestionDiffHeader
).
vm
.
$emit
(
'
apply
'
,
'
test-event
'
);
expect
(
wrapper
.
emitted
(
'
apply
'
)).
toBeDefined
();
expect
(
wrapper
.
emitted
(
'
apply
'
)).
toEqual
([
[
{
callback
:
'
test-event
'
,
suggestionId
:
1
,
},
],
]);
});
});
});
});
spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_note_spec.js.snap
0 → 100644
View file @
6a3b4071
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Issue placeholder note component matches snapshot 1`] = `
<timeline-entry-item-stub
class="note note-wrapper being-posted fade-in-half"
>
<div
class="timeline-icon"
>
<user-avatar-link-stub
imgalt=""
imgcssclasses=""
imgsize="40"
imgsrc="mock_path"
linkhref="/root"
tooltipplacement="top"
tooltiptext=""
username=""
/>
</div>
<div
class="timeline-content discussion"
>
<div
class="note-header"
>
<div
class="note-header-info"
>
<a
href="/root"
>
<span
class="d-none d-sm-inline-block bold"
>
Root
</span>
<span
class="note-headline-light"
>
@root
</span>
</a>
</div>
</div>
<div
class="note-body"
>
<div
class="note-text md"
>
<p>
Foo
</p>
</div>
</div>
</div>
</timeline-entry-item-stub>
`;
spec/frontend/vue_shared/components/notes/__snapshots__/placeholder_system_note_spec.js.snap
0 → 100644
View file @
6a3b4071
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Placeholder system note component matches snapshot 1`] = `
<timeline-entry-item-stub
class="note system-note being-posted fade-in-half"
>
<div
class="timeline-content"
>
<em>
This is a placeholder
</em>
</div>
</timeline-entry-item-stub>
`;
spec/frontend/vue_shared/components/notes/placeholder_note_spec.js
View file @
6a3b4071
import
Vue
from
'
vue
'
;
import
{
shallowMount
,
createLocalVue
}
from
'
@vue/test-utils
'
;
import
issuePlaceholderNote
from
'
~/vue_shared/components/notes/placeholder_note.vue
'
;
import
Vuex
from
'
vuex
'
;
import
createStore
from
'
~/notes/stores
'
;
import
IssuePlaceholderNote
from
'
~/vue_shared/components/notes/placeholder_note.vue
'
;
import
{
userDataMock
}
from
'
../../../notes/mock_data
'
;
import
{
userDataMock
}
from
'
../../../notes/mock_data
'
;
describe
(
'
issue placeholder system note component
'
,
()
=>
{
const
localVue
=
createLocalVue
();
let
store
;
localVue
.
use
(
Vuex
);
let
vm
;
const
getters
=
{
beforeEach
(()
=>
{
getUserData
:
()
=>
userDataMock
,
const
Component
=
Vue
.
extend
(
issuePlaceholderNote
);
};
store
=
createStore
();
store
.
dispatch
(
'
setUserData
'
,
userDataMock
);
describe
(
'
Issue placeholder note component
'
,
()
=>
{
vm
=
new
Component
({
let
wrapper
;
store
,
propsData
:
{
note
:
{
body
:
'
Foo
'
}
},
const
findNote
=
()
=>
wrapper
.
find
({
ref
:
'
note
'
});
}).
$mount
();
});
const
createComponent
=
(
isIndividual
=
false
)
=>
{
wrapper
=
shallowMount
(
IssuePlaceholderNote
,
{
localVue
,
store
:
new
Vuex
.
Store
({
getters
,
}),
propsData
:
{
note
:
{
body
:
'
Foo
'
,
individual_note
:
isIndividual
,
},
},
});
};
afterEach
(()
=>
{
afterEach
(()
=>
{
vm
.
$destroy
();
wrapper
.
destroy
();
wrapper
=
null
;
});
});
describe
(
'
user information
'
,
()
=>
{
it
(
'
matches snapshot
'
,
()
=>
{
it
(
'
should render user avatar with link
'
,
()
=>
{
createComponent
();
expect
(
vm
.
$el
.
querySelector
(
'
.user-avatar-link
'
).
getAttribute
(
'
href
'
)).
toEqual
(
userDataMock
.
path
,
);
expect
(
vm
.
$el
.
querySelector
(
'
.user-avatar-link img
'
).
getAttribute
(
'
src
'
)).
toEqual
(
expect
(
wrapper
.
element
).
toMatchSnapshot
();
`
${
userDataMock
.
avatar_url
}
?width=40`
,
);
});
});
});
describe
(
'
note content
'
,
()
=>
{
it
(
'
does not add "discussion" class to individual notes
'
,
()
=>
{
it
(
'
should render note header information
'
,
()
=>
{
createComponent
(
true
);
expect
(
vm
.
$el
.
querySelector
(
'
.note-header-info a
'
).
getAttribute
(
'
href
'
)).
toEqual
(
userDataMock
.
path
,
);
expect
(
expect
(
findNote
().
classes
()).
not
.
toContain
(
'
discussion
'
);
vm
.
$el
.
querySelector
(
'
.note-header-info .note-headline-light
'
).
textContent
.
trim
(),
});
).
toEqual
(
`@
${
userDataMock
.
username
}
`
);
});
it
(
'
should render note body
'
,
()
=>
{
it
(
'
adds "discussion" class to non-individual notes
'
,
()
=>
{
expect
(
vm
.
$el
.
querySelector
(
'
.note-text p
'
).
textContent
.
trim
()).
toEqual
(
'
Foo
'
);
createComponent
();
});
expect
(
findNote
().
classes
()).
toContain
(
'
discussion
'
);
});
});
});
});
spec/frontend/vue_shared/components/notes/placeholder_system_note_spec.js
View file @
6a3b4071
import
Vue
from
'
vue
'
;
import
{
shallowMount
}
from
'
@vue/test-utils
'
;
import
mountComponent
from
'
helpers/vue_mount_component_helper
'
;
import
PlaceholderSystemNote
from
'
~/vue_shared/components/notes/placeholder_system_note.vue
'
;
import
placeholderSystemNote
from
'
~/vue_shared/components/notes/placeholder_system_note.vue
'
;
describe
(
'
placeholder system note component
'
,
()
=>
{
describe
(
'
Placeholder system note component
'
,
()
=>
{
let
PlaceholderSystemNote
;
let
wrapper
;
let
vm
;
beforeEach
(()
=>
{
const
createComponent
=
()
=>
{
PlaceholderSystemNote
=
Vue
.
extend
(
placeholderSystemNote
);
wrapper
=
shallowMount
(
PlaceholderSystemNote
,
{
});
propsData
:
{
note
:
{
body
:
'
This is a placeholder
'
},
},
});
};
afterEach
(()
=>
{
afterEach
(()
=>
{
vm
.
$destroy
();
wrapper
.
destroy
();
wrapper
=
null
;
});
});
it
(
'
should render system note placeholder with plain text
'
,
()
=>
{
it
(
'
matches snapshot
'
,
()
=>
{
vm
=
mountComponent
(
PlaceholderSystemNote
,
{
createComponent
();
note
:
{
body
:
'
This is a placeholder
'
},
});
expect
(
vm
.
$el
.
tagName
).
toEqual
(
'
LI
'
);
expect
(
wrapper
.
element
).
toMatchSnapshot
();
expect
(
vm
.
$el
.
querySelector
(
'
.timeline-content em
'
).
textContent
.
trim
()).
toEqual
(
'
This is a placeholder
'
,
);
});
});
});
});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment