it('Bid request with wrong parameter', () => {
   const bidderRequest = {
     bidderCode: 'essens',
     requestId: 'impression-1',
     bidderRequestId: 'impression-for-essens-1',
     bids: [
       {
         bidId: 'placement1-for_essensT1',
         bidder: 'essens',
         requestId: 'essens-impression-1',
         params: {
           randomParam: 'placement1'
         },
         sizes: [
           [100, 110],
           [200, 210]
         ],
         placementCode: 'div-media1-top_banner-1',
         bidderRequestId: 'impression-for-essens-1',
       }
     ]
   }
   const essensAdapter = new Adapter()
   essensAdapter.callBids(bidderRequest)
   sinon.assert.notCalled(stubLoadScript)
 })
    it('invalid request: missing mandatory parameters', function () {
      const bidderRequest = {
        bidderCode: 'essens',
        requestId: 'impression-1',
        bidderRequestId: 'impression-for-essens-1',
        bids: [
          {
            bidId: 'placement1-for_essensT4',
            bidder: 'essens',
            requestId: 'essens-impression-1',
            params: {},
            sizes: [
              [100, 110],
              [200, 210]
            ],
            placementCode: 'div-media1-top_banner-1',
            bidderRequestId: 'impression-for-essens-1',
          }
        ]
      }

      const essensAdapter = new Adapter()
      essensAdapter.callBids(bidderRequest)

      sinon.assert.notCalled(stubLoadScript)
    })
 it('bid request with missing parameter', () => {
   const bidderRequest = {
     bidderCode: 'essens',
     requestId: 'impression-1',
     bidderRequestId: 'impression-for-essens-1'
   }
   const essensAdapter = new Adapter()
   essensAdapter.callBids(bidderRequest)
   sinon.assert.notCalled(stubLoadScript)
 })
    it('should fill all parameters', function () {
      const bidderRequest = {
        bidderCode: 'essens',
        requestId: 'impression-1',
        bidderRequestId: 'impression-for-essens-1',
        bids: [
          {
            bidId: 'placement1-for_essensT3',
            bidder: 'essens',
            requestId: 'essens-impression-1',
            params: {
              placementId: 'placement1',
              dealId: '1234',
              floorPrice: '23.478'
            },
            sizes: [
              [100, 110],
              [200, 210]
            ],
            placementCode: 'div-media1-top_banner-1',
            bidderRequestId: 'impression-for-essens-1',
          }
        ]
      }

      const essensAdapter = new Adapter()
      essensAdapter.callBids(bidderRequest)

      const url = stubLoadScript.getCall(0).args[0]
      const payload = decodeURIComponent(url.split('&bid=')[1])
      const payloadJson = JSON.parse(payload)

      expect(payloadJson.ua).to.exist.and.to.be.a('string')
      expect(payloadJson.url).to.exist.and.to.be.a('string')
      expect(Object.keys(payloadJson.imp).length).to.equal(1)
      expect(payloadJson.imp[0].impressionId).to.equal('placement1-for_essensT3')
      expect(payloadJson.imp[0].placementId).to.equal('placement1')
      expect(Object.keys(payloadJson.imp[0].sizes).length).to.equal(2)
      expect(payloadJson.imp[0].sizes[0]).to.equal('100x110')
      expect(payloadJson.imp[0].sizes[1]).to.equal('200x210')
      expect(payloadJson.imp[0].deal).to.equal('1234')
      expect(payloadJson.imp[0].floorPrice).to.equal('23.478')
    })
    it('Check invalid response', function () {
      const bidderRequest = {
        bidderCode: 'essens',
        requestId: 'impression-1',
        bidderRequestId: 'impression-for-essens-1',
        bids: [
          {
            bidId: 'placement1-for_essens',
            bidder: 'essens',
            requestId: 'essens-impression-1',
            params: {
              placementId: 'placement1'
            },
            sizes: [
              [100, 110],
              [200, 210]
            ],
            placementCode: 'div-media1-top_banner-1T1',
            bidderRequestId: 'impression-for-essens-1',
          }
        ]
      }

      const response = {
        'id': '1234'
      }

      const essensAdapter = new Adapter()
      essensAdapter.callBids(bidderRequest)

      $$PREBID_GLOBAL$$.essensResponseHandler(response)

      const bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]
      const bidObject1 = stubAddBidResponse.getCall(0).args[1]

      expect(bidPlacementCode1).to.equal('div-media1-top_banner-1T1')
      expect(bidObject1.getStatusCode()).to.equal(2)
      expect(bidObject1.bidderCode).to.equal('essens')

      sinon.assert.calledOnce(stubAddBidResponse)
    })
    it('add more than one valid requests', function () {
      const bidderRequest = {
        bidderCode: 'essens',
        requestId: 'impression-1',
        bidderRequestId: 'impression-for-essens-1',
        bids: [
          {
            bidId: 'placement1-for_essensT2',
            bidder: 'essens',
            requestId: 'essens-impression-1',
            params: {
              placementId: 'placement1'
            },
            sizes: [
              [100, 110],
              [200, 210]
            ],
            placementCode: 'div-media1-top_banner-1',
            bidderRequestId: 'impression-for-essens-1',
          },
          {
            bidId: 'placement2-for_essensT2',
            bidder: 'essens',
            requestId: 'essens-impression-1',
            params: {
              placementId: 'placement2'
            },
            sizes: [
              [300, 310],
              [400, 410]
            ],
            placementCode: 'div-media1-side_banner-1',
            bidderRequestId: 'impression-for-essens-1',
          },
          {
            bidId: 'placement3-for_essensT2',
            bidder: 'essens',
            requestId: 'essens-impression-1',
            params: {
              placementId: 'placement3'
            },
            sizes: [
              [500, 510],
              [600, 610]
            ],
            placementCode: 'div-media1-side_banner-2',
            bidderRequestId: 'impression-for-essens-1',
          },
        ]
      }

      const essensAdapter = new Adapter()
      essensAdapter.callBids(bidderRequest)

      const url = stubLoadScript.getCall(0).args[0]
      const payload = decodeURIComponent(url.split('&bid=')[1])
      const payloadJson = JSON.parse(payload)

      expect(payloadJson.ua).to.exist.and.to.be.a('string')
      expect(payloadJson.url).to.exist.and.to.be.a('string')
      expect(Object.keys(payloadJson.imp).length).to.equal(3)
      expect(payloadJson.imp[0].impressionId).to.equal('placement1-for_essensT2')
      expect(payloadJson.imp[0].placementId).to.equal('placement1')
      expect(Object.keys(payloadJson.imp[0].sizes).length).to.equal(2)
      expect(payloadJson.imp[0].sizes[0]).to.equal('100x110')
      expect(payloadJson.imp[0].sizes[1]).to.equal('200x210')

      expect(payloadJson.imp[1].impressionId).to.equal('placement2-for_essensT2')
      expect(payloadJson.imp[1].placementId).to.equal('placement2')
      expect(Object.keys(payloadJson.imp[1].sizes).length).to.equal(2)
      expect(payloadJson.imp[1].sizes[0]).to.equal('300x310')
      expect(payloadJson.imp[1].sizes[1]).to.equal('400x410')

      expect(payloadJson.imp[2].impressionId).to.equal('placement3-for_essensT2')
      expect(payloadJson.imp[2].placementId).to.equal('placement3')
      expect(Object.keys(payloadJson.imp[2].sizes).length).to.equal(2)
      expect(payloadJson.imp[2].sizes[0]).to.equal('500x510')
      expect(payloadJson.imp[2].sizes[1]).to.equal('600x610')
      sinon.assert.calledOnce(stubLoadScript)
    })
    it('Check empty and non empty mixed response', function () {
      const bidderRequest = {
        bidderCode: 'essens',
        requestId: 'impression-1',
        bidderRequestId: 'impression-for-essens-1',
        bids: [
          {
            bidId: 'bid-on-placement1-for_essens',
            bidder: 'essens',
            requestId: 'essens-impression-1',
            params: {
              placementId: 'placement1'
            },
            sizes: [
              [100, 110],
              [200, 210]
            ],
            placementCode: 'div-media1-top_banner-1T5',
            bidderRequestId: 'impression-for-essens-1',
          },
          {
            bidId: 'bid-on-placement2-for_essens',
            bidder: 'essens',
            requestId: 'essens-impression-1',
            params: {
              placementId: 'placement2'
            },
            sizes: [
              [300, 310],
              [400, 410]
            ],
            placementCode: 'div-media1-side_banner-1T5',
            bidderRequestId: 'impression-for-essens-1',
          }
        ]
      }

      const response = {
        'id': 'impression-for-essens-1',
        'cur': 'USD',
        'seatbid': [{
          'bid': [{
            'id': 'responseOnBid1',
            'impid': 'bid-on-placement2-for_essens',
            'price': 9.01,
            'crid': 'creativeId1',
            'dealid': 'dealId1',
            'h': 500,
            'w': 510,
            'ext': {
              'adUrl': 'creative-link'
            }
          }]
        }]
      }

      const essensAdapter = new Adapter()
      essensAdapter.callBids(bidderRequest)

      $$PREBID_GLOBAL$$.essensResponseHandler(response)

      let bidPlacementCode1
      let bidPlacementCode2
      let bidObject1
      let bidObject2

      if (stubAddBidResponse.getCall(0).args[0] === 'div-media1-side_banner-1T5') {
        bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]
        bidPlacementCode2 = stubAddBidResponse.getCall(1).args[0]
        bidObject1 = stubAddBidResponse.getCall(0).args[1]
        bidObject2 = stubAddBidResponse.getCall(1).args[1]
      } else {
        bidPlacementCode1 = stubAddBidResponse.getCall(1).args[0]
        bidPlacementCode2 = stubAddBidResponse.getCall(0).args[0]
        bidObject1 = stubAddBidResponse.getCall(1).args[1]
        bidObject2 = stubAddBidResponse.getCall(0).args[1]
      }

      expect(bidPlacementCode1).to.equal('div-media1-side_banner-1T5')
      expect(bidObject1.getStatusCode()).to.equal(1)
      expect(bidObject1.bidderCode).to.equal('essens')
      expect(bidObject1.creative_id).to.equal('creativeId1')
      expect(bidObject1.cpm).to.equal(9.01)
      expect(bidObject1.height).to.equal(500)
      expect(bidObject1.width).to.equal(510)
      expect(bidObject1.adUrl).to.equal('creative-link')
      expect(bidObject1.adId).to.equal('bid-on-placement2-for_essens')
      expect(bidObject1.dealId).to.equal('dealId1')

      expect(bidPlacementCode2).to.equal('div-media1-top_banner-1T5')
      expect(bidObject2.getStatusCode()).to.equal(2)
      expect(bidObject2.bidderCode).to.equal('essens')

      sinon.assert.calledTwice(stubAddBidResponse)
    })
    it('Check single non empty minimal valid response', function () {
      const bidderRequest = {
        bidderCode: 'essens',
        requestId: 'impression-1',
        bidderRequestId: 'impression-for-essens-1',
        bids: [
          {
            bidId: 'bid-on-placement1-for_essens',
            bidder: 'essens',
            requestId: 'essens-impression-1',
            params: {
              placementId: 'placement1'
            },
            sizes: [
              [100, 110],
              [200, 210]
            ],
            placementCode: 'div-media1-top_banner-1T3',
            bidderRequestId: 'impression-for-essens-1',
          }
        ]
      }

      const response = {
        'id': 'impression-for-essens-1',
        'cur': 'USD',
        'seatbid': [{
          'bid': [{
            'id': 'responseOnBid1',
            'impid': 'bid-on-placement1-for_essens',
            'price': 9.01,
            'crid': 'creativeId1',
            'h': 300,
            'w': 310,
            'ext': {
              'adUrl': 'creative-link'
            }
          }]
        }]
      }

      const essensAdapter = new Adapter()
      essensAdapter.callBids(bidderRequest)

      $$PREBID_GLOBAL$$.essensResponseHandler(response)

      const bidPlacementCode1 = stubAddBidResponse.getCall(0).args[0]
      const bidObject1 = stubAddBidResponse.getCall(0).args[1]

      expect(bidPlacementCode1).to.equal('div-media1-top_banner-1T3')
      expect(bidObject1.getStatusCode()).to.equal(1)
      expect(bidObject1.bidderCode).to.equal('essens')
      expect(bidObject1.creative_id).to.equal('creativeId1')
      expect(bidObject1.cpm).to.equal(9.01)
      expect(bidObject1.height).to.equal(300)
      expect(bidObject1.width).to.equal(310)
      expect(bidObject1.adUrl).to.equal('creative-link')
      expect(bidObject1.adId).to.equal('bid-on-placement1-for_essens')

      sinon.assert.calledOnce(stubAddBidResponse)
    })
 it('bid request without bid', () => {
   const essensAdapter = new Adapter()
   essensAdapter.callBids()
   sinon.assert.notCalled(stubLoadScript)
 })