--  Licensed to the Apache Software Foundation (ASF) under one
--  or more contributor license agreements.  See the NOTICE file
--  distributed with this work for additional information
--  regarding copyright ownership.  The ASF licenses this file
--  to you under the Apache License, Version 2.0 (the
--  "License"); you may not use this file except in compliance
--  with the License.  You may obtain a copy of the License at
--
--  http://www.apache.org/licenses/LICENSE-2.0
--
--  Unless required by applicable law or agreed to in writing, software
--  distributed under the License is distributed on an "AS IS" BASIS,
--  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--  See the License for the specific language governing permissions and
--  limitations under the License.

_G.ts = { client_request = {}, http = {} }
_G.client = {dbone = {}, dbdefault = {}, selecteddb = 0}
_G.TS_LUA_REMAP_DID_REMAP = 1

function ts.client_request.get_url_scheme()
    return 'http'
end

function ts.client_request.get_url_host()
    return 'test.edge.com'
end

function ts.client_request.get_uri()
    return '/app1'
end
function ts.client_request.get_url_port()
    return '80'
end

function connect(path)
  return client
end

function client.select(self, number)
  if number == 1 then
    self.selecteddb = 1
  elseif number == 0 then
    self.selecteddb = 0
  end
end

function client.sadd(self, key, ...)
  db = nil
  if self.selecteddb == 1 then 
    db = self.dbone
  elseif self.selecteddb == 0 then
    db = self.dbdefault
  end
  
  if type(db[key]) ~= "table" then
    db[key] = {}
  end

  for i=1,select('#',...) do   
    local tmp = select(i,...)
    table.insert(db[key],tmp)
  end
end

function client.ping()
  return "PONG"
end

function client.smembers(self, key)
  db = nil
  if self.selecteddb == 1 then 
    db = self.dbone
  elseif self.selecteddb == 0 then
    db = self.dbdefault
  end

  return db[key]
end

function client.srandmember(self, key)
  idx = math.random(1,2)
  db = nil
  if self.selecteddb == 1 then 
    db = self.dbone
  elseif self.selecteddb == 0 then
    db = self.dbdefault
  end
  
  return db[key][idx]
end
  

describe("Unit tests - Lua", function()
  describe("Ingress Controller", function()

    setup(function()
      local match = require("luassert.match")

      package.loaded.redis = nil
      local redis = {}
      redis.connect = {}
      redis.connect = connect
      package.preload['redis'] = function () 
        return redis
      end

      client = redis.connect()

      client:select(1)
      client:sadd("http://test.edge.com/app1","trafficserver-test-2:appsvc1:8080")
      client:select(0)
      client:sadd("trafficserver-test-2:appsvc1:8080","172.17.0.3#8080#http","172.17.0.5#8080#http")
      --require 'pl.pretty'.dump(client)

      stub(ts, "add_package_cpath")
      stub(ts, "add_package_path")
      stub(ts, "debug")
      stub(ts, "error")
      stub(ts.client_request, "set_url_host")
      stub(ts.client_request, "set_url_port")
      stub(ts.client_request, "set_url_scheme")
      stub(ts.client_request, "set_uri")
      stub(ts.http, "skip_remapping_set")
      stub(ts.http, "set_resp")
    end)

    it("Test - Redirect to correct IP", function()
      require("connect_redis")
      local result = do_global_read_request()

      assert.stub(ts.client_request.set_url_host).was.called_with(match.is_any_of(match.is_same("172.17.0.3"),match.is_same("172.17.0.5"))) 
      assert.stub(ts.client_request.set_url_port).was.called_with("8080")
      assert.stub(ts.client_request.set_url_scheme).was.called_with("http")
    end)

    it("Test - Snippet", function()
      client:select(1)
      client:sadd("http://test.edge.com/app1","$trafficserver-test-3/app-ingress/411990")
      snippet = "ts.debug('Debug msg example')\nts.error('Error msg example')\n-- ts.hook(TS_LUA_HOOK_SEND_RESPONSE_HDR, function()\n--   ts.client_response.header['Location'] = 'https://test.edge.com/app2'\n-- end)\nts.http.skip_remapping_set(0)\nts.http.set_resp(301, 'Redirect')\nts.debug('Uncomment the above lines to redirect http request to https')\nts.debug('Modification for testing')\n"
      client:sadd("$trafficserver-test-3/app-ingress/411990",snippet) 

      --require 'pl.pretty'.dump(client)
      require "connect_redis"
      local result = do_global_read_request()

      assert.stub(ts.error).was.called_with("Error msg example")
      assert.stub(ts.http.skip_remapping_set).was.called_with(0)
      assert.stub(ts.http.set_resp).was.called_with(301,"Redirect")
    end)

  end)
end)