Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Job 192 : several call octopod when there are more than 50 projects #196

Merged
merged 3 commits into from
Nov 30, 2017

Conversation

trollepierre
Copy link
Collaborator

No description provided.

Copy link
Contributor

@VictorEnaud VictorEnaud left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le commit "Linter is my friend" devrait être squashé avec le précédent, il n'a pas de raison d'être
Les messages de commits ont toujours un espace en trop devant le ":", car en anglais.

return project.kind === 'cost_reimbursable' || project.kind === 'fixed_price';
}

function filterProjectByStatusAndKind(projects) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pourquoi cette fonction publique est au milieu de fonctions privée ?
Pas de convention d'ordre comme en java (fonctions publiques puis privées) ?
D'ailleurs, pourquoi cette fonction est publique ?
Elle ne m'a l'air d'être utilisée qu'ici

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Elle est privée => hop un underscore
En Javascript, on a : "pas d'appels de fonctions pas encore définies dans le fichier", c'est-à-dire l'inverse. On pourrait retirer cette config du linter.
Mais elle est là pour une raison : (je te laisse lire)
https://eslint.org/docs/rules/no-use-before-define

.filter(project => _isStatusWantedOnJobBoard(project))
.filter(project => _isKindOfProjectWantedOnJobBoard(project));
}

async function _fetchAndCacheJobs() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est une fonction privée, pourtant elle est exportée.
Tout comme _compareFetchedAndCachedJobs
Pourquoi ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

car testée indépendamment.

Je pense qu'un gros refacto doit être réalisée dans ces fichiers pour faire apparaître un fichier qui contient _compareFetchedAndCachedJobs et _fetchAndCacheJobs

Je n'ai pas encore de meilleures solutions, donc je ne l'ai pas encore mis en place.

@@ -29,20 +29,19 @@ const OctopodClient = {
});
},

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Commentaire général sur ce fichier : pourquoi est-il appelé octopod.js alors que quand tu l'importes tu nommes ta variable octopodClient ?
=> to rename octopod-client.js

|| project.status === 'mission_accepted'
|| project.status === 'proposal_sent';
async fetchProjectsToBeStaffed(accessToken, projects = [], page = 1) {
if (projects.length === 100 * (page - 1)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Magic numbers

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const MAX_NUMBER_OF_PROJECTS_BY_OCTOPOD_PAGE = 100;

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

const hasMoreProjectsOnOctopodApi = projects.length === MAX_NUMBER_OF_PROJECTS_BY_OCTOPOD_PAGE * (page - 1);

return new Promise((resolve, reject) => {
const options = {
url: `${config.OCTOPOD_API_URL}/v0/projects?staffing_needed=true&page=1&per_page=50`,
url: `${config.OCTOPOD_API_URL}/v0/projects?staffing_needed=true&page=${page}&per_page=100`,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Magic number

const allProjects = projects.concat(moreProjects);
return this.fetchProjectsToBeStaffed(accessToken, allProjects, page + 1);
}
return projects;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tu as déporté le filtrage dans le service, pour pouvoir importer tous les projets.
Mais tu pourrais filtrer ici.
Donc fondamentalement, qui porte la responsabilité de filtrer les projets ? OctopodClient qui te sert pour consommer l'api ou ton service qui est censé porter ton métier ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

c'est une règle métier, c'est pour cela que je l'ai renvoyé vers le service

callback(null, httpResponse);
});
});
describe('#fetchProjectsToBeStaffedPerPage', () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nope, ce n'est pas cette fonction que tu testes, c'est #fetchProjectsToBeStaffed


it('should call Octopod API "GET /projects"', () => {
describe('when there are more than 100 projects', () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pas de test de quand il y en a moins de 100 ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

avec la récurrence, c'est déjà testé. Donc j'ai pu retirer l'ancien test

});


describe('#fetchProjectsToBeStaffedPerPage', () => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personnellement, ça me dérange de tester directement cette fonction.
Elle devrait être privée, car elle n'est publique que pour les tests.

Tu pourrais la tester dans le describe supérieur, en appelant sa fonction mère fetchProjectsToBeStaffed
Là tu as un couplage fort avec ton code.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oui. J'avais commencé à faire cela.
Néanmoins, c'était très douloureux, et je n'ai pas réussi à le faire simplement.

C'est pour cela que j'ai sorti deux méthodes.

J'ai pensé à sortir ce bout de code, dans un autre fichier, mais je trouve que ce code doit rester ici.

il y a deux features ici : récupérer les résultats de l'api par page, et fixer le cas où j'ai plus de 100 requêtes.

Je n'ai pas de meilleures solutions actionnables facilement. Je laisse ça.
Mais je demanderai bien à un TL JS son avis ! ;-)

@coveralls
Copy link

Coverage Status

Changes Unknown when pulling 36abb56 on JOB-192 into ** on dev**.

@coveralls
Copy link

Coverage Status

Changes Unknown when pulling e8922f5 on JOB-192 into ** on dev**.

@trollepierre trollepierre merged commit c155f8c into dev Nov 30, 2017
@trollepierre trollepierre deleted the JOB-192 branch November 30, 2017 11:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants