| 
      
            Lines 43-48
          Cypress.Commands.add('login', (username, password) => {
      
      
        Link Here
      
     | 
  
        
          | 43 | 
          Cypress.Commands.add('left_menu_active_item_is', (label) => { | 
          43 | 
          Cypress.Commands.add('left_menu_active_item_is', (label) => { | 
        
        
          | 44 | 
              cy.get("#navmenulist a.current:not(.disabled)").should('have.length',1).contains(label); | 
          44 | 
              cy.get("#navmenulist a.current:not(.disabled)").should('have.length',1).contains(label); | 
        
        
          | 45 | 
          })  | 
          45 | 
          })  | 
        
            
               | 
               | 
              46 | 
               | 
            
            
              | 47 | 
              /**  | 
            
            
              | 48 | 
               * Builds an object based on the provided class and data.  | 
            
            
              | 49 | 
               *  | 
            
            
              | 50 | 
               * @param {string} objectClass - The class of the object to be built. | 
            
            
              | 51 | 
               * @param {Object} data - The data used to build the object. If not provided, a default object will be built. | 
            
            
              | 52 | 
               * @return {void} This function does not return anything. | 
            
            
              | 53 | 
               */  | 
            
            
              | 54 | 
              Cypress.Commands.add('buildObject', (objectClass, data) => { | 
            
            
              | 55 | 
                  if (!objectClass) return  | 
            
            
              | 56 | 
                  if (!data) { | 
            
            
              | 57 | 
                      const buildCommand = `perl t/cypress/support/cypress_builder.pl --class ${objectClass}` | 
            
            
              | 58 | 
                      cy.exec(buildCommand)  | 
            
            
              | 59 | 
                      return  | 
            
            
              | 60 | 
                  }  | 
            
            
              | 61 | 
                  const properties = Object.keys(data)  | 
            
            
              | 62 | 
                  const buildValues = properties.map(prop => ` --data ${prop}=${data[prop]}`) | 
            
            
              | 63 | 
                  const buildCommand = `perl t/cypress/support/cypress_builder.pl --class ${objectClass}${buildValues.join('')}` | 
            
            
              | 64 | 
                  cy.exec(buildCommand)  | 
            
            
              | 65 | 
              })  | 
            
            
              | 66 | 
               | 
            
            
              | 67 | 
              const tableMappings = { | 
            
            
              | 68 | 
                  'Koha::Patrons': { tableName: 'borrowers', primaryKey: 'borrowernumber'} | 
            
            
              | 69 | 
              }  | 
            
            
              | 70 | 
               | 
            
            
              | 71 | 
              /**  | 
            
            
              | 72 | 
               * Deletes one or more rows from a database table based on the given className and delete parameters.  | 
            
            
              | 73 | 
               *  | 
            
            
              | 74 | 
               * @param {string} className - The name of the class to delete rows from. | 
            
            
              | 75 | 
               * @param {Object} deleteParameters - The parameters used to filter the rows to be deleted. | 
            
            
              | 76 | 
               * @param {number} numberOfRows - The number of rows to delete. If provided, rows will be deleted in descending order up to the value of numberOfRows. | 
            
            
              | 77 | 
               * @return {void} This function does not return anything. | 
            
            
              | 78 | 
               */  | 
            
            
              | 79 | 
              Cypress.Commands.add('deleteDbRow', (className, deleteParameters, numberOfRows) => { | 
            
            
              | 80 | 
                  if(!className) return  | 
            
            
              | 81 | 
                  if(numberOfRows) { | 
            
            
              | 82 | 
                      const sql = `DELETE from ${tableMappings[className].tableName} ORDER BY ${tableMappings[className].primaryKey} DESC LIMIT ${numberOfRows}` | 
            
            
              | 83 | 
                      cy.query(sql);  | 
            
            
              | 84 | 
                      return  | 
            
            
              | 85 | 
                  }  | 
            
            
              | 86 | 
                  const properties = Object.keys(deleteParameters)  | 
            
            
              | 87 | 
                  const deleteFilters = properties.map(prop => `${prop}=?`) | 
            
            
              | 88 | 
                  const deleteValues = properties.map(prop => deleteParameters[prop])  | 
            
            
              | 89 | 
                  const sql = `DELETE from ${tableMappings[className].tableName} WHERE ${deleteFilters.join(' AND ')}` | 
            
            
              | 90 | 
                  cy.query(sql, deleteValues);  | 
            
            
              | 91 | 
              })  | 
            
            
              | 92 | 
               | 
            
        
          | 46 | 
          const dayjs = require("dayjs") /* Cannot use our calendar JS code, it's in an include file (!) | 
          93 | 
          const dayjs = require("dayjs") /* Cannot use our calendar JS code, it's in an include file (!) | 
        
        
          | 47 | 
                                             Also note that moment.js is deprecated */  | 
          94 | 
                                             Also note that moment.js is deprecated */  | 
        
        
          | 48 | 
           | 
          95 | 
           | 
        
            
              | 49 | 
              -   | 
               | 
               |