Skip to content

Commit

Permalink
support player with the same realm on different realms, unit test fix…
Browse files Browse the repository at this point in the history
…es + spread lust logic fixes
  • Loading branch information
devi4nt committed Nov 18, 2024
1 parent d93f52d commit 0f56f72
Show file tree
Hide file tree
Showing 13 changed files with 411 additions and 144 deletions.
5 changes: 4 additions & 1 deletion src/components/PlayerList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ const { teams } = storeToRefs(teamsStore);
function onDrop(event: DragEvent) {
const characterName = event.dataTransfer?.getData('characterName');
const member = filteredMembers.value.find((member) => member.character.name === characterName);
const characterRealm = event.dataTransfer?.getData('characterRealm');
const member = filteredMembers.value.find(
(member) => member.character.name === characterName && member.character.realm === characterRealm
);
if (member) {
members.add(member);
} else {
Expand Down
7 changes: 5 additions & 2 deletions src/components/PlayerTeam.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { XMarkIcon } from '@heroicons/vue/20/solid';
const emit = defineEmits<{
(event: 'remove'): void;
(event: 'swap', swapName?: string, target?: Member): void;
(event: 'swap', swapName?: string, swapRealm?: string, target?: Member): void;
}>();
defineProps<{
Expand All @@ -19,11 +19,14 @@ function startDrag(event: DragEvent, member: Member) {
event.dataTransfer.dropEffect = 'move';
event.dataTransfer.effectAllowed = 'move';
event.dataTransfer.setData('characterName', member.character.name);
event.dataTransfer.setData('characterRealm', member.character.realm);
}
}
function onDrop(event: DragEvent, target: Member) {
emit('swap', event.dataTransfer?.getData('characterName'), target);
const characterName = event.dataTransfer?.getData('characterName');
const characterRealm = event.dataTransfer?.getData('characterRealm');
emit('swap', characterName, characterRealm, target);
}
</script>

Expand Down
7 changes: 5 additions & 2 deletions src/components/RosterList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const {
filter,
isFetching,
filteredMembers,
selectedNames
uniquePlayers
} = storeToRefs(members);
function startDrag(event: DragEvent, member: Member) {
Expand All @@ -33,6 +33,7 @@ function startDrag(event: DragEvent, member: Member) {
event.dataTransfer.dropEffect = 'move';
event.dataTransfer.effectAllowed = 'move';
event.dataTransfer.setData('characterName', member.character.name);
event.dataTransfer.setData('characterRealm', member.character.realm);
emit('dragging', true);
}
}
Expand Down Expand Up @@ -75,7 +76,9 @@ function handleTap(event: TouchEvent, member: Member) {
>
<div
class="flex justify-between hover:bg-[#454545] cursor-pointer py-1 rounded-sm"
:class="{ 'opacity-50': selectedNames.has(member.character.name) }"
:class="{
'opacity-50': uniquePlayers.has(`${member.character.name}-${member.character.realm}`)
}"
v-for="(member, index) in filteredMembers"
:key="index"
:draggable="true"
Expand Down
12 changes: 9 additions & 3 deletions src/components/TeamList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,15 @@ const { teams } = storeToRefs(teamsStore);
const config = useConfigStore();
const { region, realm, guild } = storeToRefs(config);
function swap(swapName?: string, destination?: Member) {
function swap(name?: string, realm?: string, destination?: Member) {
const team = teams.value.find((team) =>
team.members.find((member) => member.character.name === swapName)
team.members.find(
(member) => member.character.name === name && member.character.realm === realm
)
);
const source = team?.members.find(
(member) => member.character.name === name && member.character.realm === realm
);
const source = team?.members.find((member) => member.character.name === swapName);
teamsStore.swap(team, source, destination);
}
Expand All @@ -41,6 +45,7 @@ function share() {
rank: member.rank,
character: {
name: member.character.name,
realm: member.character.realm,
class: member.character.class,
active_spec_name: member.character.active_spec_name,
active_spec_role: member.character.active_spec_role
Expand All @@ -59,6 +64,7 @@ function share() {
rank: member.rank,
character: {
name: member.character.name,
realm: member.character.realm,
class: member.character.class,
active_spec_name: member.character.active_spec_name,
active_spec_role: member.character.active_spec_role
Expand Down
7 changes: 4 additions & 3 deletions src/components/__tests__/PlayerTeam.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ import { describe, it, expect } from 'vitest';

import { mount } from '@vue/test-utils';
import PlayerTeam from '../PlayerTeam.vue';
import { mockTeam } from '../../data/__mocks__/mock-team';
import { mockTeams } from '../../data/__mocks__/mock-team';

describe('PlayerTeam', () => {
it('renders team', () => {
const [team] = mockTeams({ amount: 1 });
const wrapper = mount(PlayerTeam, {
props: { index: 0, ...mockTeam }
props: { index: 0, ...team }
});
const html = wrapper.html();
for (const member of mockTeam.members) {
for (const member of team.members) {
expect(html).toContain('Team 1');
expect(html).toContain(member.character.name);
expect(html).toContain(member.character.class);
Expand Down
12 changes: 11 additions & 1 deletion src/data/__mocks__/mock-guild-profile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ export const mockGuildProfile: GuildProfile = {
name: 'Blank Slate',
faction: 'Horde',
region: 'EU',
realm: 'connected-quelthalas',
realm: 'realm-name',
last_crawled_at: '',
profile_url: '',
members: [
{
rank: 0,
character: {
name: 'Shamong',
realm: 'realm-name',
class: 'Shaman',
active_spec_name: 'Restoration',
active_spec_role: 'HEALING'
Expand All @@ -21,6 +22,7 @@ export const mockGuildProfile: GuildProfile = {
rank: 1,
character: {
name: 'Quelish',
realm: 'realm-name',
class: 'Priest',
active_spec_name: 'Shadow',
active_spec_role: 'DPS'
Expand All @@ -30,6 +32,7 @@ export const mockGuildProfile: GuildProfile = {
rank: 1,
character: {
name: 'Magemong',
realm: 'realm-name',
class: 'Mage',
active_spec_name: 'Fire',
active_spec_role: 'DPS'
Expand All @@ -39,6 +42,7 @@ export const mockGuildProfile: GuildProfile = {
rank: 1,
character: {
name: 'Omnivoker',
realm: 'realm-name',
class: 'Evoker',
active_spec_name: 'Augmentation',
active_spec_role: 'DPS'
Expand All @@ -48,6 +52,7 @@ export const mockGuildProfile: GuildProfile = {
rank: 1,
character: {
name: 'Kengoh',
realm: 'realm-name',
class: 'Shaman',
active_spec_name: 'Enhancement',
active_spec_role: 'DPS'
Expand All @@ -57,6 +62,7 @@ export const mockGuildProfile: GuildProfile = {
rank: 1,
character: {
name: 'Devølutiøn',
realm: 'realm-name',
class: 'Demon Hunter',
active_spec_name: 'Vengeance',
active_spec_role: 'TANK'
Expand All @@ -66,6 +72,7 @@ export const mockGuildProfile: GuildProfile = {
rank: 2,
character: {
name: 'Flipe',
realm: 'realm-name',
race: 'Blood Elf',
class: 'Paladin',
active_spec_name: 'Holy',
Expand All @@ -76,6 +83,7 @@ export const mockGuildProfile: GuildProfile = {
rank: 2,
character: {
name: 'Vorlix',
realm: 'realm-name',
race: 'Blood Elf',
class: 'Mage',
active_spec_name: 'Fire',
Expand All @@ -86,6 +94,7 @@ export const mockGuildProfile: GuildProfile = {
rank: 2,
character: {
name: 'Devolutíon',
realm: 'realm-name',
race: 'Highmountain Tauren',
class: 'Druid',
active_spec_name: 'Balance',
Expand All @@ -96,6 +105,7 @@ export const mockGuildProfile: GuildProfile = {
rank: 2,
character: {
name: 'Palut',
realm: 'realm-name',
race: 'Tauren',
class: 'Paladin',
active_spec_name: 'Protection',
Expand Down
52 changes: 52 additions & 0 deletions src/data/__mocks__/mock-members.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import type { ClassRole, ClassSpec, ClassType, Member } from 'src/types';
import { classSpecLust, classSpecRole, classSpecs } from '../specs';
import { shuffle } from '../../utils/array';

export const mockMembers = ({
amount,
classFilter,
specFilter,
roleFilter,
includeLust
}: {
amount?: number;
classFilter?: ClassType;
specFilter?: ClassSpec;
roleFilter?: ClassRole;
includeLust?: boolean;
} = {}) => {
const members: Member[] = [];

for (const cls of Object.keys(classSpecs)) {
const roles = classSpecRole[cls as keyof typeof classSpecRole];
for (const [spec, role] of Object.entries(roles)) {
if (classFilter && cls !== classFilter) continue;
if (specFilter && spec !== specFilter) continue;
if (roleFilter && role !== roleFilter) continue;
if (
typeof includeLust !== 'undefined' &&
includeLust !== classSpecLust[cls as keyof typeof classSpecLust]
)
continue;
members.push({
rank: 4,
character: {
name: `${spec} ${cls}`,
realm: 'realm-name',
class: cls as ClassType,
active_spec_name: spec as ClassSpec,
active_spec_role: role as ClassRole
}
});
}
}

if (amount && amount > members.length) {
throw new Error('amount is greater than the number of members');
}

// shuffle members
shuffle(members);

return amount ? members.slice(0, amount) : members;
};
63 changes: 14 additions & 49 deletions src/data/__mocks__/mock-team.ts
Original file line number Diff line number Diff line change
@@ -1,52 +1,17 @@
import type { Team } from '../../types';
import { mockMembers } from './mock-members';

export const mockTeam: Team = {
id: 'team-one',
members: [
{
rank: 1,
character: {
name: 'Devølutiøn',
class: 'Demon Hunter',
active_spec_name: 'Vengeance',
active_spec_role: 'TANK'
}
},
{
rank: 1,
character: {
name: 'Quelish',
class: 'Priest',
active_spec_name: 'Shadow',
active_spec_role: 'DPS'
}
},
{
rank: 1,
character: {
name: 'Magemong',
class: 'Mage',
active_spec_name: 'Fire',
active_spec_role: 'DPS'
}
},
{
rank: 1,
character: {
name: 'Omnivoker',
class: 'Evoker',
active_spec_name: 'Augmentation',
active_spec_role: 'DPS'
}
},
{
rank: 0,
character: {
name: 'Shamong',
class: 'Shaman',
active_spec_name: 'Restoration',
active_spec_role: 'HEALING'
}
}
]
export const mockTeams = ({ amount }: { amount: number }) => {
const teams: Team[] = [];
for (let i = 0; i < amount; i++) {
teams.push({
id: `team-${i}`,
members: [
...mockMembers({ amount: 1, roleFilter: 'TANK' }),
...mockMembers({ amount: 3, roleFilter: 'DPS' }),
...mockMembers({ amount: 1, roleFilter: 'HEALING' })
]
});
}
return teams;
};
Loading

0 comments on commit 0f56f72

Please sign in to comment.