kernelspec.spec.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import { expectFailure, JupyterServer } from '@jupyterlab/testutils';
  4. import { KernelSpecAPI } from '../../src';
  5. import { getRequestHandler, makeSettings, PYTHON_SPEC } from '../utils';
  6. const PYTHON3_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
  7. PYTHON3_SPEC.name = 'Python3';
  8. PYTHON3_SPEC.display_name = 'python3';
  9. const server = new JupyterServer();
  10. beforeAll(async () => {
  11. await server.start();
  12. });
  13. afterAll(async () => {
  14. await server.shutdown();
  15. });
  16. describe('kernel', () => {
  17. describe('KernelSpec.getSpecs()', () => {
  18. it('should load the kernelspecs', async () => {
  19. const specs = await KernelSpecAPI.getSpecs();
  20. expect(specs.default).toBeTruthy();
  21. });
  22. it('should accept ajax options', async () => {
  23. const serverSettings = makeSettings();
  24. const specs = await KernelSpecAPI.getSpecs(serverSettings);
  25. expect(specs.default).toBeTruthy();
  26. });
  27. it('should handle a missing default parameter', async () => {
  28. const serverSettings = getRequestHandler(200, {
  29. kernelspecs: { python: PYTHON_SPEC }
  30. });
  31. const specs = await KernelSpecAPI.getSpecs(serverSettings);
  32. expect(specs.default).toBeTruthy();
  33. });
  34. it('should throw for a missing kernelspecs parameter', async () => {
  35. const serverSettings = getRequestHandler(200, {
  36. default: PYTHON_SPEC.name
  37. });
  38. const promise = KernelSpecAPI.getSpecs(serverSettings);
  39. await expectFailure(promise, 'No kernelspecs found');
  40. });
  41. it('should omit an invalid kernelspec', async () => {
  42. const R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
  43. R_SPEC.name = 1;
  44. const serverSettings = getRequestHandler(200, {
  45. default: 'python',
  46. kernelspecs: {
  47. R: R_SPEC,
  48. python: PYTHON_SPEC
  49. }
  50. });
  51. const specs = await KernelSpecAPI.getSpecs(serverSettings);
  52. expect(specs.default).toBe('python');
  53. expect(specs.kernelspecs['R']).toBeUndefined();
  54. });
  55. it('should handle an improper name', async () => {
  56. const R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
  57. R_SPEC.name = 1;
  58. const serverSettings = getRequestHandler(200, {
  59. default: 'R',
  60. kernelspecs: { R: R_SPEC }
  61. });
  62. const promise = KernelSpecAPI.getSpecs(serverSettings);
  63. await expectFailure(promise, 'No valid kernelspecs found');
  64. });
  65. it('should handle an improper language', async () => {
  66. const R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
  67. R_SPEC.spec.language = 1;
  68. const serverSettings = getRequestHandler(200, {
  69. default: 'R',
  70. kernelspecs: { R: R_SPEC }
  71. });
  72. const promise = KernelSpecAPI.getSpecs(serverSettings);
  73. await expectFailure(promise, 'No valid kernelspecs found');
  74. });
  75. it('should handle an improper argv', async () => {
  76. const R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
  77. R_SPEC.spec.argv = 'hello';
  78. const serverSettings = getRequestHandler(200, {
  79. default: 'R',
  80. kernelspecs: { R: R_SPEC }
  81. });
  82. const promise = KernelSpecAPI.getSpecs(serverSettings);
  83. await expectFailure(promise, 'No valid kernelspecs found');
  84. });
  85. it('should handle an improper display_name', async () => {
  86. const R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
  87. R_SPEC.spec.display_name = ['hello'];
  88. const serverSettings = getRequestHandler(200, {
  89. default: 'R',
  90. kernelspecs: { R: R_SPEC }
  91. });
  92. const promise = KernelSpecAPI.getSpecs(serverSettings);
  93. await expectFailure(promise, 'No valid kernelspecs found');
  94. });
  95. it('should handle missing resources', async () => {
  96. const R_SPEC = JSON.parse(JSON.stringify(PYTHON_SPEC));
  97. delete R_SPEC.resources;
  98. const serverSettings = getRequestHandler(200, {
  99. default: 'R',
  100. kernelspecs: { R: R_SPEC }
  101. });
  102. const promise = KernelSpecAPI.getSpecs(serverSettings);
  103. await expectFailure(promise, 'No valid kernelspecs found');
  104. });
  105. it('should throw an error for an invalid response', async () => {
  106. const serverSettings = getRequestHandler(201, {});
  107. const promise = KernelSpecAPI.getSpecs(serverSettings);
  108. await expectFailure(promise, 'Invalid response: 201 Created');
  109. });
  110. it('should handle metadata', async () => {
  111. const PYTHON_SPEC_W_MD = JSON.parse(JSON.stringify(PYTHON_SPEC));
  112. PYTHON_SPEC_W_MD.spec.metadata = { some_application: { key: 'value' } };
  113. const serverSettings = getRequestHandler(200, {
  114. default: 'python',
  115. kernelspecs: { python: PYTHON_SPEC_W_MD }
  116. });
  117. const specs = await KernelSpecAPI.getSpecs(serverSettings);
  118. expect(specs.kernelspecs['python']).toHaveProperty('metadata');
  119. const metadata = specs.kernelspecs['python']!.metadata;
  120. expect(metadata).toHaveProperty('some_application');
  121. expect((metadata as any).some_application).toHaveProperty('key', 'value');
  122. });
  123. it('should handle env values', async () => {
  124. const PYTHON_SPEC_W_ENV = JSON.parse(JSON.stringify(PYTHON_SPEC));
  125. PYTHON_SPEC_W_ENV.spec.env = {
  126. SOME_ENV: 'some_value',
  127. LANG: 'en_US.UTF-8'
  128. };
  129. const serverSettings = getRequestHandler(200, {
  130. default: 'python',
  131. kernelspecs: { python: PYTHON_SPEC_W_ENV }
  132. });
  133. const specs = await KernelSpecAPI.getSpecs(serverSettings);
  134. expect(specs.kernelspecs['python']).toHaveProperty('env');
  135. const env = specs.kernelspecs['python']!.env;
  136. expect(env).toHaveProperty('SOME_ENV', 'some_value');
  137. expect(env).toHaveProperty('LANG', 'en_US.UTF-8');
  138. });
  139. });
  140. });