react-native-navigation的迁移库

ContainerCommands.test.js 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import NativeCommandsSender from '../adapters/NativeCommandsSender.mock';
  2. import UniqueIdProvider from '../adapters/UniqueIdProvider.mock';
  3. import Store from '../containers/Store';
  4. import LayoutTreeParser from './LayoutTreeParser';
  5. import LayoutTreeCrawler from './LayoutTreeCrawler';
  6. import ContainerCommands from './ContainerCommands';
  7. describe('ContainerCommands', () => {
  8. let uut;
  9. let mockCommandsSender;
  10. const containerId = 'myUniqueId';
  11. beforeEach(() => {
  12. mockCommandsSender = new NativeCommandsSender();
  13. uut = new ContainerCommands(containerId, mockCommandsSender, new LayoutTreeParser(), new LayoutTreeCrawler(new UniqueIdProvider(), new Store()));
  14. });
  15. it('holds containerId', () => {
  16. expect(uut.containerId).toEqual('myUniqueId');
  17. });
  18. describe('push', () => {
  19. it('deep clones input to avoid mutation errors', () => {
  20. const obj = {};
  21. uut.push({ name: 'name', inner: { foo: obj } });
  22. expect(mockCommandsSender.push.mock.calls[0][1].data.inner.foo).not.toBe(obj);
  23. });
  24. it('resolves with the parsed layout', async () => {
  25. mockCommandsSender.push.mockReturnValue(Promise.resolve('the resolved layout'));
  26. const result = await uut.push({ name: 'com.example.MyScreen' });
  27. expect(result).toEqual('the resolved layout');
  28. });
  29. it('parses into correct layout node and sends to native', () => {
  30. uut.push({ name: 'com.example.MyScreen' });
  31. expect(mockCommandsSender.push).toHaveBeenCalledTimes(1);
  32. expect(mockCommandsSender.push).toHaveBeenCalledWith('myUniqueId', {
  33. type: 'Container',
  34. id: 'Container+UNIQUE_ID',
  35. data: {
  36. name: 'com.example.MyScreen',
  37. navigationStyle: {}
  38. },
  39. children: []
  40. });
  41. });
  42. });
  43. describe('pop', () => {
  44. it('pops a container, passing containerId', () => {
  45. uut.pop();
  46. expect(mockCommandsSender.pop).toHaveBeenCalledTimes(1);
  47. expect(mockCommandsSender.pop).toHaveBeenCalledWith(containerId);
  48. });
  49. it('pop returns a promise that resolves to containerId', async () => {
  50. mockCommandsSender.pop.mockReturnValue(Promise.resolve(containerId));
  51. const result = await uut.pop();
  52. expect(result).toEqual(containerId);
  53. });
  54. });
  55. describe('popTo', () => {
  56. it('pops all containers until the passed Id is top', () => {
  57. uut.popTo('someOtherContainerId');
  58. expect(mockCommandsSender.popTo).toHaveBeenCalledTimes(1);
  59. expect(mockCommandsSender.popTo).toHaveBeenCalledWith(containerId, 'someOtherContainerId');
  60. });
  61. it('returns a promise that resolves to targetId', async () => {
  62. mockCommandsSender.popTo.mockReturnValue(Promise.resolve(containerId));
  63. const result = await uut.popTo('someOtherContainerId');
  64. expect(result).toEqual(containerId);
  65. });
  66. });
  67. describe('popToRoot', () => {
  68. it('pops all containers to root', () => {
  69. uut.popToRoot();
  70. expect(mockCommandsSender.popToRoot).toHaveBeenCalledTimes(1);
  71. expect(mockCommandsSender.popToRoot).toHaveBeenCalledWith(containerId);
  72. });
  73. it('returns a promise that resolves to targetId', async () => {
  74. mockCommandsSender.popToRoot.mockReturnValue(Promise.resolve(containerId));
  75. const result = await uut.popToRoot();
  76. expect(result).toEqual(containerId);
  77. });
  78. });
  79. });