maixhashi / plotforge

0 stars 0 forks source link

Test_2024.09.21.22.25_controller spec test(ShuffledOverviewsController)_#211 #211

Open maixhashi opened 2 days ago

maixhashi commented 2 days ago

実現したいこと

ShuffledOverviewsControllerのコントローラースペックテストを実装する

class ShuffledOverviewsController < ApplicationController
  before_action :set_user
  before_action :set_start_date

  def index
    own_shuffled_overviews = @user.shuffled_overviews

    # フォローしているユーザーのシャッフルオーバービュー
    followed_user_ids = @user.following.pluck(:id)
    followed_users_shuffled_overviews = ShuffledOverview.where(user_id: followed_user_ids)

    # 自分とフォローしているユーザーのシャッフルオーバービューを結合
    @shuffled_overviews = own_shuffled_overviews.or(followed_users_shuffled_overviews)

    # 映画データを取得する
    tmdb_service = TmdbService.new
    @movies_data = {}
    @shuffled_overviews.each do |shuffled_overview|
      shuffled_overview.related_movie_ids.each do |movie_id|
        @movies_data[movie_id] ||= tmdb_service.fetch_movie_details(movie_id)
      end
    end

    # MySQL で日付ごとにカウントを取得
    @grouped_overviews = @shuffled_overviews
                         .select("DATE(created_at) AS date, COUNT(*) AS count")
                         .group("DATE(created_at)")
                         .map { |record| [record.date.to_date, record.count] }
                         .to_h

    render 'shuffled_overviews/index'

    respond_to do |format|
      format.html # index.html.erb
      format.js   # index.js.erb
    end
  end

  def my_shuffled_overviews
    @shuffled_overviews = current_user.shuffled_overviews

    # 映画データを取得する
    tmdb_service = TmdbService.new
    @movies_data = {}
    @shuffled_overviews.each do |shuffled_overview|
      shuffled_overview.related_movie_ids.each do |movie_id|
        @movies_data[movie_id] ||= tmdb_service.fetch_movie_details(movie_id)
      end
    end

    # MySQL で日付ごとにカウントを取得
    @grouped_overviews = current_user.shuffled_overviews
                                     .select("DATE(created_at) AS date, COUNT(*) AS count")
                                     .group("DATE(created_at)")
                                     .map { |record| [record.date.to_date, record.count] }
                                     .to_h

    @grouped_overviews.inspect

    render 'users/shuffled_overviews/my_shuffled_overviews'

    respond_to do |format|
      format.html # index.html.erb
      format.js   # index.js.erb
    end
  end

  def show
    @shuffled_overview = ShuffledOverview.find(params[:id])

    render template: 'users/shuffled_overviews/show'
  end

def create
  content = shuffled_overview_params[:content]
  related_movie_ids = shuffled_overview_params[:related_movie_ids].map(&:to_i)

  @shuffled_overview = current_user.shuffled_overviews.build(shuffled_overview_params)

  @shuffled_overview.related_movie_ids.each do |related_movie_id|
    movie = Movie.find_or_create_by!(tmdb_id: related_movie_id)
    @shuffled_overview.movies << movie
  end

  if @shuffled_overview.save
    # ここで `update` アクションのロジックを実行
    extract_characters
    extract_keywords

    Rails.logger.debug "ShuffledOverview related_movie_ids: #{@shuffled_overview.related_movie_ids.inspect}"
    Rails.logger.debug "ShuffledOverview movie_ids: #{@shuffled_overview.movie_ids.inspect}"
    logger.debug("ShuffledOverview ID after save: #{@shuffled_overview.id}")

    render json: { message: 'Shuffled overview saved successfully', id: @shuffled_overview.id }, status: :ok
  else
    render json: { errors: @shuffled_overview.errors.full_messages }, status: :unprocessable_entity
  end
end

  def update
    @shuffled_overview = ShuffledOverview.find(params[:id])

    if @shuffled_overview.update(shuffled_overview_params)
      extract_characters
      extract_keywords
      respond_to do |format|
        format.html { redirect_to user_shuffled_overview_path(@shuffled_overview), notice: 'Shuffled overview was successfully updated.' }
        format.js   # For AJAX requests
      end
    else
      render :edit
    end
  end

  def filter_shuffled_overviews_by_date
    Time.zone = 'UTC'

    # 日付パラメータが存在しない場合は Date.today を使用
    date_param = params[:date].presence || Date.today.to_s

    begin
      date = date_param.to_date
    rescue ArgumentError
      date = Date.today
    end
    date_range = date.beginning_of_day..date.end_of_day

    # 指定された日付範囲のデータを取得
    @shuffled_overviews = ShuffledOverview.where(created_at: date.all_day)

    # 映画データを再取得する
    tmdb_service = TmdbService.new
    @movies_data = {}
    @shuffled_overviews.each do |shuffled_overview|
      shuffled_overview.related_movie_ids.each do |movie_id|
        @movies_data[movie_id] ||= tmdb_service.fetch_movie_details(movie_id)
      end
    end

    # MySQL で日付ごとにカウントを取得
    @grouped_overviews = ShuffledOverview
                          .where(created_at: date_range)
                          .select("DATE(created_at) AS date, COUNT(*) AS count")
                          .group("DATE(created_at)")
                          .map { |record| [record.date.to_date, record.count] }
                          .to_h

    @shuffled_overviews_on_timeline = @shuffled_overviews.page(params[:shuffled_overviews_page]).per(5)

    respond_to do |format|
      format.html { render 'users/shuffled_overviews/my_shuffled_overviews' }
      format.js   { render 'users/shuffled_overviews/filter_shuffled_overviews_by_date' }
    end
  end

  private

  def extract_keywords
    content = @shuffled_overview.content
    extracted_keywords = KeywordExtractorService.extract_and_assign_keywords(@shuffled_overview.content, @shuffled_overview)

    extracted_keywords.each do |extracted_keyword|
      keyword = Keyword.find_or_create_by(content: extracted_keyword)  # 名前からKeywordオブジェクトを検索または作成
      ShuffledOverviewKeyword.find_or_create_by(
        shuffled_overview: @shuffled_overview,
        keyword: keyword
      )
    end
  end

  def extract_characters
    content = @shuffled_overview.content
    character_names = CharacterExtractorService.extract_and_assign_characters(content)

    character_names.each do |character_name|
      character = Character.find_or_create_by(name: character_name)  # 名前からCharacterオブジェクトを検索または作成
      AppearanceOfCharacter.find_or_create_by(
        shuffled_overview: @shuffled_overview,
        character: character
      )
    end
  end

  def set_user
    @user = current_user
  end

  def set_start_date
    @start_date = params.fetch(:start_date, Date.today) 
  end

  def shuffled_overview_params
    params.require(:shuffled_overview).permit(
      :content,
      related_movie_ids: [],
      movie_ids: [],
      characters_attributes: [:id, :name, :_destroy]  # Character モデルの属性を追加
    )
  end
end

変更する事項

maixhashi commented 2 days ago

メモ

下記アクションはマイページの機能と同等のため不要だが、カレンダー機能のテストのため消去は保留

下記アクションはjsにより機能実現しているがRails apiで実装してからテストする