1 #include "persistent_json_storage.hpp"
2 
3 #include "gmock/gmock.h"
4 #include "gtest/gtest.h"
5 
6 using namespace testing;
7 
8 class TestPersistentJsonStorage : public Test
9 {
10   public:
11     using FilePath = interfaces::JsonStorage::FilePath;
12     using DirectoryPath = interfaces::JsonStorage::DirectoryPath;
13 
14     static void SetUpTestSuite()
15     {
16         ASSERT_FALSE(std::filesystem::exists(directory));
17     }
18 
19     void TearDown() override
20     {
21         if (std::filesystem::exists(directory))
22         {
23             std::filesystem::remove_all(directory);
24         }
25     }
26 
27     const FilePath fileName = FilePath("report/1/file.txt");
28 
29     static const DirectoryPath directory;
30     PersistentJsonStorage sut{directory};
31 };
32 
33 const interfaces::JsonStorage::DirectoryPath
34     TestPersistentJsonStorage::directory =
35         interfaces::JsonStorage::DirectoryPath(std::tmpnam(nullptr));
36 
37 TEST_F(TestPersistentJsonStorage, storesJsonData)
38 {
39     nlohmann::json data = nlohmann::json::object();
40     data["name"] = "kevin";
41     data["lastname"] = "mc calister";
42 
43     sut.store(fileName, data);
44 
45     ASSERT_THAT(sut.load(fileName), Eq(data));
46 }
47 
48 TEST_F(TestPersistentJsonStorage, emptyListWhenNoReportsCreated)
49 {
50     EXPECT_THAT(sut.list(DirectoryPath("report")), SizeIs(0u));
51 }
52 
53 TEST_F(TestPersistentJsonStorage, listSavedReports)
54 {
55     sut.store(FilePath("report/domain-1/name-1/conf-1.json"),
56               nlohmann::json("data-1a"));
57     sut.store(FilePath("report/domain-1/name-2/conf-1.json"),
58               nlohmann::json("data-2a"));
59     sut.store(FilePath("report/domain-1/name-2/conf-2.json"),
60               nlohmann::json("data-2b"));
61     sut.store(FilePath("report/domain-2/name-1/conf-1.json"),
62               nlohmann::json("data-3a"));
63 
64     EXPECT_THAT(sut.list(DirectoryPath("report")),
65                 UnorderedElementsAre(FilePath("report/domain-1/name-1"),
66                                      FilePath("report/domain-1/name-2"),
67                                      FilePath("report/domain-2/name-1")));
68 }
69 
70 TEST_F(TestPersistentJsonStorage, listSavedReportsWithoutRemovedOnes)
71 {
72     sut.store(FilePath("report/domain-1/name-1/conf-1.json"),
73               nlohmann::json("data-1a"));
74     sut.store(FilePath("report/domain-1/name-2/conf-1.json"),
75               nlohmann::json("data-2a"));
76     sut.store(FilePath("report/domain-1/name-2/conf-2.json"),
77               nlohmann::json("data-2b"));
78     sut.store(FilePath("report/domain-2/name-1/conf-1.json"),
79               nlohmann::json("data-3a"));
80     sut.remove(FilePath("report/domain-1/name-1/conf-1.json"));
81     sut.remove(FilePath("report/domain-1/name-2/conf-2.json"));
82 
83     EXPECT_THAT(sut.list(DirectoryPath("report")),
84                 UnorderedElementsAre(FilePath("report/domain-1/name-2"),
85                                      FilePath("report/domain-2/name-1")));
86 }
87 
88 TEST_F(TestPersistentJsonStorage, removesStoredJson)
89 {
90     nlohmann::json data = nlohmann::json::object();
91     data["name"] = "kevin";
92     data["lastname"] = "mc calister";
93 
94     sut.store(fileName, data);
95 
96     ASSERT_THAT(sut.remove(fileName), Eq(true));
97     ASSERT_THAT(sut.load(fileName), Eq(std::nullopt));
98 }
99 
100 TEST_F(TestPersistentJsonStorage, returnsFalseWhenDeletingNonExistingFile)
101 {
102     ASSERT_THAT(sut.remove(fileName), Eq(false));
103 }
104 
105 TEST_F(TestPersistentJsonStorage, returnsNulloptWhenFileDoesntExist)
106 {
107     ASSERT_THAT(sut.load(fileName), Eq(std::nullopt));
108 }
109