11import { actionValue , dynamicValue , EditableValueBuilder } from "@mendix/piw-utils-internal" ;
22import { Big } from "big.js" ;
3- import { View } from "react-native" ;
4- import { fireEvent , render , RenderAPI } from "@testing-library/react-native" ;
5- import { ReactTestInstance } from "react-test-renderer" ;
3+ import { fireEvent , render } from "@testing-library/react-native" ;
64import { ValueStatus , DynamicValue } from "mendix" ;
75import { Props , RangeSlider } from "../RangeSlider" ;
86
7+ jest . mock ( "@miblanchard/react-native-slider" , ( ) => {
8+ const { View } = require ( "react-native" ) ;
9+ return {
10+ Slider : ( props : any ) => (
11+ < View
12+ testID = "mocked-slider"
13+ { ...props }
14+ onValueChange = { ( values : number [ ] ) => props . onValueChange ?.( values ) }
15+ onSlidingComplete = { ( values : number [ ] ) => props . onSlidingComplete ?.( values ) }
16+ />
17+ )
18+ } ;
19+ } ) ;
20+
921describe ( "RangeSlider" , ( ) => {
1022 const noValue : DynamicValue < Big > = { status : ValueStatus . Unavailable , value : undefined } ;
1123 let defaultProps : Props ;
@@ -32,7 +44,7 @@ describe("RangeSlider", () => {
3244 const component = render (
3345 < RangeSlider { ...defaultProps } lowerValueAttribute = { new EditableValueBuilder < Big > ( ) . isLoading ( ) . build ( ) } />
3446 ) ;
35- expect ( component . queryByTestId ( `${ defaultProps . name } -validation-message ` ) ) . toBeNull ( ) ;
47+ expect ( component . queryByTestId ( `${ defaultProps . name } -validation-messages ` ) ) . toBeNull ( ) ;
3648 } ) ;
3749
3850 it ( "renders an error when no minimum value is provided" , ( ) => {
@@ -102,29 +114,6 @@ describe("RangeSlider", () => {
102114 expect ( component . queryByText ( "The upper value must be equal or less than the maximum value." ) ) . not . toBeNull ( ) ;
103115 } ) ;
104116
105- it ( "renders with the width of the parent view" , ( ) => {
106- const component = render (
107- < RangeSlider
108- { ...defaultProps }
109- style = { [
110- {
111- container : { width : 100 } ,
112- highlight : { } ,
113- highlightDisabled : { } ,
114- marker : { } ,
115- markerActive : { } ,
116- markerDisabled : { } ,
117- track : { } ,
118- trackDisabled : { } ,
119- validationMessage : { }
120- }
121- ] }
122- />
123- ) ;
124- fireEvent ( component . getByTestId ( "range-slider-test" ) , "layout" , { nativeEvent : { layout : { width : 100 } } } ) ;
125- expect ( component . getByTestId ( "range-slider-test" ) . findByProps ( { sliderLength : 100 } ) ) . not . toBeNull ( ) ;
126- } ) ;
127-
128117 it ( "renders a validation message" , ( ) => {
129118 const value = new EditableValueBuilder < Big > ( ) . withValidation ( "Invalid" ) . build ( ) ;
130119 const component = render (
@@ -134,71 +123,85 @@ describe("RangeSlider", () => {
134123 expect ( component . getAllByText ( "Invalid" ) ) . toHaveLength ( 2 ) ;
135124 } ) ;
136125
137- it ( "changes the lower value when swiping" , ( ) => {
138- const onChangeAction = actionValue ( ) ;
139- const component = render ( < RangeSlider { ...defaultProps } onChange = { onChangeAction } /> ) ;
126+ it ( "renders as disabled when editable is never" , ( ) => {
127+ const component = render ( < RangeSlider { ...defaultProps } editable = { "never" } /> ) ;
128+ const slider = component . getByTestId ( "mocked-slider" ) ;
129+ expect ( slider . props . disabled ) . toBe ( true ) ;
130+ } ) ;
140131
141- fireEvent ( getHandle ( component ) , "responderGrant" , { touchHistory : { touchBank : [ ] } } ) ;
142- fireEvent ( getHandle ( component ) , "responderMove" , responderMove ( 50 ) ) ;
132+ it ( "renders as enabled when editable is default" , ( ) => {
133+ const component = render ( < RangeSlider { ...defaultProps } /> ) ;
134+ const slider = component . getByTestId ( "mocked-slider" ) ;
135+ expect ( slider . props . disabled ) . toBe ( false ) ;
136+ } ) ;
143137
144- expect ( onChangeAction . execute ) . not . toHaveBeenCalled ( ) ;
138+ it ( "passes correct min/max/step to the slider" , ( ) => {
139+ const component = render ( < RangeSlider { ...defaultProps } /> ) ;
140+ const slider = component . getByTestId ( "mocked-slider" ) ;
141+ expect ( slider . props . minimumValue ) . toBe ( 0 ) ;
142+ expect ( slider . props . maximumValue ) . toBe ( 280 ) ;
143+ expect ( slider . props . step ) . toBe ( 1 ) ;
144+ } ) ;
145145
146- fireEvent ( getHandle ( component ) , "responderRelease" , { } ) ;
146+ it ( "passes range values as array" , ( ) => {
147+ const component = render ( < RangeSlider { ...defaultProps } /> ) ;
148+ const slider = component . getByTestId ( "mocked-slider" ) ;
149+ expect ( slider . props . value ) . toEqual ( [ 70 , 210 ] ) ;
150+ } ) ;
151+
152+ it ( "calls onValueChange when sliding" , ( ) => {
153+ const component = render ( < RangeSlider { ...defaultProps } /> ) ;
154+ const slider = component . getByTestId ( "mocked-slider" ) ;
155+
156+ fireEvent ( slider , "onValueChange" , [ 100 , 210 ] ) ;
147157
148- expect ( defaultProps . lowerValueAttribute . setValue ) . toHaveBeenCalledWith ( new Big ( 120 ) ) ;
158+ expect ( defaultProps . lowerValueAttribute . setValue ) . toHaveBeenCalledWith ( new Big ( 100 ) ) ;
149159 expect ( defaultProps . upperValueAttribute . setValue ) . toHaveBeenCalledWith ( new Big ( 210 ) ) ;
150- expect ( onChangeAction . execute ) . toHaveBeenCalledTimes ( 1 ) ;
151160 } ) ;
152161
153- it ( "changes the upper value when swiping " , ( ) => {
162+ it ( "calls onChange action on sliding complete " , ( ) => {
154163 const onChangeAction = actionValue ( ) ;
155164 const component = render ( < RangeSlider { ...defaultProps } onChange = { onChangeAction } /> ) ;
165+ const slider = component . getByTestId ( "mocked-slider" ) ;
156166
157- fireEvent ( getHandle ( component , 1 ) , "responderGrant" , { touchHistory : { touchBank : [ ] } } ) ;
158- fireEvent ( getHandle ( component , 1 ) , "responderMove" , responderMove ( - 50 ) ) ;
159-
160- expect ( onChangeAction . execute ) . not . toHaveBeenCalled ( ) ;
161-
162- fireEvent ( getHandle ( component , 1 ) , "responderRelease" , { } ) ;
167+ fireEvent ( slider , "onSlidingComplete" , [ 100 , 250 ] ) ;
163168
164- expect ( defaultProps . lowerValueAttribute . setValue ) . toHaveBeenCalledWith ( new Big ( 70 ) ) ;
165- expect ( defaultProps . upperValueAttribute . setValue ) . toHaveBeenCalledWith ( new Big ( 160 ) ) ;
169+ expect ( defaultProps . lowerValueAttribute . setValue ) . toHaveBeenCalledWith ( new Big ( 100 ) ) ;
170+ expect ( defaultProps . upperValueAttribute . setValue ) . toHaveBeenCalledWith ( new Big ( 250 ) ) ;
166171 expect ( onChangeAction . execute ) . toHaveBeenCalledTimes ( 1 ) ;
167172 } ) ;
168173
169- it ( "does not change the value when non editable " , ( ) => {
174+ it ( "does not call onChange when values haven't changed " , ( ) => {
170175 const onChangeAction = actionValue ( ) ;
171- const component = render ( < RangeSlider { ...defaultProps } editable = { "never" } onChange = { onChangeAction } /> ) ;
176+ const component = render ( < RangeSlider { ...defaultProps } onChange = { onChangeAction } /> ) ;
177+ const slider = component . getByTestId ( "mocked-slider" ) ;
172178
173- fireEvent ( getHandle ( component ) , "responderGrant" , { touchHistory : { touchBank : [ ] } } ) ;
174- fireEvent ( getHandle ( component ) , "responderMove" , responderMove ( 50 ) ) ;
175- fireEvent ( getHandle ( component ) , "responderRelease" , { } ) ;
179+ fireEvent ( slider , "onSlidingComplete" , [ 70 , 210 ] ) ;
176180
177181 expect ( onChangeAction . execute ) . not . toHaveBeenCalled ( ) ;
178- expect ( defaultProps . lowerValueAttribute . setValue ) . not . toHaveBeenCalled ( ) ;
179- expect ( defaultProps . upperValueAttribute . setValue ) . not . toHaveBeenCalled ( ) ;
180182 } ) ;
181- } ) ;
182-
183- function getHandle ( component : RenderAPI , index = 0 ) : ReactTestInstance {
184- return component . UNSAFE_getAllByType ( View ) . filter ( instance => instance . props . onMoveShouldSetResponder ) [ index ] ;
185- }
186183
187- function responderMove ( dx : number ) : any {
188- return {
189- touchHistory : {
190- numberActiveTouches : 1 ,
191- indexOfSingleActiveTouch : 0 ,
192- touchBank : [
193- {
194- touchActive : true ,
195- currentTimeStamp : Date . now ( ) ,
196- currentPageX : dx ,
197- currentPageY : 0 ,
198- previousPageX : 0 ,
199- previousPageY : 0
200- }
201- ]
202- }
203- } ;
204- }
184+ it ( "applies custom styles" , ( ) => {
185+ const component = render (
186+ < RangeSlider
187+ { ...defaultProps }
188+ style = { [
189+ {
190+ container : { width : 100 } ,
191+ track : { } ,
192+ trackDisabled : { } ,
193+ minimumTrack : { } ,
194+ minimumTrackDisabled : { } ,
195+ maximumTrack : { } ,
196+ maximumTrackDisabled : { } ,
197+ thumb : { } ,
198+ thumbActive : { } ,
199+ thumbDisabled : { } ,
200+ validationMessage : { }
201+ }
202+ ] }
203+ />
204+ ) ;
205+ expect ( component . toJSON ( ) ) . toMatchSnapshot ( "with custom styles" ) ;
206+ } ) ;
207+ } ) ;
0 commit comments