@@ -2,8 +2,7 @@ import '../spec_helper';
2
2
import { BackToTop } from '../../../src/react/back-to-top' ;
3
3
import ScrollTop from '../../../src/react/back-to-top/scroll-top' ;
4
4
5
- describe ( 'BackToTop' , function ( ) {
6
- let originalGetScrollTop , originalSetScrollTop ;
5
+ describe ( 'BackToTop' , ( ) => {
7
6
let scrollTop ;
8
7
9
8
function triggerScroll ( ) {
@@ -12,89 +11,152 @@ describe('BackToTop', function() {
12
11
window . dispatchEvent ( event ) ;
13
12
}
14
13
15
- beforeEach ( function ( ) {
14
+ beforeEach ( ( ) => {
16
15
scrollTop = 0 ;
17
- originalGetScrollTop = ScrollTop . getScrollTop ;
18
- originalSetScrollTop = ScrollTop . setScrollTop ;
19
- ScrollTop . getScrollTop = ( ) => scrollTop || 0 ;
20
- ScrollTop . setScrollTop = ( value ) => scrollTop = value ;
16
+ spyOn ( ScrollTop , 'getScrollTop' ) . and . callFake ( ( ) => scrollTop || 0 ) ;
17
+ spyOn ( ScrollTop , 'setScrollTop' ) . and . callFake ( value => scrollTop = value ) ;
21
18
} ) ;
22
19
23
- afterEach ( function ( ) {
24
- ScrollTop . getScrollTop = originalGetScrollTop ;
25
- ScrollTop . setScrollTop = originalSetScrollTop ;
26
- } ) ;
27
-
28
- beforeEach ( function ( done ) {
29
- ReactDOM . render ( < BackToTop className = "foo" id = "bar" style = { { fontSize : '200px' } } /> , root ) ;
20
+ describe ( 'without scrollableId' , ( ) => {
21
+ beforeEach ( done => {
22
+ ReactDOM . render ( < BackToTop className = "foo" id = "bar" style = { { fontSize : '200px' } } /> , root ) ;
30
23
31
- jasmine . clock ( ) . uninstall ( ) ;
32
- setTimeout ( function ( ) {
33
- jasmine . clock ( ) . install ( ) ;
34
- ScrollTop . setScrollTop ( 500 ) ;
35
- triggerScroll ( ) ;
36
- done ( ) ;
37
- } , 0 ) ;
38
- } ) ;
39
-
40
- it ( 'passes down the className, id, and style properties' , ( ) => {
41
- expect ( '.back-to-top' ) . toHaveClass ( 'foo' ) ;
42
- expect ( '.back-to-top' ) . toHaveProp ( 'id' , 'bar' ) ;
43
- expect ( '.back-to-top' ) . toHaveCss ( { 'font-size' : '200px' } ) ;
44
- } ) ;
45
-
46
- it ( 'renders a back to top link that is visible' , function ( ) {
47
- expect ( '.back-to-top' ) . toExist ( ) ;
48
- } ) ;
49
-
50
- it ( 'renders a arrow upward icon' , ( ) => {
51
- expect ( 'svg.icon-arrow_upward' ) . toExist ( ) ;
52
- } ) ;
24
+ jasmine . clock ( ) . uninstall ( ) ;
25
+ setTimeout ( ( ) => {
26
+ jasmine . clock ( ) . install ( ) ;
27
+ ScrollTop . setScrollTop ( 500 ) ;
28
+ triggerScroll ( ) ;
29
+ done ( ) ;
30
+ } , 0 ) ;
31
+ } ) ;
53
32
54
- it ( 'fades in the button' , function ( ) {
55
- expect ( '.back-to-top' ) . toHaveCss ( { opacity : '0' } ) ;
56
- MockNow . tick ( BackToTop . FADE_DURATION / 2 ) ;
57
- MockRaf . next ( ) ;
58
- expect ( '.back-to-top' ) . toHaveCss ( { opacity : '0.5' } ) ;
59
- MockNow . tick ( BackToTop . FADE_DURATION / 2 ) ;
60
- MockRaf . next ( ) ;
61
- expect ( '.back-to-top' ) . toHaveCss ( { opacity : '1' } ) ;
62
- } ) ;
33
+ it ( 'passes down the className, id, and style properties' , ( ) => {
34
+ expect ( '.back-to-top' ) . toHaveClass ( 'foo' ) ;
35
+ expect ( '.back-to-top' ) . toHaveProp ( 'id' , 'bar' ) ;
36
+ expect ( '.back-to-top' ) . toHaveCss ( { 'font-size' : '200px' } ) ;
37
+ } ) ;
63
38
64
- describe ( 'when the scroll top is less than 400' , function ( ) {
65
- beforeEach ( function ( ) {
66
- MockNow . tick ( BackToTop . FADE_DURATION ) ;
67
- MockRaf . next ( ) ;
68
- expect ( '.back-to-top' ) . toHaveCss ( { opacity : '1' } ) ;
39
+ it ( 'renders a back to top link that is visible' , ( ) => {
40
+ expect ( '.back-to-top' ) . toExist ( ) ;
41
+ } ) ;
69
42
70
- ScrollTop . setScrollTop ( 0 ) ;
71
- triggerScroll ( ) ;
43
+ it ( 'renders a arrow upward icon' , ( ) => {
44
+ expect ( 'svg.icon-arrow_upward' ) . toExist ( ) ;
72
45
} ) ;
73
46
74
- it ( 'fades out the button' , function ( ) {
75
- expect ( '.back-to-top' ) . toHaveCss ( { opacity : '1 ' } ) ;
47
+ it ( 'fades in the button' , ( ) => {
48
+ expect ( '.back-to-top' ) . toHaveCss ( { opacity : '0 ' } ) ;
76
49
MockNow . tick ( BackToTop . FADE_DURATION / 2 ) ;
77
50
MockRaf . next ( ) ;
78
51
expect ( '.back-to-top' ) . toHaveCss ( { opacity : '0.5' } ) ;
79
52
MockNow . tick ( BackToTop . FADE_DURATION / 2 ) ;
80
53
MockRaf . next ( ) ;
81
- expect ( '.back-to-top' ) . toHaveCss ( { opacity : '0' } ) ;
54
+ expect ( '.back-to-top' ) . toHaveCss ( { opacity : '1' } ) ;
55
+ } ) ;
56
+
57
+ describe ( 'when the scroll top is less than 400' , ( ) => {
58
+ beforeEach ( function ( ) {
59
+ MockNow . tick ( BackToTop . FADE_DURATION ) ;
60
+ MockRaf . next ( ) ;
61
+ expect ( '.back-to-top' ) . toHaveCss ( { opacity : '1' } ) ;
62
+
63
+ ScrollTop . setScrollTop ( 0 ) ;
64
+ triggerScroll ( ) ;
65
+ } ) ;
66
+
67
+ it ( 'fades out the button' , ( ) => {
68
+ expect ( '.back-to-top' ) . toHaveCss ( { opacity : '1' } ) ;
69
+ MockNow . tick ( BackToTop . FADE_DURATION / 2 ) ;
70
+ MockRaf . next ( ) ;
71
+ expect ( '.back-to-top' ) . toHaveCss ( { opacity : '0.5' } ) ;
72
+ MockNow . tick ( BackToTop . FADE_DURATION / 2 ) ;
73
+ MockRaf . next ( ) ;
74
+ expect ( '.back-to-top' ) . toHaveCss ( { opacity : '0' } ) ;
75
+ } ) ;
76
+ } ) ;
77
+
78
+ describe ( 'when the back to top link is clicked' , ( ) => {
79
+ let element ;
80
+
81
+ beforeEach ( ( ) => {
82
+ const isFirefox = ( ) => navigator . userAgent . toLowerCase ( ) . indexOf ( 'firefox' ) !== - 1 ;
83
+ element = isFirefox ( ) ? document . documentElement : document . body ;
84
+ $ ( '.back-to-top' ) . simulate ( 'click' ) ;
85
+ } ) ;
86
+
87
+ it ( 'animates the body scroll to the top' , ( ) => {
88
+ expect ( ScrollTop . getScrollTop ( ) ) . toEqual ( 500 ) ;
89
+ MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
90
+ MockRaf . next ( ) ;
91
+ expect ( ScrollTop . getScrollTop ( ) ) . toEqual ( 62.5 ) ;
92
+ MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
93
+ MockRaf . next ( ) ;
94
+ expect ( ScrollTop . getScrollTop ( ) ) . toEqual ( 0 ) ;
95
+ } ) ;
96
+
97
+ it ( 'calls getScrollTop' , ( ) => {
98
+ expect ( ScrollTop . getScrollTop ) . toHaveBeenCalledWith ( element ) ;
99
+ } ) ;
100
+
101
+ it ( 'calls setScrollTop' , ( ) => {
102
+ expect ( ScrollTop . setScrollTop ) . toHaveBeenCalledWith ( 500 , element ) ;
103
+ MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
104
+ MockRaf . next ( ) ;
105
+ expect ( ScrollTop . setScrollTop ) . toHaveBeenCalledWith ( 62.5 , element ) ;
106
+ MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
107
+ MockRaf . next ( ) ;
108
+ expect ( ScrollTop . setScrollTop ) . toHaveBeenCalledWith ( 0 , element ) ;
109
+ } ) ;
82
110
} ) ;
83
111
} ) ;
84
112
85
- describe ( 'when the back to top link is clicked' , function ( ) {
86
- beforeEach ( function ( ) {
87
- $ ( '.back-to-top' ) . simulate ( 'click' ) ;
113
+ describe ( 'with a scrollableId' , ( ) => {
114
+ let scrollableId ;
115
+
116
+ beforeEach ( done => {
117
+ scrollableId = 'scrollable' ;
118
+ ReactDOM . render ( < div id = { scrollableId } style = { { height : '100px' , maxHeight : '100px' , overflowY : 'scroll' } } >
119
+ < div { ...{ height : '500px' } } />
120
+ < BackToTop { ...{ className : 'foo' , id : 'bar' , style : { fontSize : '500px' } , scrollableId} } />
121
+ </ div > , root ) ;
122
+
123
+ jasmine . clock ( ) . uninstall ( ) ;
124
+ setTimeout ( ( ) => {
125
+ jasmine . clock ( ) . install ( ) ;
126
+ ScrollTop . setScrollTop ( 100 , scrollableId ) ;
127
+ triggerScroll ( ) ;
128
+ done ( ) ;
129
+ } , 0 ) ;
88
130
} ) ;
89
131
90
- it ( 'animates the body scroll to the top' , function ( ) {
91
- expect ( ScrollTop . getScrollTop ( ) ) . toEqual ( 500 ) ;
92
- MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
93
- MockRaf . next ( ) ;
94
- expect ( ScrollTop . getScrollTop ( ) ) . toEqual ( 62.5 ) ;
95
- MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
96
- MockRaf . next ( ) ;
97
- expect ( ScrollTop . getScrollTop ( ) ) . toEqual ( 0 ) ;
132
+ describe ( 'when the back to top link is clicked' , ( ) => {
133
+ beforeEach ( ( ) => {
134
+ $ ( '.back-to-top' ) . simulate ( 'click' ) ;
135
+ } ) ;
136
+
137
+ it ( 'calls getScrollTop' , ( ) => {
138
+ expect ( ScrollTop . getScrollTop ) . toHaveBeenCalledWith ( window . scrollable ) ;
139
+ } ) ;
140
+
141
+ it ( 'calls setScrollTop' , ( ) => {
142
+ expect ( ScrollTop . setScrollTop ) . toHaveBeenCalledWith ( 100 , window . scrollable ) ;
143
+ MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
144
+ MockRaf . next ( ) ;
145
+ expect ( ScrollTop . setScrollTop ) . toHaveBeenCalledWith ( 12.5 , window . scrollable ) ;
146
+ MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
147
+ MockRaf . next ( ) ;
148
+ expect ( ScrollTop . setScrollTop ) . toHaveBeenCalledWith ( 0 , window . scrollable ) ;
149
+ } ) ;
150
+
151
+ it ( 'animates the body scroll to the top' , ( ) => {
152
+ expect ( scrollTop ) . toEqual ( 100 ) ;
153
+ MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
154
+ MockRaf . next ( ) ;
155
+ expect ( scrollTop ) . toEqual ( 12.5 ) ;
156
+ MockNow . tick ( BackToTop . SCROLL_DURATION / 2 ) ;
157
+ MockRaf . next ( ) ;
158
+ expect ( scrollTop ) . toEqual ( 0 ) ;
159
+ } ) ;
98
160
} ) ;
99
161
} ) ;
100
162
} ) ;
0 commit comments