1- import React from 'react' ;
2- import { View } from 'react-native' ;
1+ import React , { ComponentType } from 'react' ;
2+ import { View , Text } from 'react-native' ;
33import TestRenderer from 'react-test-renderer' ;
44
55import { createCanal } from '../createCanal' ;
6- import { Navigation } from '../Navigation.store' ;
7- import { Canal } from '../Canal' ;
6+
7+ const stopCreator = < T extends string > (
8+ name : T
9+ ) : { name : T ; Component : ComponentType } => {
10+ const Component = ( ) => < Text > { name } </ Text > ;
11+ return { name, Component } ;
12+ } ;
813
914describe ( 'createCanal' , ( ) => {
1015 it ( 'throws an error if first arg is not a Component' , ( ) => {
1116 try {
1217 // @ts -ignore
13- createCanal ( { name : 'a' , Component : 'aaa' } ) ;
18+ createCanal ( [ { name : 'a' , Component : 'aaa' } ] ) ;
1419 } catch ( error ) {
1520 expect ( error . message ) . toBe (
1621 '`createCanal` could not find a valid `Component` key for argument 1. Received: {"name":"a","Component":"aaa"}'
@@ -19,16 +24,52 @@ describe('createCanal', () => {
1924 expect . assertions ( 1 ) ;
2025 } ) ;
2126
22- it ( 'renders the first page when mounted' , ( ) => {
23- const Transitioner = createCanal ( { name : 'a' , Component : View } ) ;
24- const testRenderer = TestRenderer . create ( < Transitioner /> ) ;
27+ it ( 'renders nothing if no authorization is passed' , ( ) => {
28+ const Canal = createCanal ( [ stopCreator ( 'a' ) ] ) ;
29+ const testRenderer = TestRenderer . create ( < Canal /> ) ;
30+ expect ( testRenderer . toJSON ( ) ) . toMatchSnapshot ( ) ;
31+ } ) ;
32+
33+ it ( 'renders the first page if authorization for first page is given' , ( ) => {
34+ const Canal = createCanal ( [ stopCreator ( 'a' ) ] ) ;
35+ const testRenderer = TestRenderer . create ( < Canal a /> ) ;
36+ expect ( testRenderer . toJSON ( ) ) . toMatchSnapshot ( ) ;
37+ } ) ;
38+
39+ it ( 'renders the all pages if all authorizations are given' , ( ) => {
40+ const Canal = createCanal ( [ stopCreator ( 'a' ) , stopCreator ( 'b' ) ] ) ;
41+ const testRenderer = TestRenderer . create ( < Canal a b /> ) ;
42+ expect ( testRenderer . toJSON ( ) ) . toMatchSnapshot ( ) ;
43+ } ) ;
44+
45+ it ( 'renders only the first page if all authorizations are given but the one for the second page' , ( ) => {
46+ const Canal = createCanal ( [
47+ stopCreator ( 'a' ) ,
48+ stopCreator ( 'b' ) ,
49+ stopCreator ( 'c' )
50+ ] ) ;
51+ const testRenderer = TestRenderer . create ( < Canal a c /> ) ;
2552 expect ( testRenderer . toJSON ( ) ) . toMatchSnapshot ( ) ;
2653 } ) ;
2754
55+ it ( 'only rerender if style was modified' , ( ) => {
56+ const Canal = createCanal ( [
57+ stopCreator ( 'a' ) ,
58+ stopCreator ( 'b' ) ,
59+ stopCreator ( 'c' )
60+ ] ) ;
61+ const testRenderer = TestRenderer . create ( < Canal a /> ) ;
62+ const renderSpy = jest . spyOn ( testRenderer . root . instance , 'render' ) ;
63+ testRenderer . update ( < Canal a = { false } /> ) ;
64+ expect ( renderSpy ) . not . toHaveBeenCalled ( ) ;
65+ testRenderer . update ( < Canal a = { false } style = { { } } /> ) ;
66+ expect ( renderSpy ) . toHaveBeenCalled ( ) ;
67+ } ) ;
68+
2869 it ( 'throws an error if any arg is not a Component' , ( ) => {
2970 try {
3071 // @ts -ignore
31- createCanal ( { name : 'a' , Component : View } , { name : 'b' , Component : 'aaa' } ) ;
72+ createCanal ( [ stopCreator ( 'a' ) , { name : 'b' , Component : 'aaa' } ] ) ;
3273 } catch ( error ) {
3374 expect ( error . message ) . toBe (
3475 '`createCanal` could not find a valid `Component` key for argument 2. Received: {"name":"b","Component":"aaa"}'
@@ -37,30 +78,10 @@ describe('createCanal', () => {
3778 expect . assertions ( 1 ) ;
3879 } ) ;
3980
40- it ( 'emits the new canal to the navigation store' , ( ) => {
41- const PageOne = ( ) => < View /> ;
42- const PageTwo = ( ) => < View /> ;
43- const Transitioner = createCanal (
44- { name : 'pageOne' , Component : PageOne } ,
45- { name : 'pageTwo' , Component : PageTwo }
46- ) ;
47- const expectedCanal = new Canal ( [
48- { name : 'pageOne' , Component : PageOne } ,
49- { name : 'pageTwo' , Component : PageTwo } ,
50- ] ) ;
51- Navigation . getInstance ( ) . canalsSubject . subscribe ( {
52- next : canal => {
53- expect ( canal ) . toEqual ( expectedCanal ) ;
54- } ,
55- } ) ;
56- TestRenderer . create ( < Transitioner /> ) ;
57- expect . assertions ( 1 ) ;
58- } ) ;
59-
6081 it ( 'throws an error if name is missing' , ( ) => {
6182 try {
6283 // @ts -ignore
63- createCanal ( { Component : View } ) ;
84+ createCanal ( [ { Component : View } ] ) ;
6485 } catch ( error ) {
6586 expect ( error . message ) . toBe (
6687 '`createCanal` could not find a valid `name` key for argument 1. Received: {}'
@@ -73,9 +94,11 @@ describe('createCanal', () => {
7394 xit ( 'throws an error some names are duplicated' , ( ) => {
7495 try {
7596 // @ts -ignore
76- createCanal ( { name : 'a' , Component : View } , { name : 'a' , Component : View } ) ;
97+ createCanal ( [ stopCreator ( 'a' ) , stopCreator ( 'a' ) ] ) ;
7798 } catch ( error ) {
78- expect ( error . message ) . toBe ( '`createCanal` found duplicated `name: a` key.' ) ;
99+ expect ( error . message ) . toBe (
100+ '`createCanal` found duplicated `name: a` key.'
101+ ) ;
79102 }
80103 expect . assertions ( 1 ) ;
81104 } ) ;
0 commit comments