diff --git a/Modules/Libs/QuestieLib.lua b/Modules/Libs/QuestieLib.lua index 5fc0cbe..de236ff 100644 --- a/Modules/Libs/QuestieLib.lua +++ b/Modules/Libs/QuestieLib.lua @@ -427,19 +427,25 @@ function QuestieLib:CacheItemNames(questId) if (quest and quest.ObjectiveData) then for _, objectiveDB in pairs(quest.ObjectiveData) do if objectiveDB.Type == "item" then - if not ((QuestieDB.ItemPointers or QuestieDB.itemData)[objectiveDB.Id]) then - Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestieLib:CacheItemNames] Requesting item information for missing itemId:", objectiveDB.Id) - local item = Item:CreateFromItemID(objectiveDB.Id) + local itemId = objectiveDB.Id + if not itemId then + Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestieLib:CacheItemNames] Skipping item objective without itemId for quest:", questId) + elseif not ((QuestieDB.ItemPointers or QuestieDB.itemData)[itemId]) then + Questie:Debug(Questie.DEBUG_DEVELOP, "[QuestieLib:CacheItemNames] Requesting item information for missing itemId:", itemId) + local item = Item:CreateFromItemID(itemId) item:ContinueOnItemLoad( function() local itemName = item:GetItemName() - if not QuestieDB.itemDataOverrides[objectiveDB.Id] then - QuestieDB.itemDataOverrides[objectiveDB.Id] = { itemName, { questId }, {}, {} } + if not itemId then + return + end + if not QuestieDB.itemDataOverrides[itemId] then + QuestieDB.itemDataOverrides[itemId] = { itemName, { questId }, {}, {} } else - QuestieDB.itemDataOverrides[objectiveDB.Id][1] = itemName + QuestieDB.itemDataOverrides[itemId][1] = itemName end Questie:Debug(Questie.DEBUG_DEVELOP, - "[QuestieLib:CacheItemNames] Created item information for item:", itemName, ":", objectiveDB.Id) + "[QuestieLib:CacheItemNames] Created item information for item:", itemName, ":", itemId) end) end end diff --git a/Tests/QuestieItemNameSafety_spec.lua b/Tests/QuestieItemNameSafety_spec.lua index 63b1fdd..300e0ac 100644 --- a/Tests/QuestieItemNameSafety_spec.lua +++ b/Tests/QuestieItemNameSafety_spec.lua @@ -1,4 +1,11 @@ describe("Questie item name safety", function() + local function read(path) + local f = assert(io.open(path, "r"), "cannot open " .. path) + local c = f:read("*a") + f:close() + return c + end + before_each(function() dofile("Tests/wow_api_mock.lua") GetItemInfo = function() @@ -16,4 +23,11 @@ describe("Questie item name safety", function() local item = Item:CreateFromItemID("bad-id") assert.equals("item:bad-id", item:GetItemName()) end) + + it("skips malformed item objectives without an item id", function() + local lib = read("Modules/Libs/QuestieLib.lua") + assert.is_true(string.find(lib, "local itemId = objectiveDB.Id", 1, true) ~= nil) + assert.is_true(string.find(lib, "if not itemId then", 1, true) ~= nil) + assert.is_true(string.find(lib, "QuestieDB.itemDataOverrides[itemId]", 1, true) ~= nil) + end) end)