|  | // Copyright (C) 2018 The Android Open Source Project | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | import {Router} from './router'; | 
|  |  | 
|  | const mockComponent = { | 
|  | view() {}, | 
|  | }; | 
|  |  | 
|  | beforeEach(() => { | 
|  | window.location.hash = ''; | 
|  | }); | 
|  |  | 
|  | test('Default route must be defined', () => { | 
|  | expect(() => new Router({'/a': mockComponent})).toThrow(); | 
|  | }); | 
|  |  | 
|  | test('Resolves empty route to default component', () => { | 
|  | const router = new Router({'/': mockComponent}); | 
|  | window.location.hash = ''; | 
|  | expect(router.resolve().tag).toBe(mockComponent); | 
|  | }); | 
|  |  | 
|  | test('Resolves subpage route to component of main page', () => { | 
|  | const nonDefaultComponent = {view() {}}; | 
|  | const router = new Router({ | 
|  | '/': mockComponent, | 
|  | '/a': nonDefaultComponent, | 
|  | }); | 
|  | window.location.hash = '#!/a/subpage'; | 
|  | expect(router.resolve().tag).toBe(nonDefaultComponent); | 
|  | expect(router.resolve().attrs.subpage).toBe('/subpage'); | 
|  | }); | 
|  |  | 
|  | test('Pass empty subpage if not found in URL', () => { | 
|  | const nonDefaultComponent = {view() {}}; | 
|  | const router = new Router({ | 
|  | '/': mockComponent, | 
|  | '/a': nonDefaultComponent, | 
|  | }); | 
|  | window.location.hash = '#!/a'; | 
|  | expect(router.resolve().tag).toBe(nonDefaultComponent); | 
|  | expect(router.resolve().attrs.subpage).toBe(''); | 
|  | }); | 
|  |  | 
|  | test('Args parsing', () => { | 
|  | const url = 'http://localhost/#!/foo?p=123&s=42&url=a?b?c'; | 
|  | const args = Router.parseUrl(url).args; | 
|  | expect(args.p).toBe('123'); | 
|  | expect(args.s).toBe('42'); | 
|  | expect(args.url).toBe('a?b?c'); | 
|  | }); | 
|  |  | 
|  | test('empty route broken into empty components', () => { | 
|  | const {page, subpage, args} = Router.parseFragment(''); | 
|  | expect(page).toBe(''); | 
|  | expect(subpage).toBe(''); | 
|  | expect(args).toEqual({}); | 
|  | }); | 
|  |  | 
|  | test('invalid route broken into empty components', () => { | 
|  | const {page, subpage, args} = Router.parseFragment('/bla'); | 
|  | expect(page).toBe(''); | 
|  | expect(subpage).toBe(''); | 
|  | expect(args).toEqual({}); | 
|  | }); | 
|  |  | 
|  | test('simple route has page defined', () => { | 
|  | const {page, subpage, args} = Router.parseFragment('#!/record'); | 
|  | expect(page).toBe('/record'); | 
|  | expect(subpage).toBe(''); | 
|  | expect(args).toEqual({}); | 
|  | }); | 
|  |  | 
|  | test('simple route has both components defined', () => { | 
|  | const {page, subpage, args} = Router.parseFragment('#!/record/memory'); | 
|  | expect(page).toBe('/record'); | 
|  | expect(subpage).toBe('/memory'); | 
|  | expect(args).toEqual({}); | 
|  | }); | 
|  |  | 
|  | test('route broken at first slash', () => { | 
|  | const {page, subpage, args} = Router.parseFragment('#!/record/memory/stuff'); | 
|  | expect(page).toBe('/record'); | 
|  | expect(subpage).toBe('/memory/stuff'); | 
|  | expect(args).toEqual({}); | 
|  | }); | 
|  |  | 
|  | test('parameters separated from route', () => { | 
|  | const {page, subpage, args} = | 
|  | Router.parseFragment('#!/record/memory?url=http://localhost:1234/aaaa'); | 
|  | expect(page).toBe('/record'); | 
|  | expect(subpage).toBe('/memory'); | 
|  | expect(args).toEqual({url: 'http://localhost:1234/aaaa'}); | 
|  | }); |