private-messages.test.js (7481B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 const { 8 getAllMessagesUiById, 9 getAllCssMessagesMatchingElements, 10 getAllNetworkMessagesUpdateById, 11 getAllRepeatById, 12 getCurrentGroup, 13 getGroupsById, 14 getMutableMessagesById, 15 getVisibleMessages, 16 } = require("resource://devtools/client/webconsole/selectors/messages.js"); 17 const { 18 getFirstMessage, 19 getLastMessage, 20 getPrivatePacket, 21 getWebConsoleUiMock, 22 setupActions, 23 setupStore, 24 } = require("resource://devtools/client/webconsole/test/node/helpers.js"); 25 const { 26 stubPackets, 27 } = require("resource://devtools/client/webconsole/test/node/fixtures/stubs/index.js"); 28 const { 29 CSS_MESSAGE_ADD_MATCHING_ELEMENTS, 30 } = require("resource://devtools/client/webconsole/constants.js"); 31 32 const expect = require("expect"); 33 34 describe("private messages", () => { 35 let actions; 36 beforeAll(() => { 37 actions = setupActions(); 38 }); 39 40 it("removes private messages on PRIVATE_MESSAGES_CLEAR action", () => { 41 const { dispatch, getState } = setupStore(); 42 43 dispatch( 44 actions.messagesAdd([ 45 getPrivatePacket("console.trace()"), 46 stubPackets.get("console.log('mymap')"), 47 getPrivatePacket("console.log(undefined)"), 48 getPrivatePacket("GET request"), 49 ]) 50 ); 51 52 let state = getState(); 53 const messages = getMutableMessagesById(state); 54 expect(messages.size).toBe(4); 55 56 dispatch(actions.privateMessagesClear()); 57 58 state = getState(); 59 expect(getMutableMessagesById(state).size).toBe(1); 60 expect(getVisibleMessages(state).length).toBe(1); 61 }); 62 63 it("cleans messagesUiById on PRIVATE_MESSAGES_CLEAR action", () => { 64 const { dispatch, getState } = setupStore(); 65 66 dispatch( 67 actions.messagesAdd([ 68 getPrivatePacket("console.trace()"), 69 stubPackets.get("console.trace()"), 70 ]) 71 ); 72 73 let state = getState(); 74 expect(getAllMessagesUiById(state).length).toBe(2); 75 76 dispatch(actions.privateMessagesClear()); 77 78 state = getState(); 79 expect(getAllMessagesUiById(state).length).toBe(1); 80 }); 81 82 it("cleans repeatsById on PRIVATE_MESSAGES_CLEAR action", () => { 83 const { dispatch, getState } = setupStore(); 84 85 dispatch( 86 actions.messagesAdd([ 87 getPrivatePacket("console.log(undefined)"), 88 getPrivatePacket("console.log(undefined)"), 89 stubPackets.get("console.log(undefined)"), 90 stubPackets.get("console.log(undefined)"), 91 ]) 92 ); 93 94 let state = getState(); 95 expect(getAllRepeatById(state)).toEqual({ 96 [getFirstMessage(state).id]: 2, 97 [getLastMessage(state).id]: 2, 98 }); 99 100 dispatch(actions.privateMessagesClear()); 101 102 state = getState(); 103 expect(Object.keys(getAllRepeatById(state)).length).toBe(1); 104 expect(getAllRepeatById(state)).toEqual({ 105 [getFirstMessage(state).id]: 2, 106 }); 107 }); 108 109 it("cleans cssMessagesMatchingElements on PRIVATE_MESSAGES_CLEAR action", () => { 110 const { dispatch, getState } = setupStore(); 111 112 dispatch( 113 actions.messagesAdd([ 114 getPrivatePacket( 115 `Unknown property ‘such-unknown-property’. Declaration dropped.` 116 ), 117 stubPackets.get( 118 `Error in parsing value for ‘padding-top’. Declaration dropped.` 119 ), 120 ]) 121 ); 122 123 const privateData = Symbol("privateData"); 124 const publicData = Symbol("publicData"); 125 126 dispatch({ 127 type: CSS_MESSAGE_ADD_MATCHING_ELEMENTS, 128 id: getFirstMessage(getState()).id, 129 elements: privateData, 130 }); 131 132 dispatch({ 133 type: CSS_MESSAGE_ADD_MATCHING_ELEMENTS, 134 id: getLastMessage(getState()).id, 135 elements: publicData, 136 }); 137 138 let state = getState(); 139 expect(getAllCssMessagesMatchingElements(state).size).toBe(2); 140 141 dispatch(actions.privateMessagesClear()); 142 143 state = getState(); 144 expect(getAllCssMessagesMatchingElements(state).size).toBe(1); 145 expect( 146 getAllCssMessagesMatchingElements(state).get( 147 getFirstMessage(getState()).id 148 ) 149 ).toBe(publicData); 150 }); 151 152 it("cleans group properties on PRIVATE_MESSAGES_CLEAR action", () => { 153 const { dispatch, getState } = setupStore(); 154 dispatch( 155 actions.messagesAdd([ 156 stubPackets.get("console.group()"), 157 getPrivatePacket("console.group()"), 158 ]) 159 ); 160 161 let state = getState(); 162 const publicMessageId = getFirstMessage(state).id; 163 const privateMessageId = getLastMessage(state).id; 164 expect(getCurrentGroup(state)).toBe(privateMessageId); 165 expect(getGroupsById(state).size).toBe(2); 166 167 dispatch(actions.privateMessagesClear()); 168 169 state = getState(); 170 expect(getGroupsById(state).size).toBe(1); 171 expect(getGroupsById(state).has(publicMessageId)).toBe(true); 172 expect(getCurrentGroup(state)).toBe(publicMessageId); 173 }); 174 175 it("cleans networkMessagesUpdateById on PRIVATE_MESSAGES_CLEAR action", () => { 176 const { dispatch, getState } = setupStore(); 177 178 const publicActor = "network/public"; 179 const privateActor = "network/private"; 180 const publicPacket = { 181 ...stubPackets.get("GET request"), 182 actor: publicActor, 183 }; 184 const privatePacket = { 185 ...getPrivatePacket("XHR GET request"), 186 actor: privateActor, 187 }; 188 189 // We need to reassign the timeStamp of the packet to guarantee the order. 190 publicPacket.timeStamp = publicPacket.timeStamp + 1; 191 privatePacket.timeStamp = privatePacket.timeStamp + 2; 192 193 dispatch(actions.messagesAdd([publicPacket, privatePacket])); 194 195 let networkUpdates = getAllNetworkMessagesUpdateById(getState()); 196 expect(Object.keys(networkUpdates)).toEqual([publicActor, privateActor]); 197 198 dispatch(actions.privateMessagesClear()); 199 200 networkUpdates = getAllNetworkMessagesUpdateById(getState()); 201 expect(Object.keys(networkUpdates)).toEqual([publicActor]); 202 }); 203 204 it("releases private backend actors on PRIVATE_MESSAGES_CLEAR action", () => { 205 const releasedActors = []; 206 const { dispatch, getState } = setupStore([], { 207 webConsoleUI: getWebConsoleUiMock({ 208 commands: { 209 client: { 210 mainRoot: {}, 211 }, 212 objectCommand: { 213 releaseObjects: async frontsToRelease => { 214 for (const front of frontsToRelease) { 215 releasedActors.push(front.actorID); 216 } 217 }, 218 }, 219 }, 220 }), 221 }); 222 const mockFrontRelease = function () { 223 releasedActors.push(this.actorID); 224 }; 225 226 const publicPacket = stubPackets.get( 227 "console.log('myarray', ['red', 'green', 'blue'])" 228 ); 229 const privatePacket = getPrivatePacket("console.log('mymap')"); 230 231 publicPacket.arguments[1].release = mockFrontRelease; 232 privatePacket.arguments[1].release = mockFrontRelease; 233 234 // Add a log message. 235 dispatch(actions.messagesAdd([publicPacket, privatePacket])); 236 237 const firstMessage = getFirstMessage(getState()); 238 const firstMessageActor = firstMessage.parameters[1].actorID; 239 240 const lastMessage = getLastMessage(getState()); 241 const lastMessageActor = lastMessage.parameters[1].actorID; 242 243 // Kick-off the actor release. 244 dispatch(actions.privateMessagesClear()); 245 246 expect(releasedActors.length).toBe(1); 247 expect(releasedActors).toInclude(lastMessageActor); 248 expect(releasedActors).toNotInclude(firstMessageActor); 249 }); 250 });