import { bootstrap, element as $, ICompileService, mock, module } from 'angular' import 'angular-mocks' import { $rootScope } from 'ngimport' import * as React from 'react' import { Simulate } from 'react-addons-test-utils' import { angularize } from './' class TestOne extends React.Component { render() { return

Foo: {this.props.foo}

Bar: {this.props.bar.join(',')}

this.props.baz(42)}>Baz

{this.props.children}
} componentWillUnmount() {} } const TestTwo: React.StatelessComponent = props =>

Foo: {props.foo}

Bar: {props.bar.join(',')}

props.baz(42)}>Baz

{props.children}
const TestAngularOne = angularize(TestOne, ['foo', 'bar', 'baz']) const TestAngularTwo = angularize(TestTwo, ['foo', 'bar', 'baz']) module('test', []) .component('testAngularOne', TestAngularOne) .component('testAngularTwo', TestAngularTwo) bootstrap($(), ['test']) interface Props { bar: boolean[] baz(value: number): any foo: number } describe('angularize', () => { let $compile: any beforeEach(() => { mock.module('test') mock.inject(function(_$compile_: ICompileService) { $compile = _$compile_ }) }) it('should give an angular component', () => { expect(TestAngularOne.bindings).not.toBe(undefined) expect(TestAngularOne.controller).not.toBe(undefined) }) describe('react classes', () => { it('should render', () => { const scope = Object.assign($rootScope.$new(true), { bar: [true, false], baz: (value: number) => value + 1, foo: 1 }) const element = $(``) $compile(element)(scope) $rootScope.$apply() expect(element.find('p').length).toBe(3) }) it('should update', () => { const scope = Object.assign($rootScope.$new(true), { bar: [true, false], baz: (value: number) => value + 1, foo: 1 }) const element = $(``) $compile(element)(scope) $rootScope.$apply() expect(element.find('p').eq(1).text()).toBe('Bar: true,false') scope.$apply(() => scope.bar = [false, true, true] ) expect(element.find('p').eq(1).text()).toBe('Bar: false,true,true') }) it('should destroy', () => { const scope = Object.assign($rootScope.$new(true), { bar: [true, false], baz: (value: number) => value + 1, foo: 1 }) const element = $(``) $compile(element)(scope) $rootScope.$apply() spyOn(TestOne.prototype, 'componentWillUnmount') scope.$destroy() expect(TestOne.prototype.componentWillUnmount).toHaveBeenCalled() }) it('should take callbacks', () => { const baz = jasmine.createSpy('baz') const scope = Object.assign($rootScope.$new(true), { bar: [true, false], baz, foo: 1 }) const element = $(``) $compile(element)(scope) $rootScope.$apply() Simulate.click(element.find('p').eq(2)[0]) expect(baz).toHaveBeenCalledWith(42) }) // TODO: support children it('should not support children', () => { const scope = Object.assign($rootScope.$new(true), { bar: [true, false], baz: (value: number) => value + 1, foo: 1 }) const element = $(`Transcluded`) $compile(element)(scope) $rootScope.$apply() expect(element.find('span').length).toBe(0) }) }) describe('react stateless components', () => { it('should render', () => { const scope = Object.assign($rootScope.$new(true), { bar: [true, false], baz: (value: number) => value + 1, foo: 1 }) const element = $(``) $compile(element)(scope) $rootScope.$apply() expect(element.find('p').length).toBe(3) }) it('should update', () => { const scope = Object.assign($rootScope.$new(true), { bar: [true, false], baz: (value: number) => value + 1, foo: 1 }) const element = $(``) $compile(element)(scope) $rootScope.$apply() expect(element.find('p').eq(1).text()).toBe('Bar: true,false') scope.$apply(() => scope.bar = [false, true, true] ) expect(element.find('p').eq(1).text()).toBe('Bar: false,true,true') }) // TODO: figure out how to test this xit('should destroy', () => {}) it('should take callbacks', () => { const baz = jasmine.createSpy('baz') const scope = Object.assign($rootScope.$new(true), { bar: [true, false], baz, foo: 1 }) const element = $(``) $compile(element)(scope) $rootScope.$apply() Simulate.click(element.find('p').eq(2)[0]) expect(baz).toHaveBeenCalledWith(42) }) // TODO: support children it('should not support children', () => { const scope = Object.assign($rootScope.$new(true), { bar: [true, false], baz: (value: number) => value + 1, foo: 1 }) const element = $(`Transcluded`) $compile(element)(scope) $rootScope.$apply() expect(element.find('span').length).toBe(0) }) }) })