package_json.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. import os
  2. import pytest
  3. from build.plugins.lib.nots.package_manager.base.package_json import PackageJson, PackageJsonWorkspaceError
  4. def test_get_name_exist():
  5. pj = PackageJson("/packages/foo/package.json")
  6. pj.data = {
  7. "name": "package-name",
  8. }
  9. name = pj.get_name()
  10. assert name == "package-name"
  11. def test_get_name_none():
  12. pj = PackageJson("/packages/foo/package.json")
  13. pj.data = {}
  14. name = pj.get_name()
  15. assert name == "packages-foo"
  16. def test_get_workspace_dep_spec_paths_ok():
  17. pj = PackageJson("/packages/foo/package.json")
  18. pj.data = {
  19. "dependencies": {
  20. "@yandex-int/bar": "workspace:../bar",
  21. },
  22. "devDependencies": {
  23. "@yandex-int/baz": "workspace:../baz",
  24. },
  25. }
  26. ws_dep_spec_paths = pj.get_workspace_dep_spec_paths()
  27. assert ws_dep_spec_paths == [
  28. ("@yandex-int/bar", "../bar"),
  29. ("@yandex-int/baz", "../baz"),
  30. ]
  31. def test_get_workspace_dep_spec_paths_invalid_path():
  32. pj = PackageJson("/packages/foo/package.json")
  33. pj.data = {
  34. "dependencies": {
  35. "@yandex-int/bar": "workspace:*",
  36. },
  37. }
  38. with pytest.raises(PackageJsonWorkspaceError) as e:
  39. pj.get_workspace_dep_spec_paths()
  40. assert (
  41. str(e.value)
  42. == "Expected relative path specifier for workspace dependency, but got 'workspace:*' for @yandex-int/bar in /packages/foo/package.json"
  43. )
  44. def test_get_workspace_dep_paths_ok():
  45. pj = PackageJson("/packages/foo/package.json")
  46. pj.data = {
  47. "dependencies": {
  48. "@yandex-int/bar": "workspace:../bar",
  49. },
  50. "devDependencies": {
  51. "@yandex-int/baz": "workspace:../baz",
  52. },
  53. }
  54. ws_dep_paths = pj.get_workspace_dep_paths()
  55. assert ws_dep_paths == [
  56. "/packages/bar",
  57. "/packages/baz",
  58. ]
  59. def test_get_dep_specifier():
  60. pj = PackageJson("/packages/foo/package.json")
  61. pj.data = {
  62. "dependencies": {
  63. "jestify": "0.0.1",
  64. "eslint": ">= 7.27.0",
  65. },
  66. "devDependencies": {
  67. "jest": "27.1.0",
  68. "eslinting": "0.0.2",
  69. },
  70. }
  71. jest_spec = pj.get_dep_specifier("jest")
  72. assert jest_spec == "27.1.0", "Got unexpected jest specifier: {}".format(jest_spec)
  73. eslint_spec = pj.get_dep_specifier("eslint")
  74. assert eslint_spec == ">= 7.27.0", "Got unexpected eslint specifier: {}".format(eslint_spec)
  75. def test_get_workspace_dep_paths_with_custom_base_path():
  76. pj = PackageJson("/packages/foo/package.json")
  77. pj.data = {
  78. "dependencies": {
  79. "@yandex-int/bar": "workspace:../bar",
  80. },
  81. "devDependencies": {
  82. "@yandex-int/baz": "workspace:../baz",
  83. },
  84. }
  85. ws_dep_paths = pj.get_workspace_dep_paths(base_path="custom/dir")
  86. assert ws_dep_paths == [
  87. "custom/bar",
  88. "custom/baz",
  89. ]
  90. def test_get_workspace_deps_ok():
  91. pj = PackageJson("/packages/foo/package.json")
  92. pj.data = {
  93. "dependencies": {
  94. "@yandex-int/bar": "workspace:../bar",
  95. },
  96. "devDependencies": {
  97. "@yandex-int/baz": "workspace:../baz",
  98. },
  99. }
  100. def load_mock(cls, path):
  101. p = PackageJson(path)
  102. p.data = {
  103. "name": "@yandex-int/{}".format(os.path.basename(os.path.dirname(path))),
  104. }
  105. return p
  106. PackageJson.load = classmethod(load_mock)
  107. ws_deps = pj.get_workspace_deps()
  108. assert len(ws_deps) == 2
  109. assert ws_deps[0].path == "/packages/bar/package.json"
  110. assert ws_deps[1].path == "/packages/baz/package.json"
  111. def test_get_workspace_deps_with_wrong_name():
  112. pj = PackageJson("/packages/foo/package.json")
  113. pj.data = {
  114. "dependencies": {
  115. "@yandex-int/bar": "workspace:../bar",
  116. },
  117. }
  118. def load_mock(cls, path):
  119. p = PackageJson(path)
  120. p.data = {
  121. "name": "@shouldbe/{}".format(os.path.basename(os.path.dirname(path))),
  122. }
  123. return p
  124. PackageJson.load = classmethod(load_mock)
  125. with pytest.raises(PackageJsonWorkspaceError) as e:
  126. pj.get_workspace_deps()
  127. assert (
  128. str(e.value)
  129. == "Workspace dependency name mismatch, found '@yandex-int/bar' instead of '@shouldbe/bar' in /packages/foo/package.json"
  130. )
  131. def test_get_workspace_map_ok():
  132. pj = PackageJson("/packages/foo/package.json")
  133. pj.data = {
  134. "dependencies": {
  135. "@yandex-int/bar": "workspace:../bar",
  136. },
  137. }
  138. def load_mock(cls, path):
  139. name = os.path.basename(os.path.dirname(path))
  140. p = PackageJson(path)
  141. p.data = {
  142. "name": "@yandex-int/{}".format(name),
  143. "dependencies": ({"@yandex-int/qux": "workspace:../qux"} if name == "bar" else {}),
  144. }
  145. return p
  146. PackageJson.load = classmethod(load_mock)
  147. ws_map = pj.get_workspace_map()
  148. assert len(ws_map) == 3
  149. assert ws_map["/packages/foo"][0].path == "/packages/foo/package.json"
  150. assert ws_map["/packages/foo"][1] == 0
  151. assert ws_map["/packages/bar"][0].path == "/packages/bar/package.json"
  152. assert ws_map["/packages/bar"][1] == 1
  153. assert ws_map["/packages/qux"][0].path == "/packages/qux/package.json"
  154. assert ws_map["/packages/qux"][1] == 2
  155. def test_get_bin_path_string():
  156. # arrange
  157. pj = PackageJson("/packages/foo/package.json")
  158. pj.data = {
  159. "name": "next",
  160. "bin": "./dist/bin/next",
  161. }
  162. # act + assert
  163. assert pj.get_bin_path() == "./dist/bin/next"
  164. def test_get_bin_path_same_name():
  165. # arrange
  166. pj = PackageJson("/packages/foo/package.json")
  167. pj.data = {
  168. "name": "next",
  169. "bin": {"next": "./dist/bin/next"},
  170. }
  171. # act + assert
  172. assert pj.get_bin_path() == "./dist/bin/next"
  173. def test_get_bin_path_custom_bin_name():
  174. # arrange
  175. pj = PackageJson("/packages/foo/package.json")
  176. pj.data = {
  177. "name": "typescript",
  178. "bin": {"tsc": "./bin/tsc"},
  179. }
  180. # act + assert
  181. assert pj.get_bin_path("tsc") == "./bin/tsc"