homedir.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. 'use strict';
  2. var os = require('os');
  3. var test = require('tape');
  4. var mockProperty = require('mock-property');
  5. var envKeys = ['HOME', 'USERPROFILE', 'HOMEDRIVE', 'HOMEPATH', 'LOGNAME', 'USER', 'LNAME', 'USERNAME'];
  6. function mockEnv(t, key, value) {
  7. var has = key in process.env;
  8. var orig = process.env[key];
  9. if (arguments.length > 2) {
  10. process.env[key] = value;
  11. } else {
  12. delete process.env[key];
  13. }
  14. t.teardown(function () {
  15. if (has) {
  16. process.env[key] = orig;
  17. } else {
  18. delete process.env[key];
  19. }
  20. });
  21. }
  22. function clearEnv(t) {
  23. for (var i = 0; i < envKeys.length; i++) {
  24. mockEnv(t, envKeys[i]);
  25. }
  26. }
  27. function getFallback(t) {
  28. t.teardown(mockProperty(os, 'homedir', { value: undefined }));
  29. var homedirPath = require.resolve('../lib/homedir');
  30. t.teardown(mockProperty(require.cache, homedirPath, { 'delete': true }));
  31. return require('../lib/homedir');
  32. }
  33. test('homedir fallback', function (t) {
  34. t.test('win32: HOMEDRIVE without HOMEPATH does not produce a false concatenation', function (st) {
  35. clearEnv(st);
  36. st.teardown(mockProperty(process, 'platform', { value: 'win32' }));
  37. var homedir = getFallback(st);
  38. mockEnv(st, 'HOMEDRIVE', 'C:');
  39. st.equal(homedir(), null, 'returns null when only HOMEDRIVE is set');
  40. st.end();
  41. });
  42. t.test('win32: HOMEPATH without HOMEDRIVE does not produce a false concatenation', function (st) {
  43. clearEnv(st);
  44. st.teardown(mockProperty(process, 'platform', { value: 'win32' }));
  45. var homedir = getFallback(st);
  46. mockEnv(st, 'HOMEPATH', '\\Users\\foo');
  47. st.equal(homedir(), null, 'returns null when only HOMEPATH is set');
  48. st.end();
  49. });
  50. t.test('win32: HOMEDRIVE + HOMEPATH both set returns concatenation', function (st) {
  51. clearEnv(st);
  52. st.teardown(mockProperty(process, 'platform', { value: 'win32' }));
  53. var homedir = getFallback(st);
  54. mockEnv(st, 'HOMEDRIVE', 'C:');
  55. mockEnv(st, 'HOMEPATH', '\\Users\\foo');
  56. st.equal(homedir(), 'C:\\Users\\foo', 'returns concatenated drive and path');
  57. st.end();
  58. });
  59. t.test('win32: USERPROFILE takes precedence over HOMEDRIVE+HOMEPATH', function (st) {
  60. clearEnv(st);
  61. st.teardown(mockProperty(process, 'platform', { value: 'win32' }));
  62. var homedir = getFallback(st);
  63. mockEnv(st, 'USERPROFILE', 'C:\\Users\\bar');
  64. mockEnv(st, 'HOMEDRIVE', 'C:');
  65. mockEnv(st, 'HOMEPATH', '\\Users\\foo');
  66. st.equal(homedir(), 'C:\\Users\\bar', 'returns USERPROFILE');
  67. st.end();
  68. });
  69. t.test('win32: falls back to HOME when HOMEDRIVE/HOMEPATH are partial', function (st) {
  70. clearEnv(st);
  71. st.teardown(mockProperty(process, 'platform', { value: 'win32' }));
  72. var homedir = getFallback(st);
  73. mockEnv(st, 'HOME', 'C:\\Users\\baz');
  74. mockEnv(st, 'HOMEDRIVE', 'C:');
  75. st.equal(homedir(), 'C:\\Users\\baz', 'falls back to HOME');
  76. st.end();
  77. });
  78. t.end();
  79. });