def test_process_absent_members(tmpdir):
    config_file = tmpdir.mkdir('test_get_suggestions').join('testfile')
    config_file.write(__config_file_score__ +
                      '\nthreshold_demote=-999999\nthreshold_promote=9999999')
    config = load_config_file(config_file.realpath())

    h = history.get_member_history(__fake_club__.members,
                                   config['bstools']['timestamp'],
                                   __fake_history_old_member__)

    absent_members = bstools.process_absent_members(config, h['members'])

    assert len(absent_members) == 1
    assert absent_members[0].tag == '#ZZZZZZ'
def test_get_suggestions_kick(tmpdir):
    config_file = tmpdir.mkdir('test_get_suggestions').join('testfile')
    config_file.write(__config_file_score__ + '\nmin_club_size=1')
    config = load_config_file(config_file.realpath())

    h = history.get_member_history(__fake_club__.members,
                                   config['bstools']['timestamp'])

    members = bstools.process_members(config, __fake_club__, __fake_warlog__,
                                      __fake_currentwar_notinwar__, h)

    suggestions = bstools.get_suggestions(config, members,
                                          __fake_club__.required_trophies)

    print(suggestions)

    assert suggestions[0].startswith('Kick')
    assert members[3].name in suggestions[0]
def test_get_suggestions_recruit(tmpdir):
    config_file = tmpdir.mkdir('test_get_suggestions').join('testfile')
    config_file.write(__config_file_score__ +
                      '\nthreshold_demote=-999999\nthreshold_promote=9999999')
    config = load_config_file(config_file.realpath())

    h = history.get_member_history(__fake_club__.members,
                                   config['bstools']['timestamp'])

    members = bstools.process_members(config, __fake_club__, __fake_warlog__,
                                      __fake_currentwar_notinwar__, h)

    suggestions = bstools.get_suggestions(config, members, __fake_club__)

    print(suggestions)

    assert len(suggestions) == 1
    assert suggestions[0] == config['strings']['suggestionRecruit']
def test_get_suggestions_promote_demote(tmpdir):
    config_file = tmpdir.mkdir('test_get_suggestions').join('testfile')
    config_file.write(__config_file_score__ + '\nthreshold_promote=10')
    config = load_config_file(config_file.realpath())

    h = history.get_member_history(__fake_club__.members,
                                   config['bstools']['timestamp'])

    members = bstools.process_members(config, __fake_club__, __fake_warlog__,
                                      __fake_currentwar_notinwar__, h)

    suggestions = bstools.get_suggestions(config, members,
                                          __fake_club__.required_trophies)

    print(suggestions)

    assert suggestions[0].startswith('Demote')
    assert members[2].name in suggestions[0]
    assert suggestions[1].startswith('Promote') or suggestions[2].startswith(
        'Promote')
    assert members[4].name in suggestions[1] or members[4].name in suggestions[
        2]
def test_get_suggestions_nosuggestions(tmpdir):
    config_file = tmpdir.mkdir('test_get_suggestions').join('testfile')
    config_file.write(
        __config_file_score__ +
        '\nthreshold_demote=-999999\nthreshold_promote=9999999\nmin_club_size={}'
        .format(bstools.MAX_CLAN_SIZE))
    config = load_config_file(config_file.realpath())

    war = ProcessedCurrentWar(config=config,
                              current_war=pybrawl.WarCurrent(state='notInWar'))
    factory = MemberFactory(config=config,
                            member_history=history.get_member_history(
                                __fake_club__.members,
                                config['bstools']['timestamp'], '{}', war),
                            current_war=war,
                            Club=__fake_club__,
                            warlog=pybrawl.WarLog(items=[]))

    members = []
    for i in range(0, bstools.MAX_CLAN_SIZE):
        member = factory.get_processed_member(
            pybrawl.ClubMember(tag="#AAAAAA",
                               name="PresidentPerson",
                               role="president",
                               explevel=13,
                               trophies=9999,
                               name_color="",
                               last_seen="20190802T154619.000Z"))
        member.safe = True
        members.append(member)

    suggestions = bstools.get_suggestions(config, members,
                                          __fake_club__.required_trophies)

    assert len(suggestions) == 1
    assert suggestions[-1] == config['strings']['suggestionNone']
    war_incomplete.collection_battle_wins = 2
    war_incomplete.collection_battle_losses = 0
    assert calc.get_war_score(war_incomplete) == -26

    war_na = WarParticipation(config=config, member=ProcessedMember(__fake_member_list__[4]), war=__fake_war__)
    assert calc.get_war_score(war_na)         == -1

    war_new = WarParticipation(config=config, member=ProcessedMember(__fake_member_list__[4]), war=__fake_war__)
    war_new.status = 'not-in-Club'
    assert calc.get_war_score(war_new)        == 0

