Skip to content

Commit 88bc816

Browse files
authored
Merge pull request #56 from SamirTalwar/bless-missing-files
2 parents be36c40 + dc1f315 commit 88bc816

16 files changed

Lines changed: 140 additions & 48 deletions

fixtures/broken-specs/smoke.yaml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ tests:
22
- name: no-command
33

44
- name: no-outputs
5-
command: echo
5+
command:
6+
- echo
67
args:
78
- input
89

910
- name: missing-input-file
10-
command: echo
11+
command:
12+
- echo
1113
args:
1214
- something
1315
stdin:
@@ -16,15 +18,15 @@ tests:
1618
output
1719
1820
- name: missing-output-file
19-
command: echo
21+
command:
22+
- echo
2023
args:
21-
- something
24+
- "This is some standard output."
2225
stdout:
2326
file: io/missing.out
2427

2528
- name: missing-error-file
26-
command: echo
27-
args:
28-
- something
29+
command: |
30+
echo "This is some standard error.">&2
2931
stderr:
3032
file: io/missing.err

spec/bless.yaml

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@ tests:
1919
revert:
2020
- ../fixtures/calculator
2121

22+
- name: bottles
23+
args:
24+
- --bless
25+
- fixtures/bottles
26+
exit-status: 1
27+
stdout:
28+
file: io/bottles-bless-failure.out
29+
revert:
30+
- ../fixtures/bottles
31+
2232
- name: files
2333
args:
2434
- --bless
@@ -33,12 +43,23 @@ tests:
3343
revert:
3444
- ../fixtures/files
3545

36-
- name: bottles
46+
- name: broken-specs
3747
args:
3848
- --bless
39-
- fixtures/bottles
49+
- fixtures/broken-specs
4050
exit-status: 1
4151
stdout:
42-
file: io/bottles-bless-failure.out
52+
- file: io/broken-specs-bless-failure.out-unix
53+
- file: io/broken-specs-bless-failure.out-windows
54+
files:
55+
- path: ../fixtures/broken-specs/io/missing.out
56+
contents: |
57+
This is some standard output.
58+
- path: ../fixtures/broken-specs/io/missing.err
59+
contents:
60+
- |
61+
This is some standard error.
62+
- |
63+
"This is some standard error."
4364
revert:
44-
- ../fixtures/bottles
65+
- ../fixtures/broken-specs
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
no-command
2+
There is no command.
3+
no-outputs
4+
There are no STDOUT or STDERR values, or files, in the specification.
5+
missing-input-file
6+
The fixture "io/missing.in" does not exist.
7+
missing-output-file
8+
succeeded
9+
missing-error-file
10+
succeeded
11+
12+
5 tests, 3 failures
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
no-command
2+
There is no command.
3+
no-outputs
4+
There are no STDOUT or STDERR values, or files, in the specification.
5+
missing-input-file
6+
The fixture "io\missing.in" does not exist.
7+
missing-output-file
8+
succeeded
9+
missing-error-file
10+
succeeded
11+
12+
5 tests, 3 failures

spec/io/broken-specs.out-unix

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ no-outputs
55
missing-input-file
66
The fixture "io/missing.in" does not exist.
77
missing-output-file
8-
The fixture "io/missing.out" does not exist.
8+
args: This is some standard output.
9+
stdout:
10+
The fixture "io/missing.out" does not exist.
11+
actual: This is some standard output.
912
missing-error-file
10-
The fixture "io/missing.err" does not exist.
13+
stderr:
14+
The fixture "io/missing.err" does not exist.
15+
actual: This is some standard error.
1116

1217
5 tests, 5 failures

spec/io/broken-specs.out-windows

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ no-outputs
55
missing-input-file
66
The fixture "io\missing.in" does not exist.
77
missing-output-file
8-
The fixture "io\missing.out" does not exist.
8+
args: This is some standard output.
9+
stdout:
10+
The fixture "io\missing.out" does not exist.
11+
actual: This is some standard output.
912
missing-error-file
10-
The fixture "io\missing.err" does not exist.
13+
stderr:
14+
The fixture "io\missing.err" does not exist.
15+
actual: "This is some standard error."
1116

1217
5 tests, 5 failures

src/app/Test/Smoke/App/PrintErrors.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ printTestError (PlanningError NoInput) =
3030
printTestError (PlanningError NoOutput) =
3131
printError
3232
"There are no STDOUT or STDERR values, or files, in the specification."
33-
printTestError (PlanningError (NonExistentFixture path)) =
33+
printTestError (PlanningError (PlanningFixtureFileError (MissingFile path))) =
3434
printError $ "The fixture " <> showPath path <> " does not exist."
35-
printTestError (PlanningError (CouldNotReadFixture path exception)) =
35+
printTestError (PlanningError (PlanningFixtureFileError (CouldNotReadFile path exception))) =
3636
printErrorWithException exception $
3737
"The fixture " <> showPath path <> " could not be read."
3838
printTestError (PlanningError (PlanningFilterError filterError)) =

src/app/Test/Smoke/App/PrintResults.hs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,17 +92,30 @@ printFailureName (LongName name) _ = do
9292
failureIsInline :: AssertionFailure a -> Bool
9393
failureIsInline AssertionFailureDiff {} = True
9494
failureIsInline AssertionFailureContains {} = False
95-
failureIsInline AssertionFailureFileError {} = True
95+
failureIsInline AssertionFailureExpectedFileError {} = True
96+
failureIsInline AssertionFailureActualFileError {} = True
9697

9798
printFailure :: FixtureType a => AssertionFailure a -> Output ()
98-
printFailure (AssertionFailureDiff expected actual) = printDiff (serializeFixture expected) (serializeFixture actual)
99-
printFailure (AssertionFailureContains expected actual) = do
99+
printFailure (AssertionFailureDiff (Expected expected) (Actual actual)) =
100+
printDiff (serializeFixture expected) (serializeFixture actual)
101+
printFailure (AssertionFailureContains (Expected expected) (Actual actual)) = do
100102
putPlainLn ""
101103
putRedLn " expected to contain:"
102104
putRedLn $ indentedAll nestedOutputIndentation (serializeFixture expected)
103105
putRed " actual: "
104106
putRedLn $ indented nestedOutputIndentation (serializeFixture actual)
105-
printFailure (AssertionFailureFileError (SmokeFileError exception)) = do
107+
printFailure (AssertionFailureExpectedFileError fileError (Actual actual)) = do
108+
printFailureFileError fileError
109+
putRed " actual: "
110+
putRedLn $ indented nestedOutputIndentation (serializeFixture actual)
111+
printFailure (AssertionFailureActualFileError fileError) =
112+
printFailureFileError fileError
113+
114+
printFailureFileError :: SmokeFileError -> Output ()
115+
printFailureFileError (MissingFile path) = do
116+
putPlainLn ""
117+
putRedLn $ " The fixture " <> showPath path <> " does not exist."
118+
printFailureFileError (CouldNotReadFile _ exception) = do
106119
putRedLn $ fromString (ioeGetErrorString exception)
107120

108121
printDiff :: Text -> Text -> Output ()

src/lib/Test/Smoke/Assert.hs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,24 @@ processOutputs location testPlan@(TestPlan _ _ fallbackShell _ _ _ expectedStatu
3636
assertEqual :: Eq a => a -> a -> EqualityResult a
3737
assertEqual expected actual
3838
| expected == actual = EqualitySuccess
39-
| otherwise = EqualityFailure expected actual
39+
| otherwise = EqualityFailure (Expected expected) (Actual actual)
4040

4141
assert :: Assert a -> a -> Asserting (Maybe (AssertionFailure a))
4242
assert (AssertEquals expected) actual =
4343
return $
4444
if expected == actual
4545
then Nothing
46-
else Just $ AssertionFailureDiff expected actual
46+
else Just $ AssertionFailureDiff (Expected expected) (Actual actual)
4747
assert (AssertContains expected) actual =
4848
return $
4949
if Text.isInfixOf (serializeFixture expected) (serializeFixture actual)
5050
then Nothing
51-
else Just $ AssertionFailureContains expected actual
51+
else Just $ AssertionFailureContains (Expected expected) (Actual actual)
5252
assert (AssertFiltered fixtureFilter expected) actual = do
5353
filteredActual <- withExceptT AssertionFilterError $ applyFilters fallbackShell fixtureFilter actual
5454
assert expected filteredActual
55+
assert (AssertFileError fileError) actual =
56+
return $ Just $ AssertionFailureExpectedFileError fileError (Actual actual)
5557

5658
assertAll :: Vector (Assert a) -> a -> Asserting (AssertionResult a)
5759
assertAll expecteds actual = do
@@ -62,7 +64,7 @@ processOutputs location testPlan@(TestPlan _ _ fallbackShell _ _ _ expectedStatu
6264
assertFile assertions (ActualFileContents contents) =
6365
assertAll assertions contents
6466
assertFile _ (ActualFileError fileError) =
65-
return . AssertionFailure . SingleAssertionFailure $ AssertionFailureFileError fileError
67+
return . AssertionFailure . SingleAssertionFailure $ AssertionFailureActualFileError fileError
6668

6769
collapseAssertionFailures :: Vector (AssertionFailure a) -> AssertionFailures a
6870
collapseAssertionFailures failures =

src/lib/Test/Smoke/Bless.hs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import Test.Smoke.Paths
1919
import Test.Smoke.Types
2020

2121
blessResult :: ResolvedPath Dir -> TestResult -> IO TestResult
22-
blessResult _ (TestResult TestPlan {planTest = test} (EqualityFailure _ (Status actualStatus)) _ _ _) =
22+
blessResult _ (TestResult TestPlan {planTest = test} (EqualityFailure _ (Actual (Status actualStatus))) _ _ _) =
2323
failed test $ CouldNotBlessInlineFixture "status" (Text.pack (show actualStatus))
2424
blessResult location result@(TestResult TestPlan {planTest = test} _ stdOut stdErr files) =
2525
do
@@ -40,6 +40,7 @@ blessResult location result@(TestResult TestPlan {planTest = test} _ stdOut stdE
4040
writeFixture Nothing _ before =
4141
return before
4242
writeFixture (Just (path, text)) makeAfter before = do
43+
createParent (location </> path)
4344
writeToPath (location </> path) text
4445
return $ makeAfter AssertionSuccess before
4546
blessResult _ result = return result
@@ -57,13 +58,17 @@ serialize outputs (AssertionFailure result) =
5758
throwIO $ CouldNotBlessWithMultipleValues (fixtureName @a)
5859

5960
serializeFailure :: forall a. FixtureType a => TestOutput a -> AssertionFailures a -> IO (Maybe (RelativePath File, Text))
60-
serializeFailure (TestOutput _ (FileLocation path)) (SingleAssertionFailure (AssertionFailureDiff _ actual)) =
61+
serializeFailure (TestOutput _ (FileLocation path)) (SingleAssertionFailure (AssertionFailureDiff _ (Actual actual))) =
6162
return $ Just (path, serializeFixture actual)
62-
serializeFailure (TestOutput _ (Inline _)) (SingleAssertionFailure (AssertionFailureDiff _ actual)) =
63+
serializeFailure (TestOutput _ (Inline _)) (SingleAssertionFailure (AssertionFailureDiff _ (Actual actual))) =
6364
throwIO $ CouldNotBlessInlineFixture (fixtureName @a) (serializeFixture actual)
64-
serializeFailure (TestOutput _ _) (SingleAssertionFailure (AssertionFailureContains _ actual)) =
65+
serializeFailure (TestOutput _ _) (SingleAssertionFailure (AssertionFailureContains _ (Actual actual))) =
6566
throwIO $ CouldNotBlessContainsAssertion (fixtureName @a) (serializeFixture actual)
66-
serializeFailure (TestOutput _ _) (SingleAssertionFailure (AssertionFailureFileError _)) =
67+
serializeFailure (TestOutput _ (FileLocation path)) (SingleAssertionFailure (AssertionFailureExpectedFileError _ (Actual actual))) =
68+
return $ Just (path, serializeFixture actual)
69+
serializeFailure (TestOutput _ (Inline _)) (SingleAssertionFailure (AssertionFailureExpectedFileError _ (Actual actual))) =
70+
throwIO $ CouldNotBlessInlineFixture (fixtureName @a) (serializeFixture actual)
71+
serializeFailure (TestOutput _ _) (SingleAssertionFailure (AssertionFailureActualFileError _)) =
6772
return Nothing
6873
serializeFailure _ (MultipleAssertionFailures _) =
6974
throwIO $ CouldNotBlessWithMultipleValues (fixtureName @a)

0 commit comments

Comments
 (0)