????

Your IP : 3.138.197.104


Current Path : C:/inetpub/vhost/redmine/plugins/redmine_agile/test/functional/
Upload File :
Current File : C:/inetpub/vhost/redmine/plugins/redmine_agile/test/functional/agile_charts_controller_test.rb

# encoding: utf-8
#
# This file is a part of Redmin Agile (redmine_agile) plugin,
# Agile board plugin for redmine
#
# Copyright (C) 2011-2023 RedmineUP
# http://www.redmineup.com/
#
# redmine_agile is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# redmine_agile is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with redmine_agile.  If not, see <http://www.gnu.org/licenses/>.

require File.expand_path('../../test_helper', __FILE__)

class AgileChartsControllerTest < ActionController::TestCase
  fixtures :projects,
           :users,
           :roles,
           :members,
           :member_roles,
           :issues,
           :issue_statuses,
           :versions,
           :trackers,
           :projects_trackers,
           :issue_categories,
           :enabled_modules,
           :enumerations,
           :attachments,
           :workflows,
           :custom_fields,
           :custom_values,
           :custom_fields_projects,
           :custom_fields_trackers,
           :time_entries,
           :journals,
           :journal_details,
           :queries

  def setup
    @request.session[:user_id] = 1
    @project = Project.find(1)
    @issue = @project.issues.first

    EnabledModule.create(project: @project, name: 'agile')

    @charts = RedmineAgile::Charts::Helper::AGILE_CHARTS.keys
    @charts_with_units = RedmineAgile::Charts::Helper::CHARTS_WITH_UNITS
  end

  def test_get_show
    should_get_show
    should_get_show project_id: @project.identifier
  end

  def test_get_show_with_period
    should_get_show({ f: ['issue_id', ''], op: { 'issue_id' => '*' } })
    should_get_show({ f: ['issue_id', ''], op: { 'issue_id' => '*' }, project_id: @project.identifier })
  end

  def test_charts_by_default_params
    @charts.each { |chart| check_chart(chart: chart, project_id: @project.identifier) }
  end

  def test_charts_with_chart_unit
    @charts_with_units.each do |chart|
      RedmineAgile::Charts::Helper::CHART_UNITS.each do |chart_unit, label|
        check_chart chart: chart, project_id: @project.identifier, chart_unit: chart_unit
      end
    end
  end

  def test_charts_by_different_time_intervals
    @charts.each do |chart|
      RedmineAgile::Charts::AgileChart::TIME_INTERVALS.each do |interval|
        check_chart chart: chart, project_id: @project.identifier, interval_size: interval
      end
    end
  end

  def test_charts_by_different_periods_and_time_intervals
    @charts.each do |chart|
      RedmineAgile::Charts::AgileChart::TIME_INTERVALS.each do |interval|
        params = {
          chart: chart,
          project_id: @project.identifier,
          interval_size: interval,
          set_filter: 1,
          f: ['chart_period']
        }

        check_chart params.merge(op: { chart_period: '=' }, v: { chart_period: ['2014-01-01'] })
        check_chart params.merge(op: { chart_period: '>=' }, v: { chart_period: ['2014-01-01'] })
        check_chart params.merge(op: { chart_period: '<=' }, v: { chart_period: ['2019-01-01'] })
        check_chart params.merge(op: { chart_period: '><' }, v: { chart_period: ['2014-01-01', '2018-12-31'] })
        check_chart params.merge(op: { chart_period: '>t-' }, v: { chart_period: [99] })
        check_chart params.merge(op: { chart_period: '<t-' }, v: { chart_period: [99] })
        check_chart params.merge(op: { chart_period: '><t-' }, v: { chart_period: [99] })
        check_chart params.merge(op: { chart_period: 't-' }, v: { chart_period: [99] })
        check_chart params.merge(op: { chart_period: 't' })
        check_chart params.merge(op: { chart_period: 'ld' })
        check_chart params.merge(op: { chart_period: 'w' })
        check_chart params.merge(op: { chart_period: 'lw' })
        check_chart params.merge(op: { chart_period: 'l2w' })
        check_chart params.merge(op: { chart_period: 'm' })
        check_chart params.merge(op: { chart_period: 'lm' })
        check_chart params.merge(op: { chart_period: 'y' })
        check_chart params.merge(op: { chart_period: '!*' })
        check_chart params.merge(op: { chart_period: '*' })
      end
    end
  end

  def test_render_charts
    @charts.each do |chart|
      should_get_render_chart chart: chart, chart_unit: 'issues'
    end
  end

  def test_charts_with_version
    @charts.each do |chart|
      should_get_render_chart chart: chart, version_id: 2
      should_get_render_chart chart: chart, version_id: 2, project_id: @project.identifier
    end
  end

  def test_charts_with_version_and_chart_unit
    @charts_with_units.each do |chart|
      RedmineAgile::Charts::Helper::CHART_UNITS.each do |chart_unit, label|
        should_get_render_chart chart: chart, version_id: 2, chart_unit: chart_unit
      end
    end
  end

  def test_issues_burndown_chart_when_first_issue_later_then_due_date
    new_version = Version.create!(name: 'Some new vesion', effective_date: (Date.today - 10.days), project_id: @project.id)
    issue = Issue.create!(
      project_id: @project.id,
      tracker_id: 1,
      subject: 'test_issues_burndown_chart_when_first_issue_later_then_due_date',
      author_id: 2,
      start_date: Date.today
    )
    new_version.fixed_issues << issue.reload

    should_get_render_chart chart: RedmineAgile::Charts::Helper::BURNDOWN_CHART, project_id: @project.identifier, version_id: new_version.id
  end

  def test_get_show_chart_with_open_target_version
    current_version = @issue.fixed_version
    @issue.update(fixed_version: Version.open.first)

    should_get_render_chart project_id: @project.identifier, chart: 'burndown_chart',
                                                             f: ['version_status'],
                                                             op: { 'version_status' => '=' },
                                                             v: { 'version_status' => ['open'] }
    ensure
    @issue.update(fixed_version: current_version)
  end

  private

  def should_get_show(parameters = {})
    compatible_request :get, :show, parameters
    assert_response :success
    assert_select 'canvas#agile-chart', 1
  end

  def should_get_render_chart(parameters = {})
    compatible_xhr_request :get, :render_chart, parameters
    assert_response :success
    assert_match 'application/json', response.content_type

    json = ActiveSupport::JSON.decode(response.body)
    assert_kind_of Hash, json
    assert_equal parameters[:chart], json['chart']
    if parameters[:chart_unit]
      assert_equal parameters[:chart_unit], json['chart_unit']
    end
  end

  def check_chart(parameters = {})
    should_get_show parameters
    should_get_render_chart parameters.slice(:chart, :project_id)
  end
end