# encoding: utf-8
require 'test_helper'

class PackageTest < ActiveSupport::TestCase
  test 'packages' do
    tests = [

      # test 1 - normal install
      {
        zpm: '{
  "name": "UnitTestSample",
  "version": "1.0.1",
  "vendor": "Znuny GmbH",
  "license": "ABC",
  "url": "http://znuny.org/",
  "description": [
    {
      "language": "en",
      "text": "some description"
    }
  ],
  "files": [
    {
      "permission": "644",
      "location": "test.txt",
      "content": "YWJjw6TDtsO8w58="
    },
    {
      "permission": "644",
      "location": "some/dir/test.txt",
      "content": "YWJjw6TDtsO8w58="
    },
    {
      "permission": "644",
      "location": "db/addon/unit_test_sample/20121212000001_create_base.rb",
      "content": "Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uDQogIGRlZiBzZWxmLnVw\nDQogICBjcmVhdGVfdGFibGUgOnNhbXBsZV90YWJsZXMgZG8gfHR8DQogICAgICB0LmNvbHVtbiA6\nbmFtZSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiAxNTAsICA6bnVsbCA9PiB0cnVlDQog\nICAgICB0LmNvbHVtbiA6ZGF0YSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiA1MDAwLCA6\nbnVsbCA9PiB0cnVlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBzZWxmLmRvd24NCiAgICBkcm9w\nX3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k"
    }
  ]
}',
        action: 'install',
        result: true,
        verify: {
          package: {
            name: 'UnitTestSample',
            version: '1.0.1',
          },
          check_files: [
            {
              location: 'test.txt',
              result: true,
            },
            {
              location: 'test2.txt',
              result: false,
            },
            {
              location: 'some/dir/test.txt',
              result: true,
            },
          ],
        },
      },

      # test 2 - renstall
      {
        action: 'reinstall',
        name: 'UnitTestSample',
        result: true,
        verify: {
          package: {
            name: 'UnitTestSample',
            version: '1.0.1',
          },
          check_files: [
            {
              location: 'test.txt',
              result: true,
            },
            {
              location: 'test2.txt',
              result: false,
            },
            {
              location: 'some/dir/test.txt',
              result: true,
            },
          ],
        },
      },

      # test 3 - try to install same package again / should not work
      {
        zpm: '{
  "name": "UnitTestSample",
  "version": "1.0.1",
  "vendor": "Znuny GmbH",
  "license": "ABC",
  "url": "http://znuny.org/",
  "description": [
    {
      "language": "en",
      "text": "some description"
    }
  ],
  "files": [
    {
      "permission": "644",
      "location": "test.txt",
      "content": "YWJjw6TDtsO8w58="
    }
  ]
}',
        action: 'install',
        result: false,
      },

      # test 4 - try to install lower version / should not work
      {
        zpm: '{
  "name": "UnitTestSample",
  "version": "1.0.0",
  "vendor": "Znuny GmbH",
  "license": "ABC",
  "url": "http://znuny.org/",
  "description": [
    {
      "language": "en",
      "text": "some description"
    }
  ],
  "files": [
    {
      "permission": "644",
      "location": "test.txt",
      "content": "YWJjw6TDtsO8w58="
    }
  ]
}',
        action: 'install',
        result: false,
      },

      # test 5 - upgrade 7 should work
      {
        zpm: '{
  "name": "UnitTestSample",
  "version": "1.0.2",
  "vendor": "Znuny GmbH",
  "license": "ABC",
  "url": "http://znuny.org/",
  "description": [
    {
      "language": "en",
      "text": "some description"
    }
  ],
  "files": [
    {
      "permission": "644",
      "location": "test.txt2",
      "content": "YWJjw6TDtsO8w58="
    },
    {
      "permission": "644",
      "location": "some/dir/test.txt2",
      "content": "YWJjw6TDtsO8w58="
    },
    {
      "permission": "644",
      "location": "db/addon/unit_test_sample/20121212000001_create_base.rb",
      "content": "Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uDQogIGRlZiBzZWxmLnVw\nDQogICBjcmVhdGVfdGFibGUgOnNhbXBsZV90YWJsZXMgZG8gfHR8DQogICAgICB0LmNvbHVtbiA6\nbmFtZSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiAxNTAsICA6bnVsbCA9PiB0cnVlDQog\nICAgICB0LmNvbHVtbiA6ZGF0YSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiA1MDAwLCA6\nbnVsbCA9PiB0cnVlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBzZWxmLmRvd24NCiAgICBkcm9w\nX3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k"
    }
  ]
}',
        action: 'install',
        result: true,
        verify: {
          package: {
            name: 'UnitTestSample',
            version: '1.0.2',
          },
          check_files: [
            {
              location: 'test.txt2',
              result: true,
            },
            {
              location: 'test.txt',
              result: false,
            },
            {
              location: 'test2.txt',
              result: false,
            },
            {
              location: 'some/dir/test.txt2',
              result: true,
            },
          ],
        },
      },

      # test 6 - uninstall package / should work
      {
        name: 'UnitTestSample',
        version: '1.0.2',
        action: 'uninstall',
        result: true,
        verify: {
          check_files: [
            {
              location: 'test.txt',
              result: false,
            },
            {
              location: 'test2.txt',
              result: false,
            },
          ],
        },
      },

      # test 7 - check auto_install mechanism
      {
        zpm: '{
  "name": "UnitTestSample",
  "version": "1.0.2",
  "vendor": "Znuny GmbH",
  "license": "ABC",
  "url": "http://znuny.org/",
  "description": [
    {
      "language": "en",
      "text": "some description"
    }
  ],
  "files": [
    {
      "permission": "644",
      "location": "test.txt2",
      "content": "YWJjw6TDtsO8w58="
    },
    {
      "permission": "644",
      "location": "some/dir/test.txt2",
      "content": "YWJjw6TDtsO8w58="
    },
    {
      "permission": "644",
      "location": "db/addon/unit_test_sample/20121212000001_create_base.rb",
      "content": "Y2xhc3MgQ3JlYXRlQmFzZSA8IEFjdGl2ZVJlY29yZDo6TWlncmF0aW9uDQogIGRlZiBzZWxmLnVw\nDQogICBjcmVhdGVfdGFibGUgOnNhbXBsZV90YWJsZXMgZG8gfHR8DQogICAgICB0LmNvbHVtbiA6\nbmFtZSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiAxNTAsICA6bnVsbCA9PiB0cnVlDQog\nICAgICB0LmNvbHVtbiA6ZGF0YSwgICAgICAgICAgIDpzdHJpbmcsIDpsaW1pdCA9PiA1MDAwLCA6\nbnVsbCA9PiB0cnVlDQogICAgZW5kDQogIGVuZA0KDQogIGRlZiBzZWxmLmRvd24NCiAgICBkcm9w\nX3RhYmxlIDpzYW1wbGVfdGFibGVzDQogIGVuZA0KZW5k"
    }
  ]
}',
        action: 'auto_install',
        result: true,
        verify: {
          package: {
            name: 'UnitTestSample',
            version: '1.0.2',
          },
          check_files: [
            {
              location: 'test.txt2',
              result: true,
            },
            {
              location: 'test.txt',
              result: false,
            },
            {
              location: 'test2.txt',
              result: false,
            },
            {
              location: 'some/dir/test.txt2',
              result: true,
            },
          ],
        },
      },

      # test 8 - check uninstall / should work
      {
        name: 'UnitTestSample',
        version: '1.0.2',
        action: 'uninstall',
        result: true,
        verify: {
          check_files: [
            {
              location: 'test.txt',
              result: false,
            },
            {
              location: 'test2.txt',
              result: false,
            },
          ],
        },
      },

    ]
    tests.each { |test|
      if test[:action] == 'install'
        begin
          package = Package.install( string: test[:zpm] )
        rescue => e
          puts 'ERROR: ' + e.inspect
        end
        if test[:result]
          assert( package, 'install package not successful' )
          issues = package.verify
          assert( !issues, 'package verify not successful' )
        else
          assert( !package, 'install package successful but should not' )
        end
      elsif test[:action] == 'reinstall'
        begin
          package = Package.reinstall( test[:name] )
        rescue
          package = false
        end
        if test[:result]
          assert( package, 'reinstall package not successful' )
          issues = package.verify
          assert( !issues, 'package verify not successful' )
        else
          assert( !package, 'reinstall package successful but should not' )
        end
      elsif test[:action] == 'uninstall'
        if test[:zpm]
          begin
            package = Package.uninstall( string: test[:zpm] )
          rescue
            package = false
          end
        else
          begin
            package = Package.uninstall( name: test[:name], version: test[:version] )
          rescue
            package = false
          end
        end
        if test[:result]
          assert( package, 'uninstall package not successful' )
        else
          assert( !package, 'uninstall package successful but should not' )
        end
      elsif test[:action] == 'auto_install'
        if test[:zpm]
          if !File.exist?( Rails.root.to_s + '/auto_install/' )
            Dir.mkdir( Rails.root.to_s + '/auto_install/', 0o755)
          end
          location = Rails.root.to_s + '/auto_install/unittest.zpm'
          file = File.new( location, 'wb' )
          file.write( test[:zpm] )
          file.close
        end
        begin
          success = Package.auto_install()
        rescue
          success = false
        end
        if test[:zpm]
          File.delete( location )
        end
      end
      if test[:verify] && test[:verify][:package]
        exists = Package.where( name: test[:verify][:package][:name], version: test[:verify][:package][:version] ).first
        assert( exists, "package '#{test[:verify][:package][:name]}' is not installed" )
      end
      next if !test[:verify]
      next if !test[:verify][:check_files]

      test[:verify][:check_files].each { |item|
        exists = File.exist?( item[:location] )
        if item[:result]
          assert( exists, "'#{item[:location]}' exists" )
        else
          assert( !exists, "'#{item[:location]}' doesn't exists" )
        end
      }
    }

  end
end
