Passed
Push — main ( d53ef8...c82fb0 )
by Andrii
01:47
created

src/parse.test.ts   A

Complexity

Total Complexity 7
Complexity/F 1.75

Size

Lines of Code 167
Function Count 4

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 142
mnd 3
bc 3
fnc 4
dl 0
loc 167
rs 10
bpm 0.75
cpm 1.75
noi 0
c 0
b 0
f 0
1
import { join } from "../research/utils"
2
import { parse } from "./parse"
3
4
describe(parse.name, () => {
5
  describe("Complex input", () => {
6
    it(...p(Buffer.from("SPEC_DIRECT=direct"), {"SPEC_DIRECT": "direct"}))
7
    it(...p(["A=1", "B=2"], {"A": "1", "B": "2"}))
8
  })
9
10
  describe("Straight stuff", () => {
11
    it(...p("SPEC_"                   , {}))
12
    it(...p("SPEC_EMPTY="             , {"SPEC_EMPTY": ""}))
13
    it(...p("SPEC_DIRECT=direct"      , {"SPEC_DIRECT": "direct"}))
14
    it(...p("SPEC_SINGLE='single'"    , {"SPEC_SINGLE": "single"}))
15
    it(...p("SPEC_DOUBLE=\"double\""  , {"SPEC_DOUBLE": "double"}))
16
    it(...p("SPEC_BACKTICK=`backtick`", {"SPEC_BACKTICK": "`backtick`"}))
17
    it(...p("SPEC_BASH=$'bash'"       , {"SPEC_BASH": "$'bash'"}))
18
    it(...p("SPEC_SPACE=abc def"      , {"SPEC_SPACE": "abc def"}))
19
  })
20
21
  describe("Commented value", () => {
22
    it(...p("SPEC_COMMENTED_VALUE=#commented" , {"SPEC_COMMENTED_VALUE": "#commented"}))
23
    it(...p("SPEC_COMMENTED_MIDDLE=comment#ed", {"SPEC_COMMENTED_MIDDLE": "comment#ed"}))
24
    it(...p("SPEC_COMMENTED_SPACE=comment #ed", {"SPEC_COMMENTED_SPACE": "comment"}))
25
    it(...p("# SPEC_COMMENT=comment"          , {}))
26
  })
27
28
  describe("Tricky", () => {
29
    it(...p("SPEC_ONELINE_1=1; SPEC_ONELINE_2=1", {"SPEC_ONELINE_1": "1; SPEC_ONELINE_2=1"}))
30
    it(...p("SPEC_SUBSHELL=$(echo 1)"           , {"SPEC_SUBSHELL": "$(echo 1)"}))
31
    it(...p(" SPEC_LEADING_SPACE=space"         , {"SPEC_LEADING_SPACE": "space"}))
32
    it(...p("- SPEC_LEADING_DASH=WARN"          , {}))
33
    it(...p("$SPEC_LEADING_DOLLAR=l$"           , {"$SPEC_LEADING_DOLLAR": "l$"}))
34
    it(...p("1SPEC_LEADING_DIGIT=1"             , {"1SPEC_LEADING_DIGIT": "1"}))
35
    it(...p("=SPEC_LEADING_EQ=WARN"             , {}))
36
    it.skip(...p("SPEC_UNQUOTED=\" #WARN"       , {}))
37
    it.skip(...p('"SPEC_ESCAPE": "\""'          , {"SPEC_ESCAPE": "\""}))
38
  })
39
40
  describe("Not standard names", () => {
41
    it(...p("SPEC_lowercase=Lowercase", {"SPEC_lowercase": "Lowercase"}))
42
    it(...p("SPEC_-=-"                , {"SPEC_-": "-"}))
43
    it(...p("SPEC_:=:"                , {"SPEC_:": ":"}))
44
    it(...p("SPEC_@=@"                , {"SPEC_@": "@"}))
45
    it(...p("SPEC_\\==`=`"            , {"SPEC_\\": "=`=`"}))
46
  })
47
48
  describe("Reuse", () => {
49
    it(...p("Straight", [
50
      "SPEC_ASSIGNED=assigned",
51
      "SPEC_REUSE_DIRECT=$SPEC_ASSIGNED",
52
      "SPEC_REUSE_SINGLE='$SPEC_ASSIGNED'",
53
      "SPEC_REUSE_DOUBLE=\"$SPEC_ASSIGNED\"",
54
      "SPEC_REUSE_CURVES=${SPEC_ASSIGNED}",
55
      "SPEC_REUSE_EXPR=${SPEC_ASSIGNED} is ${SPEC_ASSIGNED}",
56
      "SPEC_REUSE_EXPR_2=${X} is not ${SPEC_ASSIGNED}"
57
    ], {
58
      "SPEC_ASSIGNED": "assigned",
59
      "SPEC_REUSE_DIRECT": "$SPEC_ASSIGNED",
60
      "SPEC_REUSE_SINGLE": "$SPEC_ASSIGNED",
61
      "SPEC_REUSE_DOUBLE": "$SPEC_ASSIGNED",
62
      "SPEC_REUSE_CURVES": "assigned",
63
      "SPEC_REUSE_EXPR": "assigned is assigned",
64
      "SPEC_REUSE_EXPR_2": " is not assigned",
65
    }))
66
  })
67
68
  describe("Defaults and Errors",() => {
69
    it(...p("Done", [
70
      "SPEC_ASSIGNED=assigned",
71
      // Works
72
      "SPEC_DEFAULT_FALSY_0=${SPEC_ASSIGNED:-def}",
73
      "SPEC_DEFAULT_FALSY_1=${X:-${SPEC_ASSIGNED}}",
74
      // Whatever
75
      "SPEC_DEFAULT_UNDEF_0=${SPEC_ASSIGNED-def}",
76
      "SPEC_ERROR_FALSY_0=${SPEC_ASSIGNED?def}",
77
      "SPEC_DEFAULT_UNDEF_1=${X-${SPEC_ASSIGNED}}",
78
      "SPEC_ERROR_UNDEF_1=${X?${SPEC_ASSIGNED}}",
79
    ], {
80
      "SPEC_ASSIGNED": "assigned",
81
      // Works
82
      "SPEC_DEFAULT_FALSY_0": "assigned",
83
      "SPEC_DEFAULT_FALSY_1": "${SPEC_ASSIGNED}",
84
      // Whatever
85
      "SPEC_DEFAULT_UNDEF_0": "",
86
      "SPEC_ERROR_FALSY_0": "",
87
      "SPEC_DEFAULT_UNDEF_1": "}",
88
      "SPEC_ERROR_UNDEF_1": "}"
89
    }))
90
91
    it.skip(...p("Ununderstandable Errors", [
92
      "SPEC_ASSIGNED=assigned",
93
      "SPEC_ERROR_UNDEF_0=${SPEC_ASSIGNED:?def}",
94
      "SPEC_ERROR_FALSY_1=${X:?${SPEC_ASSIGNED}}"
95
    ], {
96
      "SPEC_ASSIGNED": "assigned",
97
      "SPEC_ERROR_UNDEF_0": "${SPEC_ASSIGNED:?def}",
98
      "SPEC_ERROR_FALSY_1": "${X:?assigned}"
99
    }))
100
  })
101
102
  describe("Scope, reserved", () => {
103
    it("Scope", () => expect(parse(
104
      join(
105
        "ME=me",
106
        "GLOBAL=me",
107
        "FROM_ME=${ME}",
108
        "FROM_GLOBAL=${GLOBAL}"
109
      ),
110
      {"GLOBAL": "global"},
111
      undefined
112
    )).toStrictEqual({
113
      "ME": "me",
114
      "FROM_ME": "me",
115
      "FROM_GLOBAL": "global"
116
    }))
117
118
    it("Reserved", () => expect(parse(
119
      "OVERWRITE=me",
120
      undefined,
121
      {"OVERWRITE": undefined},
122
    )).toStrictEqual({
123
    }))
124
  })
125
126
  it("Process.ENV values", () => expect(parse(
127
    join(
128
      "U=${Undefined}",
129
      "N=${Null}",
130
      "F=${False}",
131
      "Z=${Zero}"
132
    ),
133
    {
134
      "Undefined": undefined,
135
      "Null": null,
136
      //@ts-expect-error
137
      "False": false,
138
      //@ts-expect-error
139
      "Zero": 0
140
    },
141
    undefined
142
  )).toStrictEqual({
143
    "U": "",
144
    "N": "",
145
    "F": "false",
146
    "Z": "0"
147
  }))
148
})
149
150
151
function p(input: Buffer|string|string[], output: unknown): ReturnType<typeof _p>
152
function p(title: string, input: Buffer|string|string[], output: unknown): ReturnType<typeof _p>
153
function p(...args: any[]) {
154
  //@ts-expect-error
155
  return _p(...args.reverse())
156
}
157
158
function _p(output: unknown, input: Buffer|string|string[], title?: string) {
159
  const arg = input instanceof Buffer ? input : join(input)
160
161
  return [`${title ?? arg}`, () => expect(parse(
162
    arg,
163
    undefined,
164
    undefined
165
  )).toStrictEqual(output)] as const
166
}
167