def test_donations_score(tmpdir):
    config_file = tmpdir.mkdir('test_donations_score').join('testfile')
    config_file.write(__config_file_score__)
    config = load_config_file(config_file.realpath())

    calc = ScoreCalculator(config)

    war = ProcessedCurrentWar(config=config, current_war=pybrawl.WarCurrent(state='notInWar'))
    member_history = history.get_member_history(__fake_member_list__, config['bstools']['timestamp'], '{}', war)
    date = datetime(2019, 2, 12, 7, 32, 1, 0)

    member_6 = MemberFactory(config=config, current_war=war, Club=__fake_club__, member_history=member_history, warlog=pybrawl.WarLog(items=[]), days_from_donation_reset=6).get_processed_member(__fake_member_list__[0])
    member_3 = MemberFactory(config=config, current_war=war, Club=__fake_club__, member_history=member_history, warlog=pybrawl.WarLog(items=[]), days_from_donation_reset=3).get_processed_member(__fake_member_list__[0])
    member_0 = MemberFactory(config=config, current_war=war, Club=__fake_club__, member_history=member_history, warlog=pybrawl.WarLog(items=[]), days_from_donation_reset=0).get_processed_member(__fake_member_list__[0])

    assert calc.get_member_donations_score(member_6) == 11
    assert calc.get_member_donations_score(member_3) == 18
    assert calc.get_member_donations_score(member_0) == 31

def build_dashboard(config):  # pragma: no coverage
    """Compile and render Club dashboard, get club via player."""
    print('- info: requesting info for Club id: {}'.format(
        config['api']['club_id']))

    api = ApiWrapper(config)
    club = api.get_club_from_api()

    # Create temporary directory. All file writes, until the very end,
    # will happen in this directory, so that no matter what we do, it
    # won't hose existing stuff.
    tempdir = tempfile.mkdtemp(config['paths']['temp_dir_name'])
    # Putting everything in a `try`...`finally` to ensure `tempdir` is removed
    # when we're done. We don't want to pollute the user's disk.
    try:
        output_path = os.path.expanduser(config['paths']['out'])

        # process data from API
        club_processed = ProcessedClub(club, config)
        players_processed = process_players(config, club)

        member_history = history.get_member_history(
            club.members, config['bstools']['timestamp'],
            io.get_previous_history(output_path))
        members_processed = process_members(config, club, member_history)
        former_members = process_absent_members(config,
                                                member_history['members'])

        io.parse_templates(
            config, member_history, tempdir, club_processed, members_processed,
            players_processed, former_members,
            get_suggestions(config, members_processed,
                            club_processed.required_trophies),
            get_scoring_rules(config))

        if (config['bstools']['debug'] == True):
            # archive outputs of API for debugging
            io.dump_debug_logs(
                tempdir, {
                    'club': club.to_dict(),
                    'club-processed': club_processed,
                    'players-processed': players_processed,
                    'members-processed': members_processed,
                    'former-members': former_members,
                })

        # if fankit is previously downloaded, it will copy fankit. Otherwise,
        # if fankit is enabled, it will download it.
        fankit.get_fankit(tempdir, output_path, config['paths']['use_fankit'])

        io.copy_static_assets(tempdir, config['paths']['club_logo'],
                              config['paths']['favicon'])

        io.move_temp_to_output_dir(tempdir, output_path)

        # TODO discord.trigger_webhooks(config, members_processed)
        #specialization_object = Specialization.objects.get(name="My Test Specialization")

    # except Exception as e:
    #     logger.error('Error bstools: {}'.format(e))
    except Exception as e:
        print(traceback.format_exc())

    finally:
        # Ensure that temporary directory gets deleted no matter what
        shutil.rmtree(tempdir